当前位置: 首页 > 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层进行测试

相关文章:

java脚手架系列12-mongoDB

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…...

python四舍五入保留两位小数

在 Python 中&#xff0c;你可以使用内置的 round() 函数来对数字进行四舍五入并保留两位小数。round() 函数有两个参数&#xff1a;要四舍五入的数字和要保留的小数位数。以下是一个简单的示例&#xff1a; # 示例数字 number 3.14159# 四舍五入保留两位小数 rounded_number…...

期权懂|有什么期权交易策略能够稳赚不赔的?

期权小懂小编每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 有什么期权交易策略能够稳赚不赔的? 期权交易具有风险性&#xff0c;没有任何一种策略能够保证稳赚不赔。 以下是一些常见的期权交易策略&#xff0c;虽不能保证盈利&#…...

笔记本脱机状态

先是显示脱机&#xff0c;请尝试其他方法登录 1.按照联想客服&#xff0c;进入高级选项里面&#xff0c;清除两个更新项目&#xff0c;没有卸载成功 2.安装wepe&#xff0c;先是能检测到U盘&#xff0c;但是进不去&#xff0c;然后我淘宝淘帮我做盘&#xff0c;我自己重新装了一…...

Node.js:模块 包

Node.js&#xff1a;模块 & 包 模块module对象 包npm安装包配置文件镜像源 分类 模块 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 简单来说&#xff0c;就是把一个…...

油动无人机动力测试台-60公斤级-Flight Stand 60 ICE

产品简介 通过Flight Stand 60 ICE测试台对内燃机和螺旋桨的拉力&#xff0c;扭矩&#xff0c;转速&#xff0c;燃油流量&#xff0c;温度&#xff0c;功率和螺旋桨效率的测量&#xff0c;帮助用户精准地描述和评估其性能参数&#xff0c;以不断地优化和提升燃油动力系统性能。…...

给grasshopper中的python脚本电池加个标签

ghenv.Component.Message test使用python脚本创建的电池&#xff0c;也可以保存起来。 File – Create User Object...

别被忽悠了 Lua 数组真的也可以从 0 开始索引?

先前我说 Lua 数组从 1 开始不太爽&#xff0c;很多人来纠正我说也可以从 0 开始&#xff0c;比如&#xff1a; local m { [0] 100, 101, 102, 103 }然后访问时 m[0] 也可以正常访问到第 0 个元素&#xff0c;所以 “Lua 给你充分自由度&#xff0c;让你可以从任意下标索引数…...

docker占用磁盘过多问题

我在windows系统上用docker&#xff0c;安装在C盘环境下&#xff0c;我发现C盘占用了大量的空间&#xff0c;查找后发现是docker的映像文件占用的&#xff0c;于是开始清理&#xff0c;中间还踩个坑&#xff0c;记录一下&#xff0c;下次需要的时候方便找。 踩坑 我本想移动映…...

[实时计算flink]使用Python依赖

您可以在Flink Python作业中使用自定义的Python虚拟环境、第三方Python包、JAR包和数据文件等&#xff0c;本文为您介绍如何在Python作业中使用这些依赖。 使用自定义的Python虚拟环境 说明 VVR 4.x仅支持3.7版本的Python虚拟环境&#xff0c;VVR 6.x及以上的版本无此限制&a…...

MySql如何实现分布式锁

本篇我们使用mysql实现一个分布式锁。 环境&#xff1a;mysql8,navicat,maven,springboot2.3.11,mybatis-plus 分布式锁的功能 1,分布式锁使用者位于不同的机器中&#xff0c;锁获取成功之后&#xff0c;才可以对共享资源进行操作 2,锁具有重入的功能&#xff1a;即一个使用…...

「行内揭秘」 SQLynx数据库界的“小众宝藏”?

数据库界的“小众宝藏”&#xff1f;Navicat老大哥地位稳如泰山&#xff0c;但这位“SQLynx”小弟也不容小觑&#xff01;&#x1f440; 别看它小众&#xff0c;SQLynx在处理数据库事务上那可是丝毫不含糊&#xff0c;无论你是Windows Linux和Mac&#xff0c;甚至银河麒麟统信都…...

【已解决】【MySQL】IDEA配置数据库 报错 未配置SQL方言 无法使用SQL提示

IDEA配置数据库的步骤 下载插件 添加数据源 新建--->选择数据源MySQL 页面展示&#xff1a; 主机名&#xff1a;一般都是localhost不用改端口&#xff1a;填写自己的端口号用户&#xff1a;填写自己的用户名密码&#xff1a;填写自己设置的密码数据库&#xff1a;填写需要…...

js 通过filter 实现扁平化数据tree

...

Android 开发 调节声音 SeekBar自定义样式

效果图 xml布局 mipmap/seekbar图片随意一张图都可以&#xff0c;这里我的图就不贴出来了 <SeekBarandroid:id"id/seekBar"android:layout_marginLeft"8dp"android:layout_width"377dp"android:layout_height"8dp"android:layou…...

UART-通用异步收发器

1. UART的基本工作原理 UART通信主要有两个部分构成&#xff1a;发送器和接收器&#xff0c;也就是我们常见的&#xff08;RX接收&#xff0c;TX发送&#xff09;两个独立的线路来实现数据的双向传输&#xff0c;由于是异步的&#xff0c;UART并不需要时钟信号&#xff0c;而是…...

Linux——— 信号

文章目录 前言&#xff1a;引入信号生活中的例子信号概念见一见Linux中的信号 浅度理解信号信号处理&#xff08;浅谈&#xff09;:如何自定义捕捉 信号保存&#xff08;浅谈&#xff09; 信号产生系统调用产生异常产生&#xff1a;浅谈除0异常浅谈解引用野指针异常Core &&…...

安全见闻-web安全

web安全 一、web程序简介 1. Web程序的基本构成 2. 工作流程 3. 安全性 二、JavaScript代码库 1. 代码库的概念和用途 2. 常见的代码库 三、框架 1. 常见的前端框架 2. 常见的后端框架 四、数据库 1. 数据库的分类 2. 数据库的潜在漏洞 3. 学习数据库的重要性 五、…...

华为手机卸载系统应用的方法

摘要&#xff1a; 1.手机环境&#xff1a;手机需要开启开发者模式并使用usb连接电脑&#xff0c;并选择文件传输模式 2.电脑环境&#xff1a;使用鸿蒙工具箱进行傻瓜操作或安装adb工具进行命令卸载 3.鸿蒙工具箱和adb工具本质都是使用adb shell pm uninstall -k --user 0 xx…...

力扣算法笔记——生成随机数组

题目信息: 给两个随机数和N&#xff0c;生成M到N的随机不重复数组&#xff0c;且M<N。 示例&#xff1a;输入M 2, N5, 输出 [4,3,2,5]. 思路&#xff1a;洗牌算法&#xff0c;先遍历M到N之间所有的数字&#xff0c;将得到的结果存入一个集合中&#xff0c;将集合从后往前遍历…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...