java脚手架系列12-mongoDB
之所以想写这一系列,是因为之前工作过程中有几次项目是从零开始搭建的,而且项目涉及的内容还不少。在这过程中,遇到了很多棘手的非业务问题,在不断实践过程中慢慢积累出一些基本的实践经验,认为这些与业务无关的基本的实践经验其实可以复刻到其它项目上,在行业内可能称为脚手架,因此决定将此java基础脚手架的搭建总结下来,分享给大家使用。
注意:由于框架不同版本改造会有些使用的不同,因此本次系列中主要使用基本框架是 spring-boo-2.3.12.RELEASE和spring-cloud.-Hoxton.SR12,所有代码都在commonFramework项目上:https://github.com/forever1986/commonFramework/tree/master
目录
- 1 mongoDB
- 1.1 代码实现
- 1.1.1 common-mongo配置
- 1.1.2 business-biz子模块使用
1 mongoDB
MongoDB是面向文档的NoSQL(非关系型)数据库,它的数据结构由字段(Field)和值(Value)组成,类似于JSON对象。而在业务上,比如游戏、互联网、大数据和传统应用中,对该数据库的依赖也是比较高,因此这里通过一个脚手架方式,引入mongo的配置以及使用框架,在项目中可以直接引入使用。
1.1 代码实现
参考common-mongo子模块和business-biz子模块
1.1.1 common-mongo配置
1)在common子模块下面创建common-mongo子模块,引入以下依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2)定义MongoConfigProperties,实现从yaml文件读取spring.data.mongodb.config下面的配置
3)定义MongoConfiguration,实现MongoClientSettingsBuilderCustomizer个性化配置和MongoCustomConversions做Decimal128的转换
4)分别定义BigDecimalToDecimal128Converter和Decimal128ToBigDecimalConverter做Decimal128和Decimal的相互转换
5)定义DAO层的基础类BaseDAO,该类实现了mongo集合的CURD,业务类继承BaseDAO,需要注入MongoTemplate,重新赋值ID和clazz
package com.demo.common.mongo.dao;
import com.demo.common.mongo.entity.Base;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.Document;
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 java.util.List;
import java.util.Map;
public abstract class BaseDAO<T> {
protected String ID = "id";
protected String DEL_FLAG = "del_flag";
protected Class<T> clazz;
public abstract MongoTemplate getMongoTemplate();
public <T> T findById(Long id){
Query query = new Query(Criteria.where(ID).is(id).and(DEL_FLAG).is(false));
List<T> list = (List<T>) getMongoTemplate().find(query, clazz);
if(list!=null&&list.size()>0){
if(list.size()>1)
throw new IllegalArgumentException("id="+id+" is duplicate!");
return list.get(0);
}
return null;
}
public T insertDocument(T base){
if(((Base)base).getID()==null)
throw new IllegalArgumentException("id is null!");
((Base) base).setDel_flag(false);
return getMongoTemplate().insert(base);
}
public T updateDocument(Map<String,Object> updateMap){
if(updateMap.get(ID)==null)
throw new IllegalArgumentException("id is null!");
Query query = new Query(Criteria.where(ID).is(updateMap.get(ID)).and(DEL_FLAG).is(false));
updateMap.remove(ID);
Update update = new Update();
updateMap.keySet().stream().forEach(
key -> {
update.set(key,updateMap.get(key));
}
);
getMongoTemplate().findAndModify(query, update, clazz);
List<T> list = getMongoTemplate().find(query, clazz);
return list.get(0);
}
public T deleteDocument(Long id){
if(id==null)
throw new IllegalArgumentException("id is null!");
Query query = new Query(Criteria.where(ID).is(id).and(DEL_FLAG).is(false));
Update update = new Update().set("del_flag", true);
getMongoTemplate().findAndModify(query, update, clazz);
List<T> list = getMongoTemplate().find(query, clazz);
return list.get(0);
}
public List<Map> findDocument(List<String> fieldList, Criteria criteria){
Query query = new Query(criteria.and(DEL_FLAG).is(false));
for(String fieldName : fieldList){
query.fields().include(fieldName);
}
query.fields().include(ID);
query.fields().include(DEL_FLAG);
Document documentAnnotation = clazz.getAnnotation(Document.class);
return getMongoTemplate().find(query,Map.class,documentAnnotation.collection());
}
}
1.1.2 business-biz子模块使用
1)引入common-mongo子模块
<dependency>
<groupId>org.example</groupId>
<artifactId>common-mongo</artifactId>
<version>${project.version}</version>
</dependency>
2)在yaml文件配置mongo:
spring:
data:
mongodb:
database: commonFramework
host: 127.0.0.1
port: 27017
config:
minConnectionsPerHost: 5
maxConnectionsPerHost: 20
3)定义业务实体类Project,注意Document注解是为了对于mongo的collection
@Data
@Document(collection = "project")
public class Project extends Base {
public static String PROJECT_ID = "projectId";
@Field
private Long projectId;
@Field
private String projectName;
@Field
private BigDecimal num;
@Field
private Person createPerson;
@Override
public Long getID() {
return projectId;
}
}
4)定义业务ProjectDAO:
@Repository
public class ProjectDao extends BaseDAO<Project> {
@Autowired
private MongoTemplate mongoTemplate;
public ProjectDao() {
ID = "projectId"; //对于业务实体的实际id
clazz = Project.class;
}
@Override
public MongoTemplate getMongoTemplate() {
return mongoTemplate;
}
}
5)定义service和controller层进行测试