小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
因未接触MongoDB数据库,而项目中使用MongoDB做数据库, 且选择Spring整合的MongoTemplate,在使用过程遇到一些问题,故记录一下相关的使用
参考资料:
1 MongoTemplate使用
1 添加maven依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.0.4</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.6.RELEASE</version>
</dependency>
2 添加连接配置信息
data:
mongodb:
# uri: mongodb://<username>:<password>@127.0.0.1:27017/test
uri: mongodb://@127.0.0.1:27017/test
3 实体类
@Data
@Document("student")
public class Student {
private String id;
private String username;
private String password;
private Date birthday;
private Date crtTime;
}
4 MongoTemplate的操作
常用方法:
// 1 新增
mongoTemplate.insert(Student.class);
mongoTemplate.save(Student.class);
mongoTemplate.insertAll(new ArrayList<Student>());
// 2 修改
mongoTemplate.update(Student.class);
mongoTemplate.updateFirst(new Query(), new Update(), Student.class);
// 3 删除
mongoTemplate.remove(Student.class);
mongoTemplate.remove(new Query(), Student.class);
mongoTemplate.findAndRemove(new Query(), Student.class);
// 4 查询
mongoTemplate.find(new Query(), Student.class);
mongoTemplate.findById("id", Student.class);
mongoTemplate.findAll(Student.class);
// 5 统计
mongoTemplate.count(new Query(),Student.class);
说明:
-
1 Query对象是一个查询对象,用来封装给所有的条件对象;再创建一个criteria对象,用来封装所有的查询条件(类似通用mapper中的功能)
-
2 精确查询 criteria.and("属性名").is("值"); 模糊条件 criteria.and("属性名").regex("值")
-
3 封装条件 query.addCriteria(criteria)
-
4 创建Criteria对象方法
- 1 直接new对象 Criteria criteria = new Criteria();
- 2 通过Criteria.where()静态方法创建 Criteria.where(“属性名”).is(“值”)
-
5 query对象可以添加多个criteria对象 ,且一个query中只能**有一个andOperator()或OrOperator()**操作.
Query.addCriteria(new Criteria().andOperator(条件一,条件二));
-
6 排序
// 排序规则 // 1 多个排序规则相同时, 可依次添加字段; 不同排序规则,需要在后续添加 query.with(new Sort(Sort.Direction.ASC, "id").and(new Sort(Sort.Direction.ASC, "name"))); // 2 静态方法,定义多个排序器,每个排序只能添加一个字段 query.with(Sort.by( Sort.Order.asc("id"), Sort.Order.desc("name") ));
5 业务处理类
@Service
@Slf4j
public class ConsumerService {
public void demo() {
// 1 查询全部
List<Student> students = mongoTemplate.findAll(Student.class);
System.out.println(students);
// 2 根据id查询
Student student = mongoTemplate.findById("12", Student.class);
System.out.println(student);
// 3 准确查询
Query query = new Query(Criteria
.where("username").is(student.getUsername())
.and("password").gt(student.getPassword());
List<Student> students1 = mongoTemplate.find(query, Student.class);
System.out.println(students1);
// 4 模糊查询
Query query1 = new Query(Criteria.where("username").regex("李白"));
List<Student> students2 = mongoTemplate.find(query1, Student.class);
System.out.println(students2);
// 5 分页查询
int totalCount = (int) mongoTemplate.count(query, Student.class);
int pageNum = 4;
int pageSize = 10;
List<Student> studentList = mongoTemplate.find(query.skip((pageNum - 1) * pageSize).limit(pageSize), Student.class);
System.out.println(studentList);
// 6 修改
Student student1 = new Student();
Query query2 = new Query(Criteria.where("_id").is(student1.getId()));
Update update = new Update();
update.set("username", student1.getUsername());
mongoTemplate.upsert(query2, update, Student.class);
// 7 删除
String id = "1111";
Query query3 = new Query(Criteria.where("_id").is(id));
mongoTemplate.remove(query3, Student.class);
// 8 新增
Student student2 = new Student();
mongoTemplate.insert(student2);
// 9 复杂查询
// 查询用户名为李白的或如果用户名不存在,创建日期为现在的数据
// 排序规则是: 用户名升序排 创建时间降序排
Query query4 = new Query();
query4.addCriteria(new Criteria().orOperator(Criteria.where("username").is("李白"),
Criteria.where("username").is(null).and("ctrTime").is(new Date())
)
);
query4.with(Sort.by(
Sort.Order.asc("username"),
Sort.Order.desc("ctrTime")
));
List<Student> students3 = mongoTemplate.find(query4, Student.class);
System.out.println(students3);
}
}
6 总结
在使用过程中, MongoTemplate的基础功能很容易上手, 但是涉及到多条件查询,涉及复杂的业务就很容易错误,需要细心检查,此外对于排序的使用也需要注意,很容易写错,导致多个排序条件被覆盖没有生效.