共计 11013 个字符,预计需要花费 28 分钟才能阅读完成。
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
代码
SimpleMongoService
package com.baba.security.auth2.service;
import com.baba.security.auth2.entity.RangeEntity;
import java.util.List;
import java.util.Map;
/**
* @Author wulongbo
* @Date 2022/1/19 15:28
* @Version 1.0
*/
public interface SimpleMongoService<T> {void createCollection(String name);
String createIndex(String collectionName, String filedName);
List<String> getAllIndexes(String collectionName);
void insert(T info, String collectionName);
void insertMulti(List<T> infos, String collectionName);
void updateById(String id, String collectionName, T info);
void deleteById(String id, Class<T> clazz, String collectionName);
T selectById(String id, Class<T> clazz, String collectionName);
List<T> selectList(String collectName, Class<T> clazz);
List<T> selectList(String collectName, Class<T> clazz, Integer currentPage, Integer pageSize);
List<T> selectByCondition(String collectName, Map<String, Object> conditions, Class<T> clazz, Integer currentPage, Integer pageSize);
List<T> selectByCondition(String collectName, Map<String, RangeEntity> range, Map<String, String> conditions, Class<T> clazz, Integer currentPage, Integer pageSize);
}
SimpleMongoServiceImpl
package com.baba.security.auth2.service.impl.mongo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baba.security.auth2.entity.MongoBaseInfo;
import com.baba.security.auth2.entity.RangeEntity;
import com.baba.security.auth2.service.SimpleMongoService;
import com.mongodb.client.ListIndexesIterable;
import com.mongodb.client.model.IndexOptions;
import com.mongodb.client.model.Indexes;
import org.bson.Document;
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.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @Author wulongbo
* @Date 2022/1/19 15:20
* @Version 1.0
* 简略的 mongodb 应用接口
*/
@Service
public class SimpleMongoServiceImpl<T extends MongoBaseInfo> implements SimpleMongoService<T> {
/**
* 注入 template,缩小反复代码
*/
@Autowired
private MongoTemplate mongoTemplate;
/**
* 性能形容: 创立一个汇合
* 同一个汇合中能够存入多个不同类型的对象,咱们为了不便保护和晋升性能,* 后续将限度一个汇合中存入的对象类型,即一个汇合只能寄存一个类型的数据
*
* @param name 汇合名称,相当于传统数据库的表名
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 17:27
*/
@Override
public void createCollection(String name) {mongoTemplate.createCollection(name);
}
/**
* 性能形容: 创立索引
* 索引是顺序排列,且惟一的索引
*
* @param collectionName 汇合名称,相当于关系型数据库中的表名
* @param filedName 对象中的某个属性名
* @return:java.lang.String
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:13
*/
@Override
public String createIndex(String collectionName, String filedName) {
// 配置索引选项
IndexOptions options = new IndexOptions();
// 设置为惟一
options.unique(true);
// 创立按 filedName 升序排的索引
return mongoTemplate.getCollection(collectionName).createIndex(Indexes.ascending(filedName), options);
}
/**
* 性能形容: 获取以后汇合对应的所有索引的名称
*
* @param collectionName
* @return:java.util.List<java.lang.String>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:46
*/
@Override
public List<String> getAllIndexes(String collectionName) {ListIndexesIterable<Document> list = mongoTemplate.getCollection(collectionName).listIndexes();
// 下面的 list 不能间接获取 size,因而初始化 arrayList 就不设置初始化大小了
List<String> indexes = new ArrayList<>();
for (Document document : list) {document.entrySet().forEach((key) -> {
// 提取出索引的名称
if (key.getKey().equals("name")) {indexes.add(key.getValue().toString());
}
});
}
return indexes;
}
/**
* 性能形容: 往对应的汇合中插入一条数据
*
* @param info 存储对象
* @param collectionName 汇合名称
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:46
*/
@Override
public void insert(T info, String collectionName) {mongoTemplate.insert(info, collectionName);
}
/**
* 性能形容: 往对应的汇合中批量插入数据,留神批量的数据中不要蕴含反复的 id
*
* @param infos 对象列表
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:47
*/
@Override
public void insertMulti(List<T> infos, String collectionName) {mongoTemplate.insert(infos, collectionName);
}
/**
* 性能形容: 应用索引信息准确更改某条数据
*
* @param id 惟一键
* @param collectionName 汇合名称
* @param info 待更新的内容
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 18:42
*/
@Override
public void updateById(String id, String collectionName, T info) {Query query = new Query(Criteria.where("id").is(id));
Update update = new Update();
String str = JSON.toJSONString(info);
JSONObject jQuery = JSON.parseObject(str);
jQuery.forEach((key, value) -> {
// 因为 id 相当于传统数据库中的主键,这里应用时就不反对更新,所以须要剔除掉
if (!key.equals("id")) {update.set(key, value);
}
});
mongoTemplate.updateMulti(query, update, info.getClass(), collectionName);
}
/**
* 性能形容: 依据 id 删除汇合中的内容
*
* @param id 序列 id
* @param collectionName 汇合名称
* @param clazz 汇合中对象的类型
* @return:void
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:47
*/
@Override
public void deleteById(String id, Class<T> clazz, String collectionName) {// 设置查问条件,当 id=#{id}
Query query = new Query(Criteria.where("id").is(id));
// mongodb 在删除对象的时候会判断对象类型,如果你不传入对象类型,只传入了汇合名称,它是找不到的
// 下面咱们为了方便管理和晋升后续解决的性能,将一个汇合限度了一个对象类型,所以须要自行治理一下对象类型
// 在接口传入时须要同时传入对象类型
mongoTemplate.remove(query, clazz, collectionName);
}
/**
* 性能形容: 依据 id 查问信息
*
* @param id 注解
* @param clazz 类型
* @param collectionName 汇合名称
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/20 16:47
*/
@Override
public T selectById(String id, Class<T> clazz, String collectionName) {
// 查问对象的时候,不仅须要传入 id 这个惟一键,还须要传入对象的类型,以及汇合的名称
return mongoTemplate.findById(id, clazz, collectionName);
}
/**
* 性能形容: 查问列表信息
* 将汇合中合乎对象类型的数据全副查问进去
*
* @param collectName 汇合名称
* @param clazz 类型
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:38
*/
@Override
public List<T> selectList(String collectName, Class<T> clazz) {return selectList(collectName, clazz, null, null);
}
/**
* 性能形容: 分页查问列表信息
*
* @param collectName 汇合名称
* @param clazz 对象类型
* @param currentPage 以后页码
* @param pageSize 分页大小
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:38
*/
@Override
public List<T> selectList(String collectName, Class<T> clazz, Integer currentPage, Integer pageSize) {
// 设置分页参数
Query query = new Query();
// 设置分页信息
if (!ObjectUtils.isEmpty(currentPage) && ObjectUtils.isEmpty(pageSize)) {query.limit(pageSize);
query.skip(pageSize * (currentPage - 1));
}
return mongoTemplate.find(query, clazz, collectName);
}
/**
* 性能形容: 依据条件查问汇合
*
* @param collectName 汇合名称
* @param conditions 查问条件,目前查问条件解决的比较简单,仅仅做了相等匹配,没有做含糊查问等简单匹配
* @param clazz 对象类型
* @param currentPage 以后页码
* @param pageSize 分页大小
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:48
*/
@Override
public List<T> selectByCondition(String collectName, Map<String, Object> conditions, Class<T> clazz, Integer currentPage, Integer pageSize) {if (ObjectUtils.isEmpty(conditions)) {return selectList(collectName, clazz, currentPage, pageSize);
} else {
// 设置分页参数
Query query = new Query();
query.limit(pageSize);
query.skip(currentPage);
// 往 query 中注入查问条件
conditions.forEach((key, value) -> query.addCriteria(Criteria.where(key).is(value)));
return mongoTemplate.find(query, clazz, collectName);
}
}
/**
* 性能形容: 依据条件范畴查问汇合
*
* @param collectName 汇合名称
* @param conditions 查问条件
* @param clazz 对象类型
* @param currentPage 以后页码
* @param pageSize 分页大小
* @return:java.util.List<T>
* @since: v1.0
* @Author:wangcanfeng
* @Date: 2019/3/21 10:48
*/
@Override
public List<T> selectByCondition(String collectName, Map<String, RangeEntity> range, Map<String, String> conditions, Class<T> clazz, Integer currentPage, Integer pageSize) {if (ObjectUtils.isEmpty(conditions) && ObjectUtils.isEmpty(range)) {return selectList(collectName, clazz, currentPage, pageSize);
}
// 设置分页参数
Query query = new Query();
query.limit(pageSize);
query.skip(currentPage);
// 往 query 中注入查问条件
if (!ObjectUtils.isEmpty(conditions)) {conditions.forEach((key, value) -> query.addCriteria(Criteria.where(key).is(value)));
}
if (!ObjectUtils.isEmpty(range)) {range.forEach((key, value) -> query.addCriteria(Criteria.where(key).gte(value.getGte()).lte(value.getLt())));
}
return mongoTemplate.find(query, clazz, collectName);
}
}
MongoBaseInfo
package com.baba.security.auth2.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @Author wulongbo
* @Date 2022/1/19 15:27
* @Version 1.0
*/
@Getter
@Setter
@ToString
public class MongoBaseInfo {private String id;}
测试类
import com.baba.security.auth2.Application;
import com.baba.security.auth2.entity.*;
import com.baba.security.auth2.service.SimpleMongoService;
import com.baba.security.auth2.service.SourceService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Profile;
import java.util.*;
@SpringBootTest(classes = Application.class)
@Profile(value = "dev")
@RunWith(SpringRunner.class)
public class ApiTest {
@Autowired
private SimpleMongoService simpleMongoService;
/**
* 创立汇合
*
* @throws Exception
*/
@Test
public void createCollection() {simpleMongoService.createCollection("wulongbo");
}
/**
* 往对应的汇合中插入一条数据
*
* @throws Exception
*/
@Test
public void insert() {RoleTest role = new RoleTest();
role.setRoleName("角色名称");
role.setCreateTime(System.currentTimeMillis());
role.setUpdateTime(System.currentTimeMillis());
role.setUserId(1L);
role.setRoleDesc("角色形容");
simpleMongoService.insert(role, "wulongbo");
}
/**
* 往对应的汇合中批量插入一条数据
*
* @throws Exception
*/
@Test
public void batchInsert() {List<RoleTest> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {RoleTest role = new RoleTest();
role.setRoleName("角色名称" + 7);
role.setCreateTime(System.currentTimeMillis() + i);
role.setUpdateTime(System.currentTimeMillis() + i);
role.setUserId(1L + i);
role.setRoleDesc("角色形容" + 7);
list.add(role);
}
simpleMongoService.insertMulti(list, "wulongbo");
}
/**
* 依据 id 删除汇合中的内容
*
* @throws Exception
*/
@Test
public void deleteById() {simpleMongoService.deleteById("61e8b1e36fad7769c0015fff", RoleTest.class, "wulongbo");
}
/**
* 依据 id 查问信息
*
* @throws Exception
*/
@Test
public void selectById() {RoleTest roleTest = (RoleTest) simpleMongoService.selectById("61e8b1e36fad7769c0015ffd", RoleTest.class, "wulongbo");
System.out.println(roleTest.toString());
}
/**
* 查问列表信息
*
* @throws Exception
*/
@Test
public void selectList() {List<RoleTest> roleTest = simpleMongoService.selectList("wulongbo", RoleTest.class);
System.out.println(roleTest.toString());
}
/**
* 分页查问列表信息
*
* @throws Exception
*/
@Test
public void selectList1() {List<RoleTest> roleTest = simpleMongoService.selectList("wulongbo", RoleTest.class, 1, 10);
System.out.println(roleTest.toString());
}
/**
* 依据条件查问汇合
*
* @throws Exception
*/
@Test
public void selectByCondition() {Map<String, Object> map = new HashMap();
map.put("createTime", 1642642710124L);
map.put("roleDesc", "角色形容 7");
List<RoleTest> roleTest = simpleMongoService.selectByCondition("wulongbo", map, RoleTest.class, 1, 10);
System.out.println(roleTest.toString());
}
/**
* 依据范畴条件查问汇合
*
* @throws Exception
*/
@Test
public void selectByCondition1() {Map<String, Object> map1 = new HashMap();
map1.put("roleDesc", "角色形容 7");
Map<String, RangeEntity> map = new HashMap();
RangeEntity r = new RangeEntity();
r.setLt(1642642710130L);
r.setGte(1642648687019L);
map.put("createTime",r);
List<RoleTest> roleTest = simpleMongoService.selectByCondition("wulongbo", null,map1, RoleTest.class, 1, 10);
System.out.println(roleTest.toString());
}
}
RangeEntity
package com.baba.security.auth2.entity;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* @Author wulongbo
* @Date 2022/1/20 10:07
* @Version 1.0
*/
@Getter
@Setter
@ToString
public class RangeEntity {
private Object lt;
private Object gte;
}
正文完