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

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

程序员小乐

来自:@pdai | 责编:乐乐

链接:pdai.tech/md/spring/springboot-data-multi.html

程序员小乐(ID:study_tech)第 920 次推文  图源:百度

往日回顾:Git从入门到放不下

   正文   

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.  

  22. # MySQL data source settings

  23. datasource:

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

  25. username: root

  26. password: bfXa4Pt2lUUScy8jakXf

  27. # MySQL JPA settings

  28. jpa:

  29. generate-ddl: true

  30. show-sql: true

  31. properties:

  32. hibernate:

  33. dialect: org.hibernate.dialect.MySQLDialect

  34. format_sql: true

  35. # NoSQL data source settings

  36. data:

  37. # MongoDB 2.2+ settings

  38. mongodb:

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

  40. # ElasticSearch settings

  41. elasticsearch:

  42. cluster-name: es-logs-01

  43. 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.  

  10. <parent>

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

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

  13. <version>1.4.1.RELEASE</version>

  14. </parent>

  15.  

  16. <properties>

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

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

  19. <java.version>1.8</java.version>

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

  21. <springfox.version>2.7.0</springfox.version>

  22. </properties>

  23.  

  24. <dependencies>

  25. <dependency>

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

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

  28. </dependency>

  29. <dependency>

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

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

  32. </dependency>

  33. <dependency>

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

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

  36. </dependency>

  37. <dependency>

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

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

  40. </dependency>

  41. <dependency>

  42. <groupId>mysql</groupId>

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

  44. <scope>runtime</scope>

  45. </dependency>

  46. <dependency>

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

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

  49. </dependency>

  50.  

  51. <dependency>

  52. <groupId>io.springfox</groupId>

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

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

  55. </dependency>

  56. <dependency>

  57. <groupId>io.springfox</groupId>

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

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

  60. </dependency>

  61.  

  62. <dependency>

  63. <groupId>com.alibaba</groupId>

  64. <artifactId>fastjson</artifactId>

  65. <version>1.2.15</version>

  66. </dependency>

  67. <dependency>

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

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

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

  71. </dependency>

  72. <dependency>

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

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

  75. <version>4.1</version>

  76. </dependency>

  77.  

  78. <dependency>

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

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

  81. <version>3.2.3</version>

  82. </dependency>

  83.  

  84. </dependencies>

  85.  

  86. <build>

  87. <sourceDirectory>src</sourceDirectory>

  88. <plugins>

  89. <plugin>

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

  91. <configuration>

  92. <source>1.8</source>

  93. <target>1.8</target>

  94. </configuration>

  95. </plugin>

  96. </plugins>

  97. </build>

  98. </project>

 

封装后使用

 

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

 

MySQL 动态数据访问

 

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

User

 

 
  1. @Entity

  2. @Table(name = "tb_user")

  3. public class User extends BaseEntity {

  4.  

  5. private static final long serialVersionUID = 1L;

  6.  

  7. /**

  8. * 用户id

  9. */

  10. @Id

  11. @GeneratedValue(strategy = GenerationType.AUTO)

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

  13. private Integer id;

  14. private String userName;

  15. private String nickName;

  16. private String password;

  17. private Integer sex;

  18. private String telephone;

  19. private String email;

  20. private String address;

  21. private Integer deleteStatus;

  22. private Integer locked = 0;

  23. private String description;

  24.  

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

  26. private Date createTime;

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

  28. private Date updateTime;

  29.  

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

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

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

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

  34.  

  35. // getter & setter

  36. }

 

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. /**

  6. * user service

  7. */

  8. @Autowired

  9. private IUserService userService;

  10.  

  11. /**

  12. * @param searchText

  13. * @param user

  14. * @param model

  15. * @return

  16. */

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

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

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

  20. }

  21. }

 

Mongo 动态数据访问

 

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

Entity

 

 
  1. @Document(collection = "security_alert_rules")

  2. public class EventRule extends BaseEntity {

  3.  

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

  5.  

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

  7.  

  8. private String component;

  9. private String name;

  10. private String eventId;

  11. private String ciaLevel;

  12. private String remarks;

  13. private String script;

  14. private long threshold;

  15. private long timeWindow;

  16. private String parseEsResultKeys;

  17. private String nameCN;

  18. private String remarkCN;

  19. private String ruleType;

  20. private String redisEventKey;

  21. private int status = EVENT_STATUS_ENABLE;

  22.  

  23. // getter & setter

  24. }

 

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. */

  7. @Autowired

  8. private IEventRuleService eventRuleService;

  9.  

  10. /**

  11. * @param searchText

  12. * @param user

  13. * @param model

  14. * @return

  15. */

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

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

  18. EventRule param = new EventRule();

  19. param.setName(searchText);

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

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

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

  23. return eventRuleService.findAll(rule);

  24. }

  25. }

 

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

 

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

Entity

 

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

  2. public class SysLog extends BaseEntity {

  3.  

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

  5.  

  6. @Id

  7. private String _id;

  8.  

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

  10.  

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

  12. private String sensor;

  13. private int vlan;

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

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

  16. private String description;

  17. private String type;

  18. private String vendor;

  19. private long timestamp;

  20. private String name;

  21. private String chassisId;

  22.  

  23. // getter & setter

  24.  

  25. }

 

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. /**

  11. * @param searchText

  12. * @param user

  13. * @param model

  14. * @return

  15. */

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

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

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

  19. }

  20. }

 

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.  

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

  5.  

  6. @Id

  7. private String _id;

  8.  

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

  10.  

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

  12. private String sensor;

  13. private int vlan;

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

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

  16. private String description;

  17. private String type;

  18. private String vendor;

  19. private long timestamp;

  20. private String name;

  21. private String chassisId;

  22.  

  23. // getter & setter

  24.  

  25. }

 

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. /**

  6. * logService

  7. */

  8. @Autowired

  9. private IDymLogService logService;

  10.  

  11. /**

  12. * @param searchText

  13. * @param user

  14. * @param model

  15. * @return

  16. */

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

  18. public Page<SysLog> list(

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

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

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

  22. .withQuery(queryBuilder).build());

  23. }

  24. }

 

源代码托管

 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值