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

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层进行测试


http://www.kler.cn/a/378889.html

相关文章:

  • 「Mac畅玩鸿蒙与硬件27」UI互动应用篇4 - 猫与灯的互动应用
  • 一个由Deno和React驱动的静态网站生成器
  • 鸿蒙HarmonyOS开发:给应用添加基础类型通知和进度条类型通知(API 12)
  • RV1126-SDK学习之OSD实现原理
  • 【大数据】ClickHouse常见的表引擎及建表语法
  • linux系统安装git及git常用命令
  • 10天进阶webpack---(1)为什么要有webpack
  • 【数据分享】2024年我国省市县三级的休闲娱乐设施数量(免费获取/18类设施/Excel/Shp格式)
  • 中文词向量质量的评估
  • 服务器开启SSH允许远程连接服务
  • Springboot 内置缓存与整合Redis作为缓存
  • 7-12 检查密码
  • LeetCode 203. 移除链表元素(java)
  • Android面试整理
  • 【热门主题】000027 React:前端框架的强大力量
  • [C++]:智能指针
  • 大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)
  • Python画笔案例-095 绘制鼠标画笔
  • [java][基础]HTTPTomcatServlet
  • 高防服务器都有哪些类型?
  • Java 正则基础
  • 生成对抗网络(GAN)如何推动AIGC的发展
  • MacOS如何读取磁盘原始的扇区内容,恢复误删除的数据
  • 【IC每日一题--单bitCDC跨时钟和同步FIFO】
  • [ 应急响应靶场实战 ] VMware 搭建win server 2012应急响应靶机 攻击者获取服务器权限上传恶意病毒 防守方人员应急响应并溯源
  • ssm基于vue搭建的新闻网站+vue