springboot集成MongoDB

springboot集成spring-data数据库的三步骤:

  1. pom引入jar包
  2. yml添加连接配置
  3. 书写代码,注入XXXTemplate调用数据库的api 或者 使用JPA集成操作

第一步:pom引入jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

第二步:yml添加配置

spring:
  data:
    mongodb:
      database: mymongo
      port: 27017
      host: 127.0.0.1

第三步:书写代码

定义文档实体

@Data
@Document("col00")
public class Document01 {
    private String _id;
    private String name;
    private Integer age;
    private String status;
    private List<String> permissions;
}
// 视图类 可以没有
@Data
public class Document01Vo implements Serializable {
    private String _id;
    private String name;
    private Integer age;
    private String status;
    private List<String> permissions;
}

注意:在文档类定义时如果没有使用@Document(“col00”)指定集合,默认会寻找文档类类名首字母小写的集合,即使集合不存在也不会报异常。

# 开发时在yml添加日志配置
logging:
  level:
    org .springframework.data.mongodb.core: debug

# 做一次mongodb查询 会看到以下日志
find using query: {} fields: Document{{}} for class: class com.example.demo.mongo.bean.Document01 in collection: document01

mongoTemplate提供的api复杂而灵活,完全掌握需要仔细研究,使用mongoTemplate的crud基本操作示例如下:

public interface MongoService {
    /**
     * 插入文档
     *
     * @param document01Vo 文档
     * @return Object
     */
    Object insertOne(Document01Vo document01Vo);

    /**
     * 批量插入文档
     *
     * @param document01Vos 文档
     * @return Object
     */
    Object insertMany(List<Document01Vo> document01Vos);

    /**
     * 更新一个文档
     *
     * @param id           文档id
     * @param document01Vo 文档
     * @return Object
     */
    Object updateOne(String id, Document01Vo document01Vo);

    /**
     * 删除一个文档
     *
     * @param id 文档id
     * @return Object
     */
    Object deleteOne(String id);

    /**
     * 根据id一个文档
     *
     * @param id 文档id
     * @return Object
     */
    Object findOne(String id);

    /**
     * 分页查询
     *
     * @param document01Vo 查询参数
     * @param index        页数
     * @param size         每页的数目
     * @return Object
     */
    Object findByPage(Document01Vo document01Vo, int index, int size);
}

@Service
public class MongoServiceImpl implements MongoService {
    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public Object insertOne(Document01Vo document01Vo) {
        Document01 document = JSON.parseObject(JSON.toJSONString(document01Vo), Document01.class);
        // mongo插入数据可以选择insert或者save方法
        return mongoTemplate.insert(document);
//        return mongoTemplate.save(document);
    }

    @Override
    public Object insertMany(List<Document01Vo> document01Vos) {
        List<Document01> documents = JSON.parseArray(JSON.toJSONString(document01Vos), Document01.class);
        // 批量插入不能用save() insert()
        return mongoTemplate.insertAll(documents);
    }

    @Override
    public Object updateOne(String id, Document01Vo document01Vo) {
        Document01 document = JSON.parseObject(JSON.toJSONString(document01Vo), Document01.class);
        document.set_id(id);
//        // save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入
//        return mongoTemplate.save(document);


//        // findAndReplace()方法通过传入的文档来替换已有文档, _id 主键存在就更新,不存在不操作
//        Query query = new org.springframework.data.mongodb.core.query.Query();
//        query.addCriteria(Criteria.where("_id").is(id));
//        return mongoTemplate.findAndReplace(query, document);

//        // updateFirst() 使用UpdateDefinition指定要更新的key,_id 主键存在就更新,不存在不操作
//        Query query = new org.springframework.data.mongodb.core.query.Query();
//        query.addCriteria(Criteria.where("_id").is(id));
//        Update update = new Update();
//        update.set("status", document01Vo.getStatus());
//        return mongoTemplate.updateFirst(query, update, Document01.class);

        // upsert() 使用UpdateDefinition指定要更新的key,_id 主键存在就更新,不存在就插入 插入的文档只保留UpdateDefinition指定的key
        Query query = new org.springframework.data.mongodb.core.query.Query();
        query.addCriteria(Criteria.where("_id").is(id));
        Update update = new Update();
        update.set("status", document01Vo.getStatus());
        return mongoTemplate.upsert(query, update, Document01.class);
    }

    @Override
    public Object deleteOne(String id) {
        Query query = new org.springframework.data.mongodb.core.query.Query();
        query.addCriteria(Criteria.where("_id").is(id));
        return mongoTemplate.remove(query, Document01.class);
    }

    @Override
    public Object findOne(String id) {
//        return mongoTemplate.findById(id, Document01.class);

        Query query = new org.springframework.data.mongodb.core.query.Query();
        query.addCriteria(Criteria.where("_id").is(id));
        return mongoTemplate.findOne(query, Document01.class);
    }

    @Override
    public Object findByPage(Document01Vo document01Vo, int index, int size) {
        // 查询条件拼接(条件拼接注意数据类型,比如:数据库的类型是number 如果is()传入了字符串类型不会编译报错,但会查询不到数据)
        Criteria criteria = new Criteria();
        if (null != document01Vo.getName() && !"".equals(document01Vo.getName())) {
            criteria.and("name").is(document01Vo.getName());
        }
        if (null != document01Vo.getAge()) {
            criteria.and("age").is(document01Vo.getAge());
        }
        Query query = new org.springframework.data.mongodb.core.query.Query(criteria);
        // 查询总数
        long amount = mongoTemplate.count(query, Document01.class);
        // 查询获取第n页
        query.with(Sort.by(Sort.Direction.DESC, "name")); // 排序
        query.with(Pageable.ofSize(size <= 0 ? 10 : size).withPage(index <= 0 ? 0 : index - 1)); // 分页
        List<Document01> document01s = mongoTemplate.find(query, Document01.class);

        Map<String, Object> pageResult = new HashMap<>();
        pageResult.put("index", index);
        pageResult.put("size", size);
        pageResult.put("amount", amount);
        pageResult.put("records", document01s);
        return pageResult;
    }
}