springBoot集成mongoDb并增删改查

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类,用来增删改查的操作

mongoDb增删改查

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方式也是类似的,只是数据结构不同而已,有任何疑问欢迎留言。

发表评论