org.springframework.boot
spring-boot-starter-data-mongodb
org.springframework.boot
spring-boot-starter-web
org.projectlombok
lombok
上面除了MongoDB还有lombok的依赖
配置文件路径
虚拟机地址;端口号/数据库名称
package com.example.mongodb.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document("User")//指定数据库中的集合(相当于mysql中的表)
public class User {
@Id
private String id;
private String name;
private String email;
private String createDate;
private Integer age;
}
我们应用lombok简化开发@Data帮我们生成get和set方法
@Document("User")//指定数据库中的集合(相当于mysql中的表)
@Id 就是指定这个属性对应MongoDB数据库集合中_id的属性
spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足。
我们在测试类中进行测试
@Test
public void createMg(){
Student student=new Student();
student.setAge(33);
student.setName("DFP_test");
student.setEmail("[email protected]");
Student student1 = mongoTemplate.insert(student);
System.out.println("查询MG的数据:"+student);
}
用MongoTemplate给我们封装好的insert方法我们吧 设置好的数据传入即可
执行程序查看结果控制台输出了我们传入的数据
到linux下的MongoDB查看
输入命令发现成功写入数据
我们插入多几个数据方便做测试结果如下
@Test
public void findMg(){
List studentList = mongoTemplate.findAll(Student.class);
for (Student s:studentList) {
System.out.println("查询的数据:"+s);
}
}
结果
和linux数据库查询到的数据一致
除了要传入id的值也要传入对应实体类的class
@Test
public void findByID(){
Student student = mongoTemplate.findById("620496a5949a122fa0cc3f1f", Student.class);
System.out.println("根据ID查询:"+student);
}
参考上面的图和linux下的数据一致
查询名字为张三并且年龄也是91的数据
@Test
public void findList(){
Query query=new Query(Criteria.where("name").is("张三").and("age").is(91));
List tList = mongoTemplate.find(query, Student.class);
System.out.println("条件查询:"+tList);
}
mongoTemplate.find(query, Student.class)
需要传入2个参数一个是条件构造的对象,另一个就是对于实体类的class
条件构造的对象我们用Query来构建
查询名字包含o的
@Test
public void findLikeList(){
String likeName="o";//自定义的常量
String reges=String.format("%s%s%s", "^.*", likeName, ".*$");//匹配规则
Pattern pattern=Pattern.compile(reges,Pattern.CASE_INSENSITIVE);//正则匹配规则--pattern的常量
Query query =new Query(Criteria.where("name").regex(pattern));
List studentList=mongoTemplate.find(query,Student.class);
for (Student s:studentList) {
System.out.println("模糊查询:"+s);
}
}
还是调用mongoTemplate.find(query,Student.class);方法,传入条件构造的对象
因为我们是要模糊查询,不同于mysql的like方法我们在这要用到正则匹配规则,需要要用到Pattern 来构造模糊条件。
通过String.format创建模糊规则传入Pattern构建 再将构建好 的条件传入Query构造对象。
条件查询带分页,查询email带com条件的分页
@Test
public void findPage(){
Integer page=1;//当前页
Integer pageSize=3;//每页记录
//条件查询
String likeName="com";//自定义的常量
String reges=String.format("%s%s%s", "^.*", likeName, ".*$");//匹配规则
Pattern pattern=Pattern.compile(reges,Pattern.CASE_INSENSITIVE);//正则匹配规则--pattern的常量
Query query =new Query(Criteria.where("email").regex(pattern));
//查询集合记录总数
long count = mongoTemplate.count(query, Student.class);
//分页查询
/**
* query.skip((page - 1) * pageSize) 获取到开始分页的位置下标
* 例如第一页 0*3=0从第0个记录开始
* 例如第二页 1*3=3从下标第三个记录开始
* limit(pageSize)限制每页的记录
*/
List studentList = mongoTemplate.find(query.skip((page - 1) * pageSize).limit(pageSize), Student.class);
System.out.println("记录总数"+count);
for (Student s:studentList) {
System.out.println("分页数据:"+s);
}
}
详细看注释理解
这是要来的数据
@Test
public void updataStudent(){
//查询id
Student byId = mongoTemplate.findById("6204969434c3ed66b12eb658", Student.class);
// 设置值
byId.setName("updataName");
// 保存修改
Query query=new Query(Criteria.where("_id").is(byId.getId()));
Update update=new Update();
update.set("name",byId.getName());
UpdateResult updateResult = mongoTemplate.upsert(query, update, Student.class);
// 获取修改就记录数
long modifiedCount = updateResult.getModifiedCount();
System.out.println("记录数:"+modifiedCount);
}
先根据id查询记录然后设置记录的其他值 这个时候切记不可以直接保存过着插入数据因为没有这样的方法
我们需要通过query设置一个条件构造器并且调用updata的核心包的方法来进行更新操作,还有更多方法详细需要阅读,核心包封装好的方法。
查看结果
@Test
public void delStudent(){
Query query =new Query(Criteria.where("_id").is("6204969434c3ed66b12eb658"));
DeleteResult result=mongoTemplate.remove(query,Student.class);
long deletedCount = result.getDeletedCount();
//=1成功 =0失败
System.out.println("记录数:"+deletedCount);
}
原理同上
结果已经找不到updataNnam的记录了