这里写自定义目录标题
1. springboot项目集成mongodb
这里默认前提是安装并启动了mongoDB服务,安装教程参考:mongoDB7.0.6版安装与使用(最新版踩坑记录)
1.1 Maven添加依赖
在pox.xml文件中添加spring-boot-starter-data-mongodb引用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.2 配置连接参数
一般都配置到nacos服务中,我这里在bootstrap.yml配置,配置时要注意缩进!通过上面两个步骤springBoot集成MongoDB环境就已经搭建好了,下面开始写代码。
2. 代码实现增删改查
2.1 创建实体类
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的常用命令也一并略过。
2.2 dao层、service层、controller层代码
Dao层一般就是通过注入MongoTemplate来实现实体对象的增删改查操作,但是如果有很多实体对象,每个都写一遍CRUD就很麻烦,我们先写一个通过反射生成的基类Dao,实现对象的save/delete/queryall/queryone/update/upsert等方法。
//以下是简化的代码,根据类名可以搜到更全的。。。public abstract classMongoDbDao<T>{protected Logger logger = LoggerFactory.getLogger(MongoDbDao.class);/**
* 反射获取泛型类型
*
* @return
*/protected abstract Class<T>getEntityClass();
@Autowired
private MongoTemplate mongoTemplate;/***
* 保存一个对象
* @param t
*/publicvoidsave(T t){
logger.info("-------------->MongoDB save start");this.mongoTemplate.save(t);}// 还有其他方法省略了}
然后在不同的业务场景下继承该类MongoDbDao,通过泛型和反射获取到正在操作的实体类。
本文中用的userTest实体对应的dao文件如下:
@Repository
public class UserTestMongoDbDao extends MongoDbDao<UserTest> {
@Override
protected Class<UserTest> 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 List<UserTest> findAll() {
System.out.println("--------------------->[MongoDB save start]");
return userTestMongoDbDao.queryList(new UserTest());
}
}
controller代码:
@RestController
publicclassmongoController{
@Autowired
private MongoDbService mongoDbService;
@PostMapping("/mongo/save")public String saveObj(@RequestBody UserTest user){return mongoDbService.saveObj(user);}
@GetMapping("/mongo/findAll")public List<UserTest>findAll(){return mongoDbService.findAll();}
2.3 接口测试(postman)
注意:
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工具直接看。
3. 思考:为什么要集成mongoDB, 哪些业务场景适合切到mongoDB?
如果是小型项目,可以直接切换到mongoDB,但是对于规模较大的项目==(用户量用户超过3-5万算大吗这个标准不确定啊)== 肯定离不开关系型数据库。那么问题来了,对于一个使用了关系型数据库进行开发且已上线的信息化系统,哪些业务适合切到monggoDB进行处理呢?
可能不同的业务场景需要考虑多种因素,对于笔者的信息化系统来说,我想到了以下几个场景可能适合(
尚未测试验证
):
- 批量插入数据,数据量较多出现卡顿的情况, 可以把数据先存入mongDB,然后通过定时任务把数据移动到原关系型业务数据库;
- 日志存储:日志不涉及事务且数据量较大,可以考虑全存入mongDB,无需同步;
- 文件管理:系统的文件、照片、视频等非结构化数据,可以考虑全存入mongDB。
希望有经验的朋友给提点一下,这三个场景切换到mongo能提升性能吗,还有其他场景适合做切换吗,做过类似测试的大神请留下您的宝贵经验!我也会继续做各种数据测试对这个想法进行验证
版权归原作者 不要冗余 所有, 如有侵权,请联系我们删除。