Spring Boot骚操作-多数据源Service层封装

news2024/11/20 7:12:27

mysql, es, mongodb 三个数据源用配置文件方式连接,JPA只是正对dao做了封装,本文主要介绍如何对service层进行封装。

  • Spring Boot - 多个数据源Service层封装

  • 类关系图

  • 封装的一些配置

    • application.yml

    • pom.xml

  • 封装后使用

    • MySQL 动态数据访问

  • Mongo 动态数据访问

  • ElasticSearch 动态数据访问(单个index+type)

  • ElasticSearch 动态数据访问(多个index+type)

  • 源代码托管

类关系图

  • 对多个数据源连接获取数据进行统一封装

  • ES spring-data方式不支持多个Index和Type的查找功能,添加了DynamicESDao支持

  • 大大简化封装之后的调用, 调用方式如下

封装的一些配置

application.yml

 
  1. banner:

  2. charset: UTF-8

  3. location: classpath:banner.txt

  4. server:

  5. port: 5555

  6. contextPath: /

  7. session:

  8. timeout: 0

  9. spring:

  10. application:

  11. name: 'spring-boot-datasource-demo'

  12. output:

  13. ansi:

  14. enabled: DETECT

  15. messages:

  16. basename: i18n/messages

  17. thymeleaf:

  18. cache: false

  19. profiles:

  20. active: dev

  21. # MySQL data source settings

  22. datasource:

  23. url: jdbc:mysql://localhost:3306/cdc_standalone?useSSL=false

  24. username: root

  25. password: bfXa4Pt2lUUScy8jakXf

  26. # MySQL JPA settings

  27. jpa:

  28. generate-ddl: true

  29. show-sql: true

  30. properties:

  31. hibernate:

  32. dialect: org.hibernate.dialect.MySQLDialect

  33. format_sql: true

  34. # NoSQL data source settings

  35. data:

  36. # MongoDB 2.2+ settings

  37. mongodb:

  38. uri: mongodb://standalone:fhY1tPt1lpUSbS7jwkTf@10.11.60.4:27017/standalone

  39. # ElasticSearch settings

  40. elasticsearch:

  41. cluster-name: es-logs-01

  42. cluster-nodes: 10.11.60.5:9300

pom.xml

 
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  3. <modelVersion>4.0.0</modelVersion>

  4. <groupId>spring-boot-datasource-demo</groupId>

  5. <artifactId>spring-boot-datasource-demo</artifactId>

  6. <version>0.0.1-SNAPSHOT</version>

  7. <name>spring-boot-datasource-demo</name>

  8. <description>spring-boot-datasource-demo</description>

  9. <parent>

  10. <groupId>org.springframework.boot</groupId>

  11. <artifactId>spring-boot-starter-parent</artifactId>

  12. <version>1.4.1.RELEASE</version>

  13. </parent>

  14. <properties>

  15. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

  16. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

  17. <java.version>1.8</java.version>

  18. <commons.lang.version>3.3.2</commons.lang.version>

  19. <springfox.version>2.7.0</springfox.version>

  20. </properties>

  21. <dependencies>

  22. <dependency>

  23. <groupId>org.springframework.boot</groupId>

  24. <artifactId>spring-boot-starter</artifactId>

  25. </dependency>

  26. <dependency>

  27. <groupId>org.springframework.boot</groupId>

  28. <artifactId>spring-boot-starter-data-mongodb</artifactId>

  29. </dependency>

  30. <dependency>

  31. <groupId>org.springframework.boot</groupId>

  32. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>

  33. </dependency>

  34. <dependency>

  35. <groupId>org.springframework.boot</groupId>

  36. <artifactId>spring-boot-starter-data-jpa</artifactId>

  37. </dependency>

  38. <dependency>

  39. <groupId>mysql</groupId>

  40. <artifactId>mysql-connector-java</artifactId>

  41. <scope>runtime</scope>

  42. </dependency>

  43. <dependency>

  44. <groupId>org.springframework.boot</groupId>

  45. <artifactId>spring-boot-starter-web</artifactId>

  46. </dependency>

  47. <dependency>

  48. <groupId>io.springfox</groupId>

  49. <artifactId>springfox-swagger2</artifactId>

  50. <version>${springfox.version}</version>

  51. </dependency>

  52. <dependency>

  53. <groupId>io.springfox</groupId>

  54. <artifactId>springfox-swagger-ui</artifactId>

  55. <version>${springfox.version}</version>

  56. </dependency>

  57. <dependency>

  58. <groupId>com.alibaba</groupId>

  59. <artifactId>fastjson</artifactId>

  60. <version>1.2.15</version>

  61. </dependency>

  62. <dependency>

  63. <groupId>org.apache.commons</groupId>

  64. <artifactId>commons-lang3</artifactId>

  65. <version>${commons.lang.version}</version>

  66. </dependency>

  67. <dependency>

  68. <groupId>org.apache.commons</groupId>

  69. <artifactId>commons-collections4</artifactId>

  70. <version>4.1</version>

  71. </dependency>

  72. <dependency>

  73. <groupId>com.github.wenhao</groupId>

  74. <artifactId>jpa-spec</artifactId>

  75. <version>3.2.3</version>

  76. </dependency>

  77. </dependencies>

  78. <build>

  79. <sourceDirectory>src</sourceDirectory>

  80. <plugins>

  81. <plugin>

  82. <artifactId>maven-compiler-plugin</artifactId>

  83. <configuration>

  84. <source>1.8</source>

  85. <target>1.8</target>

  86. </configuration>

  87. </plugin>

  88. </plugins>

  89. </build>

  90. </project>

封装后使用

封装之后使用将非常简单,公共的Service行为将被封装处理

MySQL 动态数据访问

通过几行代码即可实现对MySQL的访问,同时支持动态的条件查询;

  • User

 
  1. @Entity

  2. @Table(name = "tb_user")

  3. public class User extends BaseEntity {

  4. private static final long serialVersionUID = 1L;

  5. /**

  6. * 用户id

  7. */

  8. @Id

  9. @GeneratedValue(strategy = GenerationType.AUTO)

  10. @Column(name = "id", nullable = false)

  11. private Integer id;

  12. private String userName;

  13. private String nickName;

  14. private String password;

  15. private Integer sex;

  16. private String telephone;

  17. private String email;

  18. private String address;

  19. private Integer deleteStatus;

  20. private Integer locked = 0;

  21. private String description;

  22. @JSONField(format = "yyyy-MM-dd HH:mm:ss")

  23. private Date createTime;

  24. @JSONField(format = "yyyy-MM-dd HH:mm:ss")

  25. private Date updateTime;

  26. @ManyToMany(cascade = { CascadeType.REFRESH }, fetch = FetchType.LAZY)

  27. @JoinTable(name = "tb_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = {

  28. @JoinColumn(name = "role_id") })

  29. private java.util.Set<Role> roles;

  30. // getter & setter

  31. }

  • Dao

 
  1. @Repository

  2. public interface IUserDao extends IBaseJpaDao<User, Integer>{

  3. }

  • Service

 
  1. public interface IUserService extends IBaseJpaService<User, Integer> {

  2. }

  3. @Service

  4. public class UserServiceImpl extends BaseJpaServiceImpl<User, Integer> implements IUserService {

  5. @Autowired

  6. private IUserDao userDao;

  7. @Override

  8. public IBaseJpaDao<User, Integer> getBaseDao() {

  9. return this.userDao;

  10. }

  11. @Override

  12. public void delete(Integer id) {

  13. User user = find(id);

  14. Assert.state(!"admin".equals(user.getUserName()), "超级管理员用户不能删除");

  15. super.delete(id);

  16. }

  17. }

  • Controller

 
  1. @RestController

  2. @RequestMapping("/admin/user")

  3. public class UserController {

  4. /**

  5. * user service

  6. */

  7. @Autowired

  8. private IUserService userService;

  9. /**

  10. * @param searchText

  11. * @param user

  12. * @param model

  13. * @return

  14. */

  15. @GetMapping(value = "/list")

  16. public List<User> list(@RequestParam(value = "searchText", required = false, defaultValue="a") String searchText) {

  17. return userService.findAll(Specifications.<User>and().like("userName", "%" + searchText + "%").build());

  18. }

  19. }

Mongo 动态数据访问

通过几行代码即可实现对Mongo的访问,同时支持动态的条件查询;

  • Entity

 
  1. @Document(collection = "security_alert_rules")

  2. public class EventRule extends BaseEntity {

  3. private static final long serialVersionUID = -2013673868028645757L;

  4. public static final int EVENT_STATUS_ENABLE = 0, EVENT_STATUS_DISABLE = 1;

  5. private String component;

  6. private String name;

  7. private String eventId;

  8. private String ciaLevel;

  9. private String remarks;

  10. private String script;

  11. private long threshold;

  12. private long timeWindow;

  13. private String parseEsResultKeys;

  14. private String nameCN;

  15. private String remarkCN;

  16. private String ruleType;

  17. private String redisEventKey;

  18. private int status = EVENT_STATUS_ENABLE;

  19. // getter & setter

  20. }

  • Dao

 
  1. @Repository

  2. public interface IEventRuleDao extends IBaseMongoDao<EventRule, String> {

  3. }

  • Service

 
  1. public interface IEventRuleService extends IBaseMongoService<EventRule, String> {

  2. }

  3. @Service

  4. public class EventRuleServiceImpl extends BaseMongoServiceImpl<EventRule, String> implements IEventRuleService {

  5. @Autowired

  6. IEventRuleDao eventRuleDao;

  7. @Override

  8. public IBaseMongoDao<EventRule, String> getBaseDao() {

  9. return eventRuleDao;

  10. }

  11. }

  • Controller

 
  1. @RestController

  2. @RequestMapping("/admin/eventRule")

  3. public class EventRuleController {

  4. /**

  5. */

  6. @Autowired

  7. private IEventRuleService eventRuleService;

  8. /**

  9. * @param searchText

  10. * @param user

  11. * @param model

  12. * @return

  13. */

  14. @GetMapping(value = "/list")

  15. public List<EventRule> list(@RequestParam(value = "searchText", required = false) String searchText) {

  16. EventRule param = new EventRule();

  17. param.setName(searchText);

  18. // Example<EventRule> rule = Example.<EventRule>of(param,

  19. // ExampleMatcher.matching().withMatcher("name", ExampleMatcher.GenericPropertyMatchers.exact()));

  20. Example<EventRule> rule = Example.<EventRule>of(param, ExampleMatcher.matching().withIgnoreCase("name","nameCN"));

  21. return eventRuleService.findAll(rule);

  22. }

  23. }

ElasticSearch 动态数据访问(单个index+type)

通过几行代码即可实现对ElasticSearch的访问,同时支持动态的条件查询;适合数据类型比较固定,且index和type独立的,比如强类型映射的实体类;

  • Entity

 
  1. @Document(indexName="syslog", type="logs")

  2. public class SysLog extends BaseEntity {

  3. private static final long serialVersionUID = -4491916941883088972L;

  4. @Id

  5. private String _id;

  6. private Set<String> phyPorts = new LinkedHashSet<>();

  7. private Set<String> ports = new LinkedHashSet<>();

  8. private String sensor;

  9. private int vlan;

  10. private Set<String> ip = new LinkedHashSet<>();

  11. private Set<String> mac = new LinkedHashSet<>();

  12. private String description;

  13. private String type;

  14. private String vendor;

  15. private long timestamp;

  16. private String name;

  17. private String chassisId;

  18. // getter & setter

  19. }

  • Dao

 
  1. @Repository

  2. public interface ISysLogDao extends IBaseESDao<SysLog, String> {

  3. }

  • Service

 
  1. public interface ILogService extends IBaseESService<SysLog, String> {

  2. }

  3. @Service

  4. public class LogServiceImpl extends BaseESServiceImpl<SysLog, String> implements ILogService {

  5. @Autowired

  6. ISysLogDao sysLogDao;

  7. @Override

  8. public IBaseESDao<SysLog, String> getBaseDao() {

  9. return sysLogDao;

  10. }

  11. }

  • Controller

 
  1. @RestController

  2. @RequestMapping("/admin/log")

  3. public class LogController {

  4. /**

  5. * user service

  6. */

  7. @Autowired

  8. private ILogService logService;

  9. /**

  10. * @param searchText

  11. * @param user

  12. * @param model

  13. * @return

  14. */

  15. @GetMapping(value = "/list")

  16. public Page<SysLog> list(@RequestParam(value = "searchText", required = false) String searchText) {

  17. return logService.search(QueryBuilders.matchQuery("_all", searchText), new PageRequest(0, 100));

  18. }

  19. }

ElasticSearch 动态数据访问(多个index+type)

通过几行代码即可实现对ElasticSearch的访问,同时支持动态的条件查询;适合数据类型不固定,且index和type有多个,这些index具备相同结构类型,比如syslog-EVERY-DATE(由于日志量大,将每天的日志单独存放在一个Index中);

  • Entity

 
  1. @Document(indexName="syslog", type="logs")

  2. public class SysLog extends BaseEntity {

  3. private static final long serialVersionUID = -4491916941883088972L;

  4. @Id

  5. private String _id;

  6. private Set<String> phyPorts = new LinkedHashSet<>();

  7. private Set<String> ports = new LinkedHashSet<>();

  8. private String sensor;

  9. private int vlan;

  10. private Set<String> ip = new LinkedHashSet<>();

  11. private Set<String> mac = new LinkedHashSet<>();

  12. private String description;

  13. private String type;

  14. private String vendor;

  15. private long timestamp;

  16. private String name;

  17. private String chassisId;

  18. // getter & setter

  19. }

  • Dao

 
  1. public interface IDymLogDao extends IDynamicEsDao<SysLog, String> {

  2. }

  3. @Repository

  4. public class DymLogDaoImpl extends SimpleDynamicEsDaoImpl<SysLog, String> implements IDymLogDao {

  5. @Autowired

  6. protected ElasticsearchTemplate elasticsearchTemplate;

  7. @Override

  8. public ElasticsearchOperations getElasticsearchOperations() {

  9. return elasticsearchTemplate;

  10. }

  11. }

  • Service

 
  1. public interface IDymLogService extends IDynamicESService<SysLog, String> {

  2. }

  3. @Service

  4. public class DymLogServiceImpl extends DynamicESServiceImpl<SysLog, String> implements IDymLogService {

  5. @Autowired

  6. IDymLogDao sysLogDao;

  7. @Override

  8. public IDynamicEsDao<SysLog, String> getBaseDao() {

  9. return sysLogDao;

  10. }

  11. }

  • Controller

 
  1. @RestController

  2. @RequestMapping("/admin/dymLog")

  3. public class DymLogController {

  4. /**

  5. * logService

  6. */

  7. @Autowired

  8. private IDymLogService logService;

  9. /**

  10. * @param searchText

  11. * @param user

  12. * @param model

  13. * @return

  14. */

  15. @GetMapping(value = "/list")

  16. public Page<SysLog> list(

  17. @RequestParam(value = "searchText", required = false, defaultValue = "Siemens") String searchText) {

  18. QueryBuilder queryBuilder = QueryBuilders.matchQuery("vendor", searchText);

  19. return logService.search(new NativeSearchQueryBuilder().withIndices("syslog-2018-12-17").withTypes("logs")

  20. .withQuery(queryBuilder).build());

  21. }

  22. }

源代码托管

https://github.com/realpdai/springboot-data-multidatasource-demo

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/127853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

坦克大战1.0,java时间处理机制

1.java 绘图坐标体系 1.1 坐标体系-介绍 下图说明了Java坐标系。坐标原点位于左上角&#xff0c;以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向,距离坐标原点y个像素。…

金融业务如何高性能传输数据

对系统要求高&#xff0c;通常按金融级标准设计。金融数据传输要求速度快&#xff0c;流量大&#xff0c;极强容灾。 案例分析 简化版券商算法交易平台对接交易所&#xff1a; 涉及场景多。既有事务数据&#xff0c;也有市场数据模型简单。只涉及到2个主体复杂度可选。连接交…

【结构型】装饰模式(Decorator)

目录装饰模式(Decorator)适用场景装饰模式实例代码&#xff08;Java&#xff09;装饰模式(Decorator) 动态地给一个对象添加一些额外的职责。就增加功能而言&#xff0c;装饰模式 (Decorator) 比生成子类更加灵活。 适用场景 在不影响其他对象的情况下&#xff0c;以动态、透…

2023让工作效率直线飞升

2022年马上就要过去&#xff0c;过去的一年&#xff0c;腾讯云HiFlow和众多腾讯系应用也帮助了许多企业完成数字化转型&#xff0c;许多没有代码基础的业务人员也能通过搭建工作流&#xff0c;高效的处理生活&工作的繁杂事务&#xff0c;时间精力节省50%。把时间花在更重要…

开源 | 携程机票跨端 Kotlin DSL 数据库框架 SQLlin

作者简介禹昂&#xff0c;携程机票移动端资深工程师&#xff0c;专注于 Kotlin 移动端跨平台领域&#xff0c;Kotlin 中文社区核心成员&#xff0c;图书《Kotlin 编程实践》译者。一、背景2022年9月 Kotlin 1.7.20 发布之后&#xff0c;Kotlin Multiplatform Mobile&#xff08…

【计算机图形学入门】笔记7:Shading着色1(光照与基本着色模型)

07Shading着色&#xff08;光照与基本着色模型&#xff09;1.深度缓冲Z-buffering1.画家算法&#xff1a;先把远处的东西画在屏幕上&#xff0c;再画近处的&#xff0c;从而近处物体覆盖远处物体。&#xff08;油画家&#xff09;2.深度缓冲2.Shading着色1.我们目前学了哪些知识…

CleanMyMacX2023系统清理优化工具使用评测

如果你的macbook有点年头空间不够开始卡顿了&#xff0c;或者你是windows用户刚转来的&#xff0c;我强烈建议你安装一个cleanmymac&#xff01;Mac电脑清理是可以直接使用储存空间管理&#xff08;关于本机->储存空间->管理&#xff09;来清理&#xff0c;但是这里的其他…

Android开发笔记(一百九十)增强了日志功能的第二版Logcat

从Android Studio Dolphin开始&#xff0c;查看应用日志的Logcat全面升级&#xff0c;堪称Logcat 2.0版本。下面就让我们看看LogcatV2.0究竟带来了什么新特性吧。 对于Android Studio的老用户来说&#xff0c;小海豚版本新出的LogcatV2.0在用法上有不小的差异&#xff0c;一开始…

Fisher卡方全流程汇总

Fisher卡方 卡方检验研究数据的独立性&#xff0c;在分析样本量较少&#xff08;比如小于40&#xff09;&#xff0c;也或者期望频数出现小于5时&#xff0c;此时使用fisher卡方检验较为适合。SPSSAU医学研究模块中的卡方检验时&#xff0c;有提供2*2即4表格时提供fisher卡方检…

魔方(14)133魔方、一阶鬼魔魔方、双心魔方

目录 133魔方 1&#xff0c;魔方三要素 2&#xff0c;复原方法 一阶鬼魔魔方 1&#xff0c;魔方三要素 2&#xff0c;复原方法 双心魔方 133魔方 1&#xff0c;魔方三要素 &#xff08;1&#xff09;组成部件 9个块&#xff0c;1个中心块&#xff0c;4个棱块&#xff…

ZYNQ - 以太网远程更新SD卡应用程序

写在前面 对于ZYNQ系列的板卡固化&#xff0c;可以通过JTAG接口&#xff0c;使用SDK固化到FLASH中&#xff0c;或者可将SD卡取出将SD卡中保存的固化工程进行修改&#xff0c;但在很多情况下&#xff0c;离线更新会很不方便&#xff0c;本文借鉴网上常见的远程更新QSPI FLASH的…

思维导图 制作

PPT e.g&#xff1a; WPS中ppt 新建 文本框一定要 在外框之内。 左键 全选中&#xff0c;就会出来如下。 可直接点居中&#xff0c;就不用浪费time调位置 全选中&#xff0c;右键&#xff0c;【组合】 形成整体&#xff0c;可复制到word中 选择性粘贴到word中 skill: 左键…

《Linux运维总结:Centos7.6源码安装单实例redis6.2.8》

一、部署redis服务 1.1、环境信息 环境信息如下&#xff1a; 主机IP操作系统Redis版本CPU架构192.168.1.191Centos7.66.2.8x86_641.2、二进制方式 1、安装环境依赖 [rootlocalhost ~]# yum -y install gcc2、安装包下载 [rootlocalhost ~]# wget https://download.redis.io…

Linux-线程(LWP)

文章目录线程线程概念进程今天的进程 vs之前的进程私有和共享资源实验验证线程的优点&#xff1a;线程的缺点&#xff1a;线程异常线程的用途&#xff1a;线程控制创建线程(1)先创建两个线程&#xff1a;链接时要引入第三方库。(2)创建多个线程&#xff1a;(3)线程的健壮性不强…

Pandas 替换 NaN 值

替换Pandas DataFram中的 NaN 值 问题 NaN 代表 Not A Number&#xff0c;是表示数据中缺失值的常用方法之一。它是一个特殊的浮点值&#xff0c;不能转换为 float 以外的任何其他类型。NaN 值是数据分析中的主要问题之一。为了得到理想的结果&#xff0c;对 NaN 进行处理是非…

LeetCode刷题复盘笔记—一文搞懂动态规划之53. 最大子数组和问题(动态规划系列第三十五篇)

今日主要总结一下动态规划的一道题目&#xff0c;53. 最大子数组和 题目&#xff1a;53. 最大子数组和 Leetcode题目地址 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#…

成年人的崩溃一触即发,掌握学习能力才能突破认知结界,干货满满!

成年人的崩溃一触即发&#xff0c;掌握学习能力才能突破认知结界&#xff01; 今年2月份&#xff08;2022-02&#xff09;&#xff0c;从小红书上购买了知识博主【老明读书】&#xff0c;针对学习能力的讲解分析&#xff0c;真是干货满满&#xff01;非常感谢老明&#xff0c;…

FPGA项目案例展示

MIPI视频拼接&#xff1a; 在无人机、智能驾驶中&#xff0c;摄像头多达十几路 为解决图像处理芯片&#xff08;如海思、高通平台&#xff09;的接口瓶颈 需要将多个摄像头合成一路处理。 SLVS-EC转MIPI SLVS-EC采集&#xff0c;LANE速率可达4.6G MIPI输出&#xff0c;速率2.…

基于ASP.net Mvc的超市管理系统

摘 要 网络的广泛应用给生活带来了十分的便利。所以把天美意超市管理与现在网络相结合&#xff0c;利用net语言建设天美意超市管理系统&#xff0c;实现天美意超市管理的信息化。则对于进一步提高天美意超市发展&#xff0c;丰富天美意超市管理系统能起到不少的促进作用。 天美…

SHELL 脚本练习 一

习题一 &#xff1a;在当前主机编写脚本文件history_max.sh显示主机中执行频率最高的前5个命令 习题二 &#xff1a; 判断主机是否存在rhel用户&#xff0c;如果存在则设置密码为redhat,如果不存在则创建用户 并设置密码 习题三 &#xff1a;通过设置变量HISTTIMEFORMAT&#x…