4、navicat连接MongoDB
1、打开navicat
2、点击密码验证
3、填写相关信息
4、成功连接
5、MongoDB整合SpringBoot
5.1、环境准备
1、引入依赖
<!--spring data mongodb--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2.配置yml
spring: data: mongodb: uri: mongodb://root:root@101.34.254.161:27017/appdb?authSource=admin #uri等同于下面的配置 #database: appdb #host: 101.34.254.161 #port: 27017 #username: root #password: root #authentication-database: admin
连接配置参考文档:https://docs.mongodb.com/manual/reference/connection-string/
3、在测试类注入mongoTemplate
@Autowired MongoTemplate mongoTemplate;
5.2、集合操作
@Test void contextLoads() { boolean exists = mongoTemplate.collectionExists("emp"); // 删除集合 if (exists) { mongoTemplate.dropCollection("emp"); } // 创建集合 mongoTemplate.createCollection("emp"); }
5.3、文档操作
相关注解
- @Document
- 修饰范围: 用在类上
- 作用: 用来映射这个类的一个对象为mongo中一条文档数据
- 属性:( value 、collection )用来指定操作的集合名称
- @Id
- 修饰范围:用在成员变量、方法上
- 作用 : 用来将成员变量的值映射为文档_id值
- @Field
- 修饰范围: 用在成员变量、方法上
- 作用:用来指定此成员变量不参与文档的序列化
- @Transient
- 修饰范围:用在成员变量、方法上
- 作用:用来指定此成员变量不参与文档的序列化
创建实体
/** * 对应emp集合中的一个文档 */ @Document("emp") @Data @AllArgsConstructor @NoArgsConstructor public class Employee { /** * 映射文档中的_id */ @Id private Integer id; @Field("username") private String name; @Field private int age; @Field private Double salary; @Field private Date birthday; }
添加文档
insert方法返回值是新增的Document对象,里面包含了新增后id的值。如果集合不存在会自动创建集 合。通过Spring Data MongoDB还会给集合中多加一个class的属性,存储新增时Document对应Java中 类的全限定路径。这么做为了查询时能把Document转换为Java类型
添加一条记录:
@Test void addDocTest(){ Employee employee = new Employee(1,"小明",12,23.23,new Date()); mongoTemplate.insert(employee); }
查看数据库发现多了一个字段,是为了我们获取的时候可以装换为Java类型
批量添加
@Test void addDocTest() { Employee employee = new Employee(1, "小明", 12, 23.23, new Date()); mongoTemplate.insert(employee); // sava: _id存在时更新数据 //mongoTemplate.save(employee); // insert: _id存在抛出异常 支持批量操作 List<Employee> list = Arrays.asList( new Employee(2,"张三",15,232.0,new Date()), new Employee(3,"李四",35,122.0,new Date()), new Employee(4,"王五",45,232.0,new Date()), new Employee(5,"赵六",55,2432.0,new Date()), new Employee(6,"张七",75,232.0,new Date()), new Employee(7,"王八",65,2343.0,new Date()) ); mongoTemplate.insert(list,Employee.class); }
5.4、查询文档
Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将 多个方法标准和查询连接起来,方便我们操作查询语句。
查询操作
@Test void testSelect(){ System.out.println("=====查询所有文档====="); //查询所有文档 List<Employee> employeeList = mongoTemplate.findAll(Employee.class); employeeList.forEach(System.out::println); System.out.println("=====根据id查询====="); // 根据id查询 Employee employee = mongoTemplate.findById(1, Employee.class); System.out.println(employee); System.out.println("=====findOne返回第一个文档====="); // 返回第一个文档 Employee one = mongoTemplate.findOne(new Query(), Employee.class); System.out.println(one); System.out.println("=====条件查询====="); // new Query()表示没有条件 // 查询年龄大于等于12的员工 mongoTemplate.find(new Query(Criteria.where("age").gte(12)),Employee.class).forEach(System.out::println); // 查询年龄大于12小于50的员工 new Query(Criteria.where("age").gt(12).lt(50)); // 正则查询(模糊查询) java中正则不需要有// new Query(Criteria.where("name").regex("张")); // and or 多条件查询 // and 查询年龄大于25且姓名包含张的员工 Criteria criteria = new Criteria(); new Query(criteria.andOperator(Criteria.where("age").gt(25),Criteria.where("name").regex("张"))); // or new Query(criteria.orOperator(Criteria.where("age").gt(25),Criteria.where("name").regex("张"))); // sort排序 new Query().with(Sort.by(Sort.Order.desc("age"))); // skip limit分页 new Query().with(Sort.by(Sort.Order.desc("salary"))) // 跳过记录数 .skip(0) // 显示记录数 .limit(4); }
@Test void testJson() { // 使用json字符串方式查询 // 等值查询 // String json = "{name:'张三'}"; // 多条件查询 String json = "{$or:[{age:{$gt:25}},{salary:{$gte:13}}]}"; Query query = new BasicQuery(json); // 结果 mongoTemplate.find(query,Employee.class).forEach(System.out::println); }
5.5、更新文档
在Mongodb中无论是使用客户端API还是使用Spring Data,更新返回结果一定是受行数影响。如果更新后的结果和更新前的结果是相同,返回0。
- updateFirst() 只更新满足条件的第一条记录
- updateMulti() 更新所有满足条件的记录
- upsert() 没有符合条件的记录则插入数据
@Test void testUpdate(){ // query设置查询条件 Query query = new Query(Criteria.where("age").gte(23)); System.out.println("======更新前======"); mongoTemplate.find(query,Employee.class).forEach(System.out::println); Update update = new Update(); // 设置更新属性 update.set("age",23); // updateFirst()只更新满足条件的第一条记录 // UpdateResult updateResult = mongoTemplate.updateFirst(query, update, Employee.class); // updateMulti()更新所有满足 // UpdateResult updateResult = mongoTemplate.updateMulti(query, update, Employee.class); //upsert()没有符合条件的记录则插入数据 //update.setOnInsert("id",11); // 如果是插入的话则指定id UpdateResult updateResult = mongoTemplate.upsert(query, update, Employee.class); // 返回修改的记录数 System.out.println(updateResult.getModifiedCount()); System.out.println("======更新后======"); mongoTemplate.find(query,Employee.class).forEach(System.out::println); }
5.6、删除文档
/** * 删除文档 */ @Test public void testDelete() { //删除所有文档 //mongoTemplate.remove(new Query(),Employee.class); //条件删除 Query query = new Query(Criteria.where("salary").gte(10000)); mongoTemplate.remove(query, Employee.class); }