SpringBoot集成mongodb——增删改查
SpringBoot集成mongodb
spring-data-mongodb,提供了MongoTemplate 与 MongoRepository 两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb ,MongoRepository的缺点是不够灵活,MongoTemplate,正好可以弥补不足。
准备工作:
- 引入相关依赖
- 核心配置文件中配置mongodb地址
- 创建对应的实体类
1.1 引入相关依赖
pom.xml
<!--SpringBoot 集成 MongoDB起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--用于日期的相关依赖-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
1.2 核心配置文件中配置mongodb地址
application.properties
#MongoDB的相关配置
spring.data.mongodb.uri=mongodb://43.142.*1.203:27017/test
1.3 创建对应的实体类
User.java
package com.guo.mongodb.entity;
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document("User") //操作mongodb中对应的集合名称
public class User {
@Id //_id自动生成
private String id;
private String name;
private int age;
private String email;
private String createDate;
}
2 基于MongoTemplate实现增 删 改 查
//注入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
2.1 添加
// 添加操作
@Test
public void create(){
User user = new User();
user.setName("lucy");
user.setAge(18);
user.setEmail("888@qq.com");
User insert = mongoTemplate.insert(user);
System.out.println(insert);
}
/**
* > db.User.find()
* { "_id" : ObjectId("633f91bf8af3283824edb456"), "name" : "lucy", "age" : 18, "email" : "888@qq.com", "_class" : "com.guo.mongodb.entity.User" }
* >
*/
2.2 查询
2.2.1 查询所有
//查询所有的数据
@Test
public void findAll(){
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(all);
}
//[User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]
2.2.2 根据id查询
//根据id查询
@Test
public void findById(){
User user = mongoTemplate.findById("633f91bf8af3283824edb456", User.class);
System.out.println(user);
}
//User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)
2.2.3 条件查询
注意:条件查询的构造器导包别导错了
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
//条件查询
@Test
public void findUserList(){
//name=lucy and age=18
Query query = new Query(
Criteria.where("name").is("lucy")
.and("age").is(18));
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//[User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]
2.2.4 模糊查询
//模糊查询 使用正则表达式
@Test
public void findLikeUserList(){
//name like lucy
String name = "uc";
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> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//[User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]
2.2.5 分页查询
//分页查询
@Test
public void findPageUserList(){
int pageNo = 1;
int pageSize = 3;
String name = "uc";
//条件构造
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));
//分页构建
//查询记录数
long count = mongoTemplate.count(query, User.class);
//分页
List<User> userList = mongoTemplate.find(query.skip((pageNo - 1) * pageSize).limit(pageSize), User.class);
System.out.println(count);
System.out.println(userList);
}
/**
* 1
* [User(id=633f91bf8af3283824edb456, name=lucy, age=18, email=888@qq.com, createDate=null)]
*/
2.3 修改
//修改
@Test
public void updataUser(){
//根据id查询
User user = mongoTemplate.findById("633f91bf8af3283824edb456", User.class);
user.setName("tom");
user.setAge(20);
user.setEmail("666@qq.com");
//调用修改方法
Query query = new Query(Criteria.where("_id").is(user.getId()));
Update update = new Update();
update.set("name",user.getName());
update.set("age",user.getAge());
update.set("email",user.getEmail());
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long modifiedCount = upsert.getModifiedCount();
System.out.println(modifiedCount);
//修改后的查询
User user1 = mongoTemplate.findById("633f91bf8af3283824edb456", User.class);
System.out.println(user1);
}
/**
* 1
* User(id=633f91bf8af3283824edb456, name=tom, age=20, email=666@qq.com, createDate=null)
*/
2.4 删除
根据id指定删除
//删除
@Test
public void deleteUser(){
Query query = new Query(Criteria.where("_id").is("633f91bf8af3283824edb456"));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deletedCount = remove.getDeletedCount();
System.out.println(deletedCount);
}
//1
3 基于MongoRepository实现的增 删 改 查
Spring Data提供了对mongodb,数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了
(1). 创建interface,继承MongoRepository接口
创建一个接口继承另一个接口
UserRepository.java
package com.guo.mongodb.repository;
import com.guo.mongodb.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User,String> {
}
(2). 注入UserRepository
//注入UserRepository
@Autowired
private UserRepository userRepository;
3.1 添加
// 添加操作
@Test
public void create(){
User user = new User();
user.setName("tom");
user.setAge(20);
user.setEmail("666@qq.com");
User save = userRepository.save(user);
System.out.println(save);
User user1 = new User();
user1.setName("lucy");
user1.setAge(18);
user1.setEmail("888@qq.com");
User save1 = userRepository.save(user1);
System.out.println(save1);
}
//User(id=633fb0f592443658da0c9ace, name=tom, age=20, email=666@qq.com, createDate=null)
3.2 查询
//查询所有的数据
@Test
public void findAll(){
List<User> userList = userRepository.findAll();
System.out.println(userList);
}
//[User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null), User(id=633fb0f592443658da0c9ace, name=tom, age=20, email=666@qq.com, createDate=null)]
3.2.1 查询所有
//查询所有的数据
@Test
public void findAll(){
List<User> userList = userRepository.findAll();
System.out.println(userList);
}
//[User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null), User(id=633fb0f592443658da0c9ace, name=tom, age=20, email=666@qq.com, createDate=null)]
3.2.2 根据id查询
//根据id查询
@Test
public void findById(){
User user = userRepository.findById("633fb0cfb0933b4b66cfc69a").get();
System.out.println(user);
}
//User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null)
3.2.3 条件查询
//条件查询
@Test
public void findUserList(){
//name=lucy and age=18
User user = new User();
user.setName("lucy");
user.setAge(18);
Example<User> example = Example.of(user);
List<User> userList = userRepository.findAll(example);
System.out.println(userList);
}
//[User(id=633fb0cfb0933b4b66cfc69a, name=lucy, age=18, email=888@qq.com, createDate=null)]
3.2.4 模糊查询
模糊查询这里需要注意,如果实体中包含多个实体,那么我们在对某个字段做模糊查询的时候,要设置其他字段
不处理
设置,例如下列设置:
//不对age字段处理
.withIgnorePaths("age")
//模糊查询
@Test
public void findLikeUserList(){
/**
* ExampleMatcher.StringMatcher提供了如下枚举
* CONTAINING 匹配包含的字符串
* DEFAULT 默认匹配模式
* ENDING 匹配结尾的字符串
* EXACT 匹配精确的字符串
* REGEX 将字符串视为正则表达式进行匹配
* STARTING 匹配开始的字符串
*/
ExampleMatcher matcher = ExampleMatcher.matching()
//包含模式查询
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
//不对age字段处理
.withIgnorePaths("age")
//这个通过ExampleMatcher.GenericPropertyMatcher.of()方法传入ExampleMatcher.StringMatcher.STARTING来模糊匹配开头的字符串
//.withMatcher("name",ExampleMatcher.GenericPropertyMatcher::startsWith)
//忽略大小写
.withIgnoreCase(true);
User user = new User();
user.setName("U"); //name中包含u
Example<User> userExample = Example.of(user, matcher);
List<User> userList = userRepository.findAll(userExample);
System.out.println(userList);
}
//[User(id=633fda8d7669085de1223571, name=lucy, age=18, email=888@qq.com, createDate=null)]
3.2.5 分页查询
//分页查询
@Test
public void findPageUserList(){
//设置分页参数 0代表第一页
Pageable of = PageRequest.of(0, 3);
User user = new User();
user.setAge(20);
user.setName("tom");
Example<User> userExample = Example.of(user);
Page<User> page = userRepository.findAll(userExample, of);
System.out.println("总数条数:" + page.getTotalElements());
System.out.println("总页数:"+page.getTotalPages());
System.out.println("数据集合:"+page.getContent());
}
/**
* 总数条数:2
* 总页数:1
* 数据集合:[User(id=633fd91ecc7c4b46845a3f23, name=tom, age=20, email=666@qq.com, createDate=null), User(id=633fda8d7669085de1223570, name=tom, age=20, email=666@qq.com, createDate=null)]
*/
3.3 修改
//修改
@Test
public void updataUser(){
//根据id查询
User user = userRepository.findById("633fd91ecc7c4b46845a3f23").get();
System.out.println("修改之前的数据:" + user);
user.setName("mary");
user.setAge(21);
user.setEmail("7979@qq.com");
//save()方法:有id就走修改操作,没有id就走添加操作
User save = userRepository.save(user);
System.out.println("修改后的数据为:" + save);
}
/**
* 修改之前的数据:User(id=633fd91ecc7c4b46845a3f23, name=tom, age=20, email=666@qq.com, createDate=null)
* 修改后的数据为:User(id=633fd91ecc7c4b46845a3f23, name=mary, age=21, email=7979@qq.com, createDate=null)
*/
3.4 删除
这个删除方法没有返回值,这里通过在MongoDB的客户端通过命令进行查询是否删除成功
//删除
@Test
public void deleteUser(){
userRepository.deleteById("633fd91ecc7c4b46845a3f23");
}
/**
* 通过命令查询,程序执行前
* > db.User.find()
* { "_id" : ObjectId("633fd91ecc7c4b46845a3f23"), "name" : "mary", "age" : 21, "email" : "7979@qq.com", "_class" : "com.guo.mongodb.entity.User" }
* { "_id" : ObjectId("633fda8d7669085de1223570"), "name" : "tom", "age" : 20, "email" : "666@qq.com", "_class" : "com.guo.mongodb.entity.User" }
* { "_id" : ObjectId("633fda8d7669085de1223571"), "name" : "lucy", "age" : 18, "email" : "888@qq.com", "_class" : "com.guo.mongodb.entity.User" }
* 程序执行后
* > db.User.find()
* { "_id" : ObjectId("633fda8d7669085de1223570"), "name" : "tom", "age" : 20, "email" : "666@qq.com", "_class" : "com.guo.mongodb.entity.User" }
* { "_id" : ObjectId("633fda8d7669085de1223571"), "name" : "lucy", "age" : 18, "email" : "888@qq.com", "_class" : "com.guo.mongodb.entity.User" }
* >
*/
4. Spring Data规范
Spring Data提供了对mongodb,数据访问的支持,我们只需要继承MongoRepository类,按照Spring Data规范就可以了
查询方法以find|read|get开头,涉及条件查询时,条件的属性用条件关键字连接,要注意的是:条件属性需要首字母大写。
目前支持的关键字写法如下:
(1). 创建interface,继承MongoRepository接口
创建一个接口继承另一个接口
UserRepository.java
(2). 自定义方法需要安装命名规范,只需要创建不需要我们去实现方法,MongoRepository中会根据方法的命名规范帮你实现方法具体的操作.
package com.guo.mongodb.repository;
import com.guo.mongodb.entity.User;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends MongoRepository<User,String> {
//通过hoscode查询数据,并返回类对象
Hospital getHospitalByHoscode(String hoscode);
}