一、Spring Boot 集成 Mongodb
spring-data-mongodb 提供了 MongoTemplate 与 MongoRepository 两种方式访问mongodb,MongoRepository 操作简单,但 MongoTemplate 更加灵活,我们在项目中可以灵活使用这两种方式操作mongodb。
第一步,引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
第二步,配置 application.properties
spring.data.mongodb.uri=mongodb://192.168.3.100:27017/testdb
第三步,添加实体
添加 @Document
注解,可以把一个实体类映射成一个文档。
添加 @Id
注解,将该属性映射为 mongodb 的 _id 字段。
@Data
@Document("User")
public class User {
@Id
private String id;
private String name;
private Integer number;
private String position;
}
第四步,启动容器和MongoDB客户端
- 若没有安装 mongodb 的镜像,则需要安装镜像,然后执行
docker run <容器名称>
创建一个 mongo 容器,带端口号和其他具体配置的创建请参考 MongoDB学习笔记【part1】概念与安装 。 - 若之前已经创建,则跳过上一步,直接执行
docker start <容器名称>
来启动之前停止运行的容器。 - 启动后执行
docker exec -it <数据库名称> /bin/bash
以守护模式进入容器终端。 - 接着执行
mongosh
进入 mongoDB 客户端。
第五步,添加测试类
@SpringBootTest
class MongodemoApplicationTests {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 1.添加
*/
@Test
public void createUser(){
User user = new User();
user.setName("parker");
user.setNumber(7);
user.setPosition("striker");
User insert_user = mongoTemplate.insert(user);
System.out.println(insert_user);
}
}
第六步,测试成功
template会返回带 _id 的新实体:
User(id=63cba6483a54a937e410d3bd, name=parker, number=7, position=striker)
到 linux 上查看,插入成功。
二、MongoTemplate 的常用方法
方法 | 说明 |
---|---|
mongoTemplate.findAll(User.class); | 查询User文档的全部数据 |
mongoTemplate.findById(, User.class); | 查询User文档id为的数据 |
mongoTemplate.find(query, User.class); | 根据query内的查询条件查询 |
mongoTemplate.upsert(query, update, User.class); | 修改 |
mongoTemplate.remove(query, User.class); | 删除 |
mongoTemplate.insert(User); | 新增 |
Qurey 对象
基本使用方法:创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)。
方法 | 说明 |
---|---|
criteria.and(“key”).is(“条件”); | 精准条件 |
criteria.and(“key”).regex(“条件”); | 模糊条件 |
query.addCriteria(criteria); | 封装条件 |
Criteria gt = Criteria.where(“key”).gt(“条件”); | 大于(需创建新的criteria) |
Criteria lt = Criteria.where(“key”).lt(“条件”); | 小于(需创建新的criteria) |
query.addCriteria(new Criteria().andOperator(gt,lt)); | 封装大于、小于条件 |
query.with(new Sort(Sort.Direction.ASC, “age”). and(new Sort(Sort.Direction.DESC, “date”))) | 排序 |
注:一个query中只能有一个 andOperator() ,若要传多个参数可以传入Criteria数组。
三、使用 MongoTemplate 进行CURD
1.插入一条数据
/**
* 1.添加
*/
@Test
public void createUser(){
User user = new User();
user.setName("parker");
user.setNumber(7);
user.setPosition("striker");
User insert_user = mongoTemplate.insert(user);
System.out.println(insert_user);
}
template会返回带 _id 的新实体。
2.查询所有数据
/**
* 2.查询所有
*/
@Test
public void findAll(){
List<User> list = mongoTemplate.findAll(User.class);
System.out.println(list);
}
3.通过 id 查询
/**
* 3.通过id查询
*/
@Test
public void findById(){
User user = mongoTemplate.findById("63cba6483a54a937e410d3bd", User.class);
System.out.println(user);
}
成功打印数据库中数据 User(id=63cba6483a54a937e410d3bd, name=parker, number=7, position=striker) 。
4.条件查询
/**
* 4.条件查询
*/
@Test
public void findUserList(){
// select * from User where name="parker" and number=7
Query query = new Query(Criteria.where("name").is("parker").and("number").is(7));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
5.模糊查询
/**
* 5.模糊查询
*/
@Test
public void findUserList2(){
// select * from User where name like "park"
//模糊查询的条件
String name = "par";
//构建正则表达式
String regex = String.format("%s%s%s","^.*",name,".*$");
//创建模板,第一个参数为正则表达式对象,第二个参数表示大小写不敏感
Pattern pattern = Pattern.compile(regex,Pattern.CASE_INSENSITIVE);
//查询
Query query = new Query(Criteria.where("name").regex(pattern));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(users);
}
6.分页查询
/**
* 6.分页查询
*/
@Test
public void findUserPage() {
//模拟分页参数构造
int pageNo = 1;
int pageSize = 5;
//模拟条件构造
String name = "";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Query query = new Query(Criteria.where("name").regex(pattern));
//查询
List<User> users = mongoTemplate.find(query.skip((pageNo-1)*pageSize).limit(pageSize),User.class);
System.out.println(users);
}
7.修改
/**
* 7.修改
*/
@Test
public void updateUser(){
//根据id查询
User user = mongoTemplate.findById("63cba6483a54a937e410d3bd", User.class);
//模拟修改值
user.setNumber(15);
user.setPosition("midfield");
//调用方法实现修改
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("number",user.getNumber());
update.set("position",user.getPosition());
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
//返回的upsert对象可以通过getModifiedCount来查看影响的行数
long count = upsert.getModifiedCount();
System.out.println(count);
}
调用的 MongoTemplate 方法为 upsert ,不是 update ,无混淆!upsert 方法返回一个对象,可以通过该对象查看成功修改了多少行。
8.删除
/**
* 8.删除
*/
@Test
public void deleteUser(){
Query query = new Query(Criteria.where("_id").is("63cba6483a54a937e410d3bd"));
DeleteResult deleteResult = mongoTemplate.remove(query, User.class);
//返回的upsert对象可以通过getDeletedCount来查看影响行数
long count = deleteResult.getDeletedCount();
System.out.println(count);
}
remove 方法返回一个对象,可以通过该对象查看成功删除了多少行。