前言
最近有项目需要用到mongodb,在经过突击学习后,基本了解Mongodb的API。
虽说springboot中有封装好的MongoTemplate、Query、Criteria等,但本着提高代码复用性、降低耦合原则,就想编写一个mongodb的工具类或是通用接口类。
本想偷懒,想直接通过百度解决mongodb工具类的问题,但都没有想要的。。。唉~~~
还是得自己造啊!完事后分享出来,供大家一起使用,望大佬在评论区,提供宝贵意见,小弟后续改进。
参考内容及目前进度
参考了mybatis-plus的设计理念,编写了一个通用接口类和一个通用实现类。
目前已完成基本的增删改查、条件查询、分页查询(由于时间和需求原因暂时未写模糊查询)
代码内容
话不多说,直接上代码。
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
spring:
data:
mongodb:
#验证用户数据库,未设置可忽略
authentication-database: admin
#使用的数据库名
database: databaseName
#mongodb地址,user和password对应用户数据库中的用户和密码,未设置可忽略,直接写ip:27017即可
uri: mongodb://user:password@ip:27017
分页使用到的两个类
MyPage.java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyPage implements Serializable {
protected Integer pageNum;//当前页
protected Integer pageSize;//页大小
}
MongoPage.java----是MyPage的子类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MongoPage<T> extends MyPage{
private long total;//总记录数
private List<T> list;//分页结果
public MongoPage(Integer pageNum, Integer pageSize){
this.pageNum=pageNum;
this.pageSize=pageSize;
}
public void setMongoPage(long total,List<T> list){
this.total=total;
this.list=list;
}
}
通用接口类
IMongoService.java 通用接口类–>后续需要添加或修改内容可在此添加
package edu.cn.service;
import edu.cn.vo.FuzzyPage;
import edu.cn.vo.MongoPage;
import edu.cn.vo.MyPage;
import java.io.Serializable;
import java.util.List;
/**
* @author: 会飞的种花家
* @date: 2021/5/29 21:21:08
* @title mongodb服务接口类
* @参数
* @entity 实体对象
* @collectionName 数据库中的集合名
* @list 实体集合对象
* @keys 键名数组
* @values 键值数组
* @fields 需要查询的列
* @id id值
* @MyPage Page类,含有pageNum(当前页),pageSize(页大小)
* @MongoPage MyPage的子类,多了total(总记录数)和list(实体集合)
* @inputStr 模糊查询时输入的字符串
*/
public interface IMongoService<T> {
/**
* 增
*/
boolean save(T entity);
boolean save(T entity,String collectionName);
boolean saveList(List<T> list);
boolean saveList(List<T> list,String collectionName);
/**
* 删
*/
boolean removeById(T entity);
boolean removeById(T entity,String collectionName);
/**
* 改,都是通过id
* @param keys 要修改的键名
* @param values 要修改的键值
* 相当于mysql中 update key1,key2,key3 set value1,value2,value3 where id=#{id} from collectionName
*/
boolean updateById(String[] keys,Object[] values,Serializable id,Class<?> clazz);
boolean updateById(String[] keys,Object[] values,Serializable id,String collectionName);
boolean updateById(String[] keys,Object[] values,Serializable id,Class<?> clazz,String collectionName);
/**
* 查
* @finById 就是根据id查询单条记录
* @findByMap 相当于条件查询,查询出符合条件的所有内容
* @findAll 查询表中所有记录
* @fields 表示需要查询的字段---参考mysql中 select key1,key2,key3 from collectionName
*/
T findById(Serializable id,Class<?> clazz);
T findById(Serializable id,Class<?> clazz,String collectionName);
T findById(Serializable id,String[] fields,Class<?> clazz);
T findById(Serializable id,String[] fields,Class<?> clazz,String collectionName);
List<T> findByMap(String[] keys,Object[] values,Class<?> clazz);
List<T> findByMap(String[] keys,Object[] values,Class<?> clazz,String collectionName);
List<T> findByMap(String[] keys,Object[] values,String[] fields,Class<?> clazz);
List<T> findByMap(String[] keys,Object[] values,String[] fields,Class<?> clazz,String collectionName);
List<T> findAll(Class<?> clazz);
List<T> findAll(Class<?> clazz,String collectionName);
List<T> findAll(String[] fields,Class<?> clazz);
List<T> findAll(String[] fields,Class<?> clazz,String collectionName);
/**
* 分页---无总记录数,只查一次
*/
List<T> page(MyPage myPage, Class<?> clazz);
List<T> page(MyPage myPage, Class<?> clazz,String collectionName);
List<T> page(MyPage myPage, String[] fields,Class<?> clazz);
List<T> page(MyPage myPage, String[] fields,Class<?> clazz,String collectionName);
/**
* 分页--有总记录数,查两次
*/
MongoPage page(MongoPage mongoPage, Class<?> clazz);
MongoPage page(MongoPage mongoPage, Class<?> clazz,String collectionName);
MongoPage page(MongoPage mongoPage,String[] fields,Class<?> clazz);
MongoPage page(MongoPage mongoPage,String[] fields, Class<?> clazz,String collectionName);
/**
* 模糊查询---分页
*/
List<T> fuzzyPage(MyPage myPage,Class<?> clazz,String inputStr,String[] keys);
List<T> fuzzyPage(MyPage myPage,Class<?> clazz,String collectionName,String inputStr,String[] keys);
List<T> fuzzyPage(MyPage myPage,Class<?> clazz, String inputStr,String[] keys,String[] fields);
List<T> fuzzyPage(MyPage myPage,Class<?> clazz,String collectionName,String inputStr,String[] keys, String[] fields);
/**
* 模糊查询---分页--有总记录数,查两次
*/
MongoPage fuzzyPage(FuzzyPage fuzzyPage, Class<?> clazz, String[] keys);
MongoPage fuzzyPage(FuzzyPage fuzzyPage, Class<?> clazz,String collectionName,String[] keys);
MongoPage fuzzyPage(FuzzyPage fuzzyPage,Class<?> clazz,String[] keys,String[] fields);
MongoPage fuzzyPage(FuzzyPage fuzzyPage, Class<?> clazz,String collectionName,String[] keys,String[] fields);
}
通用接口实现类
IMongoServiceImpl.java —>IMongoService的实现类
package edu.cn.service.impl;
import edu.cn.definite.MongoMethod;
import edu.cn.service.IMongoService;
import edu.cn.vo.FuzzyPage;
import edu.cn.vo.MongoPage;
import edu.cn.vo.MyPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Field;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import java.io.Serializable;
import java.util.List;
import java.util.regex.Pattern;
@Service
public class IMongoServiceImpl<T> implements IMongoService<T> {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public boolean save(T entity) {
try{
mongoTemplate.save(entity);
mongoLogByConsole(MongoMethod.INSERT,entity.toString());
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
@Override
public boolean save(T entity, String collectionName) {
try{
mongoTemplate.save(entity,collectionName);
mongoLogByConsole(MongoMethod.INSERT,entity.toString());
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
@Override
public boolean saveList(List<T> list) {
try{
mongoTemplate.insertAll(list);
mongoLogByConsole(MongoMethod.INSERT,list.toString());
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
@Override
public boolean saveList(List<T> list, String collectionName) {
try{
mongoTemplate.insert(list,collectionName);
mongoLogByConsole(MongoMethod.INSERT,list.toString());
return true;
}catch (Exception e){
e.printStackTrace();
return false;
}
}
@Override
public boolean removeById(T entity) {
try{
mongoTemplate.remove(entity);
mongoLogByConsole(Mon