这里默认前提是安装并启动了mongoDB服务,安装教程参考:mongoDB7.0.6版安装与使用(最新版踩坑记录)
在pox.xml文件中添加spring-boot-starter-data-mongodb引用
org.springframework.boot spring-boot-starter-data-mongodb
一般都配置到nacos服务中,我这里在bootstrap.yml配置,配置时要注意缩进!通过上面两个步骤springBoot集成MongoDB环境就已经搭建好了,下面开始写代码。
public class UserTest { @Id private String id; //性别 private String gender; //姓名 private String name; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date updateTime; ...getter ....setter...... }
注意:mongo默认用UTC时区存储时间格式数据,而我们是东八区时间GMT+8,用navicat查看默认时间是UTC的(比系统时间少8小时),所以我加了上述JsonFormat注解,这样查出来的时间跟存入的是一样的,具体怎么修改时区暂不讨论
因篇幅有限,mongoDB的常用命令也一并略过。
Dao层一般就是通过注入MongoTemplate来实现实体对象的增删改查操作,但是如果有很多实体对象,每个都写一遍CRUD就很麻烦,我们先写一个通过反射生成的基类Dao,实现对象的save/delete/queryall/queryone/update/upsert等方法。
//以下是简化的代码,根据类名可以搜到更全的。。。 public abstract class MongoDbDao{ protected Logger logger = LoggerFactory.getLogger(MongoDbDao.class); /** * 反射获取泛型类型 * * @return */ protected abstract Class getEntityClass(); @Autowired private MongoTemplate mongoTemplate; /*** * 保存一个对象 * @param t */ public void save(T t) { logger.info("-------------->MongoDB save start"); this.mongoTemplate.save(t); } // 还有其他方法省略了 }
然后在不同的业务场景下继承该类MongoDbDao,通过泛型和反射获取到正在操作的实体类。
本文中用的userTest实体对应的dao文件如下:
@Repository public class UserTestMongoDbDao extends MongoDbDao{ @Override protected Class getEntityClass() { return UserTest.class; } }
service层即注入dao文件实现具体业务逻辑:
@Service public class MongoDbService { @Autowired private UserTestMongoDbDao userTestMongoDbDao; /** * 保存对象 * @return */ public String saveObj(UserTest user) { System.out.println("--------------------->[MongoDB save start]"); userTestMongoDbDao.save(user); return "添加成功"; } public ListfindAll() { System.out.println("--------------------->[MongoDB save start]"); return userTestMongoDbDao.queryList(new UserTest()); } }
controller代码:
@RestController public class mongoController { @Autowired private MongoDbService mongoDbService; @PostMapping("/mongo/save") public String saveObj(@RequestBody UserTest user) {return mongoDbService.saveObj(user);} @GetMapping("/mongo/findAll") public ListfindAll() {return mongoDbService.findAll();}
注意:
1.Headers选项中要增加Authorization参数,key=Authorization,value需要在登录系统后通过F12控制台查看任意请求的Authorization参数。
2.这里的updateTime参数是获取的系统时间,以下两行代码写到Pre-request Script选项:
updateTime=Math.round(new Date().getTime());
postman.setGlobalVariable(“updateTime”,updateTime);
数据插入成功后可以通过postman发送http://127.0.0.1:8080/eam/mongo/findAll请求查询数据,也可以通过navicat工具直接看。
如果是小型项目,可以直接切换到mongoDB,但是对于规模较大的项目==(用户量用户超过3-5万算大吗这个标准不确定啊)== 肯定离不开关系型数据库。那么问题来了,对于一个使用了关系型数据库进行开发且已上线的信息化系统,哪些业务适合切到monggoDB进行处理呢?
可能不同的业务场景需要考虑多种因素,对于笔者的信息化系统来说,我想到了以下几个场景可能适合(尚未测试验证):
希望有经验的朋友给提点一下,这三个场景切换到mongo能提升性能吗,还有其他场景适合做切换吗,做过类似测试的大神请留下您的宝贵经验!我也会继续做各种数据测试对这个想法进行验证