mongoDb是一款文档数据库,相比较于redis,在mongoDb中存储的数据可以实现更多复杂条件筛选的操作,当然redis也可以使用lua脚本实现但是也不是很方便mongoDb的数据类型就是json格式的,集合名就相当于表名,行就相当于一条json串,多条就相当于多条json串,查询所有就相当于是一个json数组,更多关于mongodb数据库操作的可以在度娘找找。
springBoot集成mongoDb也比较简单,很多操作和配置springBoot都已经约定好了,我们只管开箱即用,这也是springBoot的优势所在。
目录
1、在docker下安装mongoDb
安装mongoDb的方法请看以下文章
2、添加mongoDb数据库操作依赖
<!--引入mongoDb支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
3、添加springBoot连接mongoDb数据库配置信息
其他配置信息省略了,可以在码云上面查看完整的配置
Srping: ...... data: mongodb: host: apg-server username: tester password: tester port: 27017 database: test
4、创建mongoDb映射的实体类
- MongoUser 用户实体类
- MongoRole 角色实体类
MongoUser 用户类
- @Document(collection = "user") 此注解对应mongoDb中的集合名称
- @Id 此注解对应mongoDb中的_id字段
- @Field("user_name") 此注解对应mongoDb json串的key值
- 如果和json名称一致可以不用加别名
package com.apgblogs.springbootstudy.entity; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.data.mongodb.core.mapping.Field; import java.io.Serializable; import java.util.List; /** * @author xiaomianyang * @description * @date 2019-06-30 18:26 */ @Document(collection = "user") public class MongoUser implements Serializable { @Id private String id; @Field("user_name") private String userName=null; private String note=null; @Field("roles") private List<MongoRole> roleList=null; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public List<MongoRole> getRoleList() { return roleList; } public void setRoleList(List<MongoRole> roleList) { this.roleList = roleList; } }
MongoRole类 (这里的role在mongoDb中没有对应的集合,所以没加document注解)
package com.apgblogs.springbootstudy.entity; import org.springframework.data.mongodb.core.mapping.Field; /** * @author xiaomianyang * @description * @date 2019-06-30 18:28 */ public class MongoRole { private String id; @Field("role_name") private String roleName=null; private String note=null; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getRoleName() { return roleName; } public void setRoleName(String roleName) { this.roleName = roleName; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } }
5、创建mongoDbRepository类,用来增删改查的操作
6、创建mongoDb业务层,基于MongoTemplate做增删改查操作
以下的业务类主要使用了MongoTemplate增删改查操作,也可以使用MongoDbUserRepository实现,方法都是类似的。
package com.apgblogs.springbootstudy.service; import com.apgblogs.springbootstudy.entity.MongoUser; import com.apgblogs.springbootstudy.repository.MongoDbUserRepository; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; import java.util.List; /** * @author xiaomianyang * @description * @date 2019-06-30 18:32 */ @Service public class MongoUserServiceImpl { @Autowired private MongoTemplate mongoTemplate=null; @Autowired private MongoDbUserRepository mongoDbUserRepository; /** * @description 通过objectId查询用户 * @author xiaomianyang * @date 2019-07-01 09:57 * @param [id] * @return com.apgblogs.springbootstudy.entity.MongoUser */ public MongoUser getUser(String id){ return mongoDbUserRepository.findById(id).get(); // return mongoTemplate.findById(id,MongoUser.class); // Criteria criteria=Criteria.where("user_name").is(id); // Query query=Query.query(criteria); // return mongoTemplate.findOne(query,MongoUser.class); } /** * @description 通过筛选条件查询用户 * @author xiaomianyang * @date 2019-07-01 09:57 * @param [userName, note, skip, limit] * @return java.util.List<com.apgblogs.springbootstudy.entity.MongoUser> */ public List<MongoUser> findUser(String userName,String note,int skip,int limit){ Criteria criteria=Criteria.where("userName").regex(userName) .and("note").regex(note); Query query=Query.query(criteria).limit(limit).skip(skip); List<MongoUser> mongoUserList=mongoTemplate.find(query,MongoUser.class); return mongoUserList; } /** * @description 保存用户 * @author xiaomianyang * @date 2019-07-01 09:58 * @param [mongoUser] * @return void */ public MongoUser saveUser(MongoUser mongoUser){ MongoUser mongoUser1=mongoTemplate.save(mongoUser); return mongoUser1; } /** * @description 通过Id删除用户 * @author xiaomianyang * @date 2019-07-01 10:24 * @param [id] * @return com.mongodb.client.result.DeleteResult */ public DeleteResult deleteUser(String id){ Criteria criteria=Criteria.where("id").is(id); Query query=Query.query(criteria); DeleteResult deleteResult=mongoTemplate.remove(query,MongoUser.class); return deleteResult; } /** * @description 更新用户 * @author xiaomianyang * @date 2019-07-01 10:28 * @param [id, userName, note] * @return com.mongodb.client.result.UpdateResult */ public UpdateResult updateUser(String id,String userName,String note){ Criteria criteria=Criteria.where("id").is(id); Query query=Query.query(criteria); Update update=Update.update("userName",userName); update.set("note",note); UpdateResult updateResult=mongoTemplate.updateFirst(query,update,MongoUser.class); return updateResult; } }
7、在springBoot测试类中,编写测试用例
这里的测试用例有通过条件查询,也有新增,更新,删除等操作,可以直接测试
@Test public void getMongoUser(){ logger.info("mongoDb用户{}",new Gson().toJson(mongoUserService.getUser("1"))); } @Test public void getMongoUserByCondition(){ logger.info("用户{}",new Gson().toJson(mongoUserService.findUser("小绵羊","筑梦师",0,5))); } @Test public void saveMongoUser(){ MongoUser mongoUser=new MongoUser(); mongoUser.setId("1"); mongoUser.setUserName("亚索"); mongoUser.setNote("托儿索"); MongoRole mongoRole=new MongoRole(); mongoRole.setId("3"); mongoRole.setRoleName("中单"); mongoRole.setNote("快乐风男"); List<MongoRole> mongoRoleList=new ArrayList<MongoRole>(); mongoRoleList.add(mongoRole); mongoUser.setRoleList(mongoRoleList); logger.info("新增用户{}",new Gson().toJson(mongoUserService.saveUser(mongoUser))); } @Test public void updateMongoUser(){ UpdateResult updateResult=mongoUserService.updateUser("1","盲僧","瞎子"); logger.info("更新用户{}",updateResult.getModifiedCount()); } @Test public void deleteMongoUser(){ DeleteResult deleteResult=mongoUserService.deleteUser("1"); logger.info("删除用户{}",deleteResult.getDeletedCount()); }
8、查看测试结果
运行新增用户测试用例,出现以下结果
在到mongoDb数据库中看看是否新增成功了
看到以下结果那就成功了,其他的测试用例可以自己试试
9、文章源码地址
https://gitee.com/apgblogs/springBootStudy/tree/MogonDB/
至此,mongoDb就已经集成到springBoot中,是不是很简单呢?其实跟jpa的操作方式类似,也跟其他数据库的crud方式也是类似的,只是数据结构不同而已,有任何疑问欢迎留言。