1.集成简介
spring-data-mongodb,提供了MongoTemplate与 MongoRepository,两种方式访问mongodb,MongoRepository,操作简单,MongoTemplate,操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,
MongoTemplate 正好可以弥补不足。
2.搭建开发环境
- 初始化工程
使用Spring Initaalizr 快速初始化一个Spring Boot工程
Group :com.zhoujk
Artifact:mongodb - 引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<optional>true</optional>
</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>
- 添加配置
spring.data.mongodb.uri=mongodb://localhost:27017/test
3.基于MongoBDTeplate开发
- 添加实体
@Data
@Document("User")
public class User {
@Id
private String id;
private String name;
private Integer age;
private String email;
private String createDate;
}
- 实现mongoTemplate
//注入mongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
- 添加测试类
//添加操作
@Test
public void create() {
User user = new User();
user.setName("zhangsan");
user.setAge(20);
user.setEmail("1348571853@qq.com");
User user1 = mongoTemplate.insert(user);
System.out.println(user1);
}
//查询所有的数据
@Test
public void findAll() {
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(all);
}
//id查询
@Test
public void findId() {
User user = mongoTemplate.findById("622747932ea3370da71930fd", User.class);
System.out.println(user);
}
//条件查询
@Test
public void findUserList() {
//查询 name=zhangsan and age =20
Criteria criteria = Criteria.where("name").is("zhangsan").and("age").is(20);
Query query = new Query(criteria);
List<User> users = (List<User>) mongoTemplate.find(query, User.class);
System.out.println(users);
}
//模糊查询
@Test
public void findLikeUserList() {
// 查询名字以"zhang"开头的
String name = "zhang";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Criteria criteria = Criteria.where("name").regex(pattern);
Query query = new Query(criteria);
List<User> users = (List<User>) mongoTemplate.find(query, User.class);
System.out.println(users);
}
//分页查询
@Test
public void findPageUserList() {
int PageNo = 1;
int PageSize = 2;
String name = "zhang";
String regex = String.format("%s%s%s", "^.*", name, ".*$");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Criteria criteria = Criteria.where("name").regex(pattern);
Query query = new Query(criteria);
//分页构建
//查询记录数
long count = mongoTemplate.count(query, User.class);
//分页
List<User> users = mongoTemplate.find(query.skip((PageNo - 1) * PageSize).limit(PageSize), User.class);
System.out.println(count);
System.out.println(users);
}
//修改
@Test
public void updateUser() {
//根据Id查询
User user = mongoTemplate.findById("622747932ea3370da71930fd", User.class);
//设置修改值
user.setName("zhangsanfeng");
user.setEmail("123456789@qq.com");
user.setAge(60);
//调用方法实现修改
Criteria criteria = Criteria.where("_id").is(user.getId());
Query query = new Query(criteria);
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);
}
//删除操作
@Test
public void daleteUser() {
Criteria criteria = Criteria.where("_Id").is("622747932ea3370da71930fd");
Query query = new Query(criteria);
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deleteCount = remove.getDeletedCount();
System.out.println(deleteCount);
}
4.基于MongoDBRepository开发
- 实体类
同上
- 添加Repository类
//注入userRepository
@Autowired
private UserRepository userRepository;
- 实现类
//实现方法的源码
public long count() {
return this.mongoOperations.getCollection(this.entityInformation.getCollectionName()).count();
}
//返回值是long类型,功能:统计表中的数据条数
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public long getCOuntofUser(){
return userRepository.count();
}
}
//实现方法的源码
public <S extends T> long count(Example<S> example) {
Assert.notNull(example, "Sample must not be null!");
Query q = new Query((new Criteria()).alike(example));
return this.mongoOperations.count(q, example.getProbeType(), this.entityInformation.getCollectionName());
}
//返回值是long类型,功能:有条件的统计表中的数据条数
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public long getCOuntofUser(User user){
Example<User> example = Example.of(user);
return userRepository.count();
}
}
//实现方法的源码,底层还是通过id删除
public void delete(T entity) {
Assert.notNull(entity, "The given entity must not be null!");
this.delete(this.entityInformation.getId(entity));
}
//返回值是void类型,功能:删除表中一条数据
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public void deleteOneUser(User user){
userRepository.delete(user);
}
}
//实现方法的源码,底层还是通过id删除
public void delete(ID id) {
Assert.notNull(id, "The given id must not be null!");
this.mongoOperations.remove(this.getIdQuery(id), this.entityInformation.getJavaType(), this.entityInformation.getCollectionName());
}
//返回值是void类型,功能:删除表中一条数据
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public void deleteOneUser(String id){
userRepository.delete(user);
}
}
//实现方法的源码,批量删除,底层还是通过id删除
public void delete(Iterable<? extends T> entities) {
Assert.notNull(entities, "The given Iterable of entities not be null!");
Iterator var2 = entities.iterator();
while(var2.hasNext()) {
T entity = var2.next();
this.delete(entity);
}
}
//返回值是void类型,功能:批量删除
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public void deleteUsers(List<User> users){
userRepository.delete(users);
}
}
//实现方法的源码
public void deleteAll() {
this.mongoOperations.remove(new Query(), this.entityInformation.getCollectionName());
}
//返回值是void类型,功能:情空表中所有的数据
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public void deleteAll(){
userRepository.deleteAll();
}
}
//实现方法的源码
public boolean exists(ID id) {
Assert.notNull(id, "The given id must not be null!");
return this.mongoOperations.exists(this.getIdQuery(id), this.entityInformation.getJavaType(), this.entityInformation.getCollectionName());
}
//返回值是boolean 类型,功能:判断数据是否存在
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public boolean isExist(String id){
return userRepository.exists(id);
}
}
//实现方法的源码
public <S extends T> boolean exists(Example<S> example) {
Assert.notNull(example, "Sample must not be null!");
Query q = new Query((new Criteria()).alike(example));
return this.mongoOperations.exists(q, example.getProbeType(), this.entityInformation.getCollectionName());
}
//返回值是boolean类型,功能:判断某特定数据是否存在
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public boolean isExist(User user){
Example example = Example.of(user);
return userRepository.exists(example);
}
}
//实现方法的源码
public List<T> findAll() {
return this.findAll(new Query());
}
//返回值是List<User>类型,功能:获取表中所有的数据
@Service
public class UserServiceImpl {
@Autowired
private UserRepository userRepository;
public List<User> findAll(){
return userRepository.findAll();
}
}
仅展示部分实现类,在实际Spring Boot与MongoDB的整合中,应用情况更加复杂,多样。