当前位置: 首页 > news >正文

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: commonFrameworkhost: 127.0.0.1port: 27017config:minConnectionsPerHost: 5maxConnectionsPerHost: 20

3)定义业务实体类Project,注意Document注解是为了对于mongo的collection

@Data
@Document(collection = "project")
public class Project extends Base {public static String PROJECT_ID = "projectId";@Fieldprivate Long projectId;@Fieldprivate String projectName;@Fieldprivate BigDecimal num;@Fieldprivate Person createPerson;@Overridepublic Long getID() {return projectId;}
}

4)定义业务ProjectDAO:

@Repository
public class ProjectDao extends BaseDAO<Project> {@Autowiredprivate MongoTemplate mongoTemplate;public ProjectDao() {ID = "projectId";  //对于业务实体的实际idclazz = Project.class;}@Overridepublic MongoTemplate getMongoTemplate() {return mongoTemplate;}
}

5)定义service和controller层进行测试

http://www.lryc.cn/news/472846.html

相关文章:

  • python四舍五入保留两位小数
  • 期权懂|有什么期权交易策略能够稳赚不赔的?
  • 笔记本脱机状态
  • Node.js:模块 包
  • 油动无人机动力测试台-60公斤级-Flight Stand 60 ICE
  • 给grasshopper中的python脚本电池加个标签
  • 别被忽悠了 Lua 数组真的也可以从 0 开始索引?
  • docker占用磁盘过多问题
  • [实时计算flink]使用Python依赖
  • MySql如何实现分布式锁
  • 「行内揭秘」 SQLynx数据库界的“小众宝藏”?
  • 【已解决】【MySQL】IDEA配置数据库 报错 未配置SQL方言 无法使用SQL提示
  • js 通过filter 实现扁平化数据tree
  • Android 开发 调节声音 SeekBar自定义样式
  • UART-通用异步收发器
  • Linux——— 信号
  • 安全见闻-web安全
  • 华为手机卸载系统应用的方法
  • 力扣算法笔记——生成随机数组
  • Anaconda和Pycharm超详细安装教程(2024版本+Win11)
  • 代码随想录:从中后/中前遍历序列构造二叉树
  • 2-134 基于matlab的图像边缘检测
  • 【Java并发编程】线程池详解
  • ThingsBoard规则链节点:GPS Geofencing Events节点详解
  • Jmeter基础篇(19)JSR223预处理器
  • 通过js控制css变量
  • Docker:容器化和虚拟化
  • OpenSSL
  • CSS 常见选择器
  • Linux使用Dockerfile部署Tomcat以及jdk