天天看點

@manytomany 儲存後資料被删除_Spring Boot騷操作多資料源Service層封裝

原文:https://www.pdai.tech/md/spring/springboot-data-multi.html
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支援
  • 大大簡化封裝之後的調用, 調用方式如下
@manytomany 儲存後資料被删除_Spring Boot騷操作多資料源Service層封裝

封裝的一些配置

application.yml

banner:

charset: UTF-8

location: classpath:banner.txt

server:

port: 5555

contextPath: /

session:

timeout: 0

spring:

application:

name: 'spring-boot-datasource-demo'

output:

ansi:

enabled: DETECT

messages:

basename: i18n/messages

thymeleaf:

cache: false

profiles:

active: dev

# MySQL data source settings

datasource:

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

username: root

password: bfXa4Pt2lUUScy8jakXf

# MySQL JPA settings

jpa:

generate-ddl: true

show-sql: true

properties:

hibernate:

dialect: org.hibernate.dialect.MySQLDialect

format_sql: true

# NoSQL data source settings

data:

# MongoDB 2.2+ settings

mongodb:

uri: mongodb://standalone:[email protected]:27017/standalone

# ElasticSearch settings

elasticsearch:

cluster-name: es-logs-01

cluster-nodes: 10.11.60.5:9300

pom.xml

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

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

4.0.0

spring-boot-datasource-demo

spring-boot-datasource-demo

0.0.1-SNAPSHOT

spring-boot-datasource-demo

spring-boot-datasource-demo

org.springframework.boot

spring-boot-starter-parent

1.4.1.RELEASE

UTF-8

UTF-8

1.8

3.3.2

2.7.0

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-data-mongodb

org.springframework.boot

spring-boot-starter-data-elasticsearch

org.springframework.boot

spring-boot-starter-data-jpa

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-web

io.springfox

springfox-swagger2

${springfox.version}

io.springfox

springfox-swagger-ui

${springfox.version}

com.alibaba

fastjson

1.2.15

org.apache.commons

commons-lang3

${commons.lang.version}

org.apache.commons

commons-collections4

4.1

com.github.wenhao

jpa-spec

3.2.3

src

maven-compiler-plugin

1.8

1.8

封裝後使用

封裝之後使用将非常簡單,公共的Service行為将被封裝處理

MySQL 動态資料通路

通過幾行代碼即可實作對MySQL的通路,同時支援動态的條件查詢;
  • User

@Entity

@Table(name = "tb_user")

public class User extends BaseEntity {

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.AUTO)

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

private Integer id;

private String userName;

private String nickName;

private String password;

private Integer sex;

private String telephone;

private String email;

private String address;

private Integer deleteStatus;

private Integer locked = 0;

private String description;

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

private Date createTime;

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

private Date updateTime;

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

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

@JoinColumn(name = "role_id") })

private java.util.Set<Role> roles;

// getter & setter

}

  • Dao

@Repository

public interface IUserDao extends IBaseJpaDao<User, Integer>{

}

  • Service

public interface IUserService extends IBaseJpaService<User, Integer> {

}

@Service

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

@Autowired

private IUserDao userDao;

@Override

public IBaseJpaDao<User, Integer> getBaseDao() {

return this.userDao;

}

@Override

public void delete(Integer id) {

User user = find(id);

Assert.state(!"admin".equals(user.getUserName()), "超級管理者使用者不能删除");

super.delete(id);

}

}

  • Controller

@RestController

@RequestMapping("/admin/user")

public class UserController {

@Autowired

private IUserService userService;

@GetMapping(value = "/list")

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

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

}

}

Mongo 動态資料通路

通過幾行代碼即可實作對Mongo的通路,同時支援動态的條件查詢;
  • Entity

@Document(collection = "security_alert_rules")

public class EventRule extends BaseEntity {

private static final long serialVersionUID = -2013673868028645757L;

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

private String component;

private String name;

private String eventId;

private String ciaLevel;

private String remarks;

private String script;

private long threshold;

private long timeWindow;

private String parseEsResultKeys;

private String nameCN;

private String remarkCN;

private String ruleType;

private String redisEventKey;

private int status = EVENT_STATUS_ENABLE;

// getter & setter

}

  • Dao

@Repository

public interface IEventRuleDao extends IBaseMongoDao<EventRule, String> {

}

  • Service

public interface IEventRuleService extends IBaseMongoService<EventRule, String> {

}

@Service

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

@Autowired

IEventRuleDao eventRuleDao;

@Override

public IBaseMongoDao<EventRule, String> getBaseDao() {

return eventRuleDao;

}

}

  • Controller

@RestController

@RequestMapping("/admin/eventRule")

public class EventRuleController {

@Autowired

private IEventRuleService eventRuleService;

@GetMapping(value = "/list")

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

EventRule param = new EventRule();

param.setName(searchText);

// Example rule = Example.of(param,

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

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

return eventRuleService.findAll(rule);

}

}

ElasticSearch 動态資料通路(單個index+type)

通過幾行代碼即可實作對ElasticSearch的通路,同時支援動态的條件查詢;适合資料類型比較固定,且index和type獨立的,比如強類型映射的實體類;
  • Entity

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

public class SysLog extends BaseEntity {

private static final long serialVersionUID = -4491916941883088972L;

@Id

private String _id;

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

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

private String sensor;

private int vlan;

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

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

private String description;

private String type;

private String vendor;

private long timestamp;

private String name;

private String chassisId;

// getter & setter

}

  • Dao

@Repository

public interface ISysLogDao extends IBaseESDao<SysLog, String> {

}

  • Service

public interface ILogService extends IBaseESService<SysLog, String> {

}

@Service

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

@Autowired

ISysLogDao sysLogDao;

@Override

public IBaseESDao<SysLog, String> getBaseDao() {

return sysLogDao;

}

}

  • Controller

@RestController

@RequestMapping("/admin/log")

public class LogController {

@Autowired

private ILogService logService;

@GetMapping(value = "/list")

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

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

}

}

ElasticSearch 動态資料通路(多個index+type)

通過幾行代碼即可實作對ElasticSearch的通路,同時支援動态的條件查詢;适合資料類型不固定,且index和type有多個,這些index具備相同結構類型,比如syslog-EVERY-DATE(由于日志量大,将每天的日志單獨存放在一個Index中);
  • Entity

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

public class SysLog extends BaseEntity {

private static final long serialVersionUID = -4491916941883088972L;

@Id

private String _id;

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

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

private String sensor;

private int vlan;

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

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

private String description;

private String type;

private String vendor;

private long timestamp;

private String name;

private String chassisId;

// getter & setter

}

  • Dao

public interface IDymLogDao extends IDynamicEsDao<SysLog, String> {

}

@Repository

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

@Autowired

protected ElasticsearchTemplate elasticsearchTemplate;

@Override

public ElasticsearchOperations getElasticsearchOperations() {

return elasticsearchTemplate;

}

}

  • Service

public interface IDymLogService extends IDynamicESService<SysLog, String> {

}

@Service

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

@Autowired

IDymLogDao sysLogDao;

@Override

public IDynamicEsDao<SysLog, String> getBaseDao() {

return sysLogDao;

}

}

  • Controller

@RestController

@RequestMapping("/admin/dymLog")

public class DymLogController {

@Autowired

private IDymLogService logService;

@GetMapping(value = "/list")

public Page<SysLog> list(

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

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

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

.withQuery(queryBuilder).build());

}

}

源代碼托管

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

@manytomany 儲存後資料被删除_Spring Boot騷操作多資料源Service層封裝

Java8 的 Stream API 的确牛X,但性能究竟如何呢?一個接口查詢關聯了十幾張表,響應速度太慢?那就提前把它們整合到一起請不要在 JDK 7+ 中使用這個 JSON 包了優秀!進階Java都這樣優雅處理空值還在擔心寫的一手爛SQL,送你4款工具

推薦關注:Java老鳥Python學習日記

@manytomany 儲存後資料被删除_Spring Boot騷操作多資料源Service層封裝

代碼之外,亦是人生,從事區塊鍊、java、大資料開發工程師的後花園筆記。記錄學習python的每一步!

繼續閱讀