From a63143aeb0ce4f30b98db8222437763dd6e20b85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=97=A0=E9=99=90=E8=B6=85=E9=A2=91?= <102959041@qq.com>
Date: Thu, 18 Apr 2019 19:12:47 +0800
Subject: [PATCH] init
---
.gitignore | 28 +++
hibernate/pom.xml | 96 ++++++++++
.../src/main/java/annotation/TableInfo.java | 16 ++
.../src/main/java/config/BaseService.java | 57 ++++++
hibernate/src/main/java/config/DBType.java | 35 ++++
.../src/main/java/config/HibernateConfig.java | 170 ++++++++++++++++++
.../src/main/java/config/InitConfig.java | 16 ++
.../src/main/java/config/ParseDataSource.java | 9 +
.../java/config/SessionFactoryConfig.java | 10 ++
.../src/main/java/model/AbstractModel.java | 18 ++
.../src/main/java/model/DataSourceModel.java | 129 +++++++++++++
mybatis/pom.xml | 95 ++++++++++
mybatis/src/main/java/config/DBType.java | 24 +++
mybatis/src/main/java/config/InitConfig.java | 16 ++
.../src/main/java/config/MyBatisConfig.java | 107 +++++++++++
.../src/main/java/model/DataSourceModel.java | 107 +++++++++++
16 files changed, 933 insertions(+)
create mode 100644 .gitignore
create mode 100644 hibernate/pom.xml
create mode 100644 hibernate/src/main/java/annotation/TableInfo.java
create mode 100644 hibernate/src/main/java/config/BaseService.java
create mode 100644 hibernate/src/main/java/config/DBType.java
create mode 100644 hibernate/src/main/java/config/HibernateConfig.java
create mode 100644 hibernate/src/main/java/config/InitConfig.java
create mode 100644 hibernate/src/main/java/config/ParseDataSource.java
create mode 100644 hibernate/src/main/java/config/SessionFactoryConfig.java
create mode 100644 hibernate/src/main/java/model/AbstractModel.java
create mode 100644 hibernate/src/main/java/model/DataSourceModel.java
create mode 100644 mybatis/pom.xml
create mode 100644 mybatis/src/main/java/config/DBType.java
create mode 100644 mybatis/src/main/java/config/InitConfig.java
create mode 100644 mybatis/src/main/java/config/MyBatisConfig.java
create mode 100644 mybatis/src/main/java/model/DataSourceModel.java
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..d01ee63
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,28 @@
+# Created by .ignore support plugin (hsz.mobi)
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+/.idea/
+*.iml
diff --git a/hibernate/pom.xml b/hibernate/pom.xml
new file mode 100644
index 0000000..f3e3522
--- /dev/null
+++ b/hibernate/pom.xml
@@ -0,0 +1,96 @@
+
+
+ 4.0.0
+
+ org.pqh
+ hibernate
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+ 5.4.2.Final
+ 5.1.6.RELEASE
+ 2.11.2
+ 1.1.15
+ 3.8.1
+ 2.6
+ 8.0.15
+ 1.2.56
+
+
+
+
+ org.hibernate
+ hibernate-core
+ ${hibernate-core.version}
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
+
+
+ org.springframework
+ spring-orm
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ org.apache.logging.log4j
+ log4j-web
+ ${log4j.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+
+
+
+
\ No newline at end of file
diff --git a/hibernate/src/main/java/annotation/TableInfo.java b/hibernate/src/main/java/annotation/TableInfo.java
new file mode 100644
index 0000000..9319783
--- /dev/null
+++ b/hibernate/src/main/java/annotation/TableInfo.java
@@ -0,0 +1,16 @@
+package annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE})
+/**
+ * 表备注信息
+ */
+public @interface TableInfo {
+ //表别名
+ String comment();
+}
diff --git a/hibernate/src/main/java/config/BaseService.java b/hibernate/src/main/java/config/BaseService.java
new file mode 100644
index 0000000..8d321ab
--- /dev/null
+++ b/hibernate/src/main/java/config/BaseService.java
@@ -0,0 +1,57 @@
+package config;
+
+import model.AbstractModel;
+import org.hibernate.criterion.DetachedCriteria;
+import org.hibernate.criterion.Projections;
+import org.springframework.dao.DataAccessException;
+import org.springframework.orm.hibernate5.HibernateTemplate;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * Created by reborn on 2017/7/28.
+ */
+
+public abstract class BaseService {
+
+ public abstract HibernateTemplate getHibernateTemplate();
+
+ public Serializable save(T command) throws DataAccessException {
+ return getHibernateTemplate().save(command);
+ }
+
+ public void update(T command) throws DataAccessException{
+ getHibernateTemplate().update(command);
+ }
+
+ public final T get(T command) throws DataAccessException {
+ return (T) getHibernateTemplate().get((Class)(command.getClass()), command.primaryKey());
+ }
+
+ public void delete(T command) throws DataAccessException{
+ T model=get(command);
+ if(model!=null){
+ getHibernateTemplate().delete(model);
+ }
+ }
+
+ public final List find(DetachedCriteria criteria, int firstResult,int maxResults) throws DataAccessException{
+ return getHibernateTemplate().findByCriteria(criteria,firstResult,maxResults);
+ }
+
+ public final List find(DetachedCriteria criteria) throws DataAccessException{
+ return getHibernateTemplate().findByCriteria(criteria);
+ }
+
+ /**
+ * 根据查询条件统计记录数
+ * @param criteria
+ * @return
+ */
+ public Long rowCount(DetachedCriteria criteria){
+ return getHibernateTemplate().executeWithNativeSession(session -> (Long) criteria.setProjection(Projections.rowCount()).getExecutableCriteria(session).uniqueResult());
+ }
+
+
+}
diff --git a/hibernate/src/main/java/config/DBType.java b/hibernate/src/main/java/config/DBType.java
new file mode 100644
index 0000000..ed10ff8
--- /dev/null
+++ b/hibernate/src/main/java/config/DBType.java
@@ -0,0 +1,35 @@
+package config;
+
+import org.hibernate.dialect.Dialect;
+import org.hibernate.dialect.MySQL57Dialect;
+
+import java.sql.Driver;
+
+public enum DBType{
+ mysql57(com.mysql.cj.jdbc.Driver.class, MySQL57Dialect.class);
+
+ private Class extends Driver> driver;
+ private Class extends Dialect> dialect;
+
+ DBType(Class extends Driver> driver, Class extends Dialect> dialect) {
+ this.driver = driver;
+ this.dialect = dialect;
+ }
+
+ public Class extends Driver> getDriver() {
+ return driver;
+ }
+
+ public Class extends Dialect> getDialect() {
+ return dialect;
+ }
+
+ public String getUrl(String host,int port,String name){
+ switch (DBType.valueOf(this.name())){
+ case mysql57: return "jdbc:mysql://" + host + ":" + port + "/" + name + "?serverTimezone=GMT%2b8";
+ default:throw new RuntimeException("NotFound type:"+this.name());
+ }
+ }
+
+
+}
diff --git a/hibernate/src/main/java/config/HibernateConfig.java b/hibernate/src/main/java/config/HibernateConfig.java
new file mode 100644
index 0000000..1f5ba45
--- /dev/null
+++ b/hibernate/src/main/java/config/HibernateConfig.java
@@ -0,0 +1,170 @@
+package config;
+
+import annotation.TableInfo;
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import model.DataSourceModel;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.SessionFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.orm.hibernate5.HibernateTemplate;
+import org.springframework.orm.hibernate5.HibernateTransactionManager;
+import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
+import org.springframework.util.ResourceUtils;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.lang.annotation.Annotation;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Created by reborn on 2017/7/28.
+ */
+public class HibernateConfig extends InitConfig {
+
+ private static final String CONFIG_NAME = "classpath:database.json";
+
+ @Autowired
+ private DefaultListableBeanFactory beanFactory;
+
+ private static final Map tableNotes = new HashMap<>();
+
+ public static TableInfo getTableNote(Class c) {
+ return tableNotes.get(c);
+ }
+
+ private static final Map, SessionFactory> map = new HashMap<>();
+
+ public static SessionFactory get(Class extends Annotation> c) {
+ return map.get(c);
+ }
+
+ /**
+ * 注册数据源
+ *
+ * @param dbName 数据库名
+ * @param dbPort 端口
+ * @param username 用户名
+ * @param password 密码
+ * @param type 数据库类型
+ * @return
+ */
+ private DruidDataSource dataSource(String dbHost, String dbName, int dbPort, String username, String password, DBType type) {
+ DruidDataSource dataSource = new DruidDataSource();
+ dataSource.setUsername(username);
+ dataSource.setPassword(password);
+ String url = "";
+ switch (type) {
+ case mysql57:
+ url = type.getUrl(dbHost, dbPort, dbName);
+ dataSource.setUrl(url);
+ dataSource.setDriverClassName(type.getDriver().getName());
+ break;
+ }
+ LOG.info("数据源初始化\nurl=" + url + "\nusername=" + username + "\npassword=" + password);
+ return dataSource;
+ }
+
+ private DruidDataSource dataSource(DataSourceModel dataSourceModel) {
+ return dataSource(dataSourceModel.getHost(), dataSourceModel.getDbName(), dataSourceModel.getPort(), dataSourceModel.getUsername(), dataSourceModel.getPassword(), dataSourceModel.getDbType());
+ }
+
+ /**
+ * 初始化数据源
+ *
+ * @param dataSourceModel
+ * @return
+ */
+ private HibernateTemplate initDB(DataSourceModel dataSourceModel) throws IOException {
+ DruidDataSource dataSource = dataSource(dataSourceModel);
+ SessionFactory sessionFactory = initSessionFactory(dataSource, (LocalSessionFactoryBean bean) -> {
+ //按照注解标记从指定包扫描实体类,并且注册到session工厂
+ bean.setPackagesToScan(dataSourceModel.getPackagesToScan());
+ bean.setEntityTypeFilters(new AnnotationTypeFilter(dataSourceModel.getAnnotation()));
+ }, dataSourceModel.getDbName(), dataSourceModel.getDbType().getDialect().getName());
+
+ beanFactory.registerSingleton(dataSourceModel.getSessionFactoryBean(), sessionFactory);
+ if (sessionFactory != null) {
+ HibernateTransactionManager hibernateTransactionManager = new HibernateTransactionManager();
+ hibernateTransactionManager.setSessionFactory(sessionFactory);
+ hibernateTransactionManager.setDataSource(dataSource);
+ hibernateTransactionManager.afterPropertiesSet();
+ //添加事务管理器
+ beanFactory.registerSingleton(dataSourceModel.getTransactionManagerBean(), hibernateTransactionManager);
+ return new HibernateTemplate(sessionFactory);
+ } else {
+ throw new RuntimeException("sessionFactory is Null");
+ }
+ }
+
+
+ /**
+ * 初始化数据源,session工厂
+ */
+ private void init() {
+
+ //从根数据源读取其他数据源信息,并初始化
+ List dataSourceModels;
+ try {
+ dataSourceModels = JSON.parseObject(FileUtils.readFileToString(ResourceUtils.getFile(CONFIG_NAME), "UTF-8"), new TypeReference>() {
+ });
+ } catch (IOException e) {
+ LOG.error("解析数据库配置失败");
+ throw new RuntimeException(e);
+ }
+
+ if (dataSourceModels.size() == 0) {
+ throw new RuntimeException("没有配置数据源,初始化失败");
+ }
+ dataSourceModels.forEach(dataSourceModel -> {
+ if (map.containsKey(dataSourceModel.getAnnotation())) {
+ throw new RuntimeException("数据库配置无效,注解" + dataSourceModel.getAnnotation() + "已重复");
+ }
+ HibernateTemplate hibernateTemplate;
+ try {
+ hibernateTemplate = initDB(dataSourceModel);
+ beanFactory.registerSingleton(dataSourceModel.getHibernateBean(), hibernateTemplate);
+ map.put(dataSourceModel.getAnnotation(), hibernateTemplate.getSessionFactory());
+ } catch (IOException e) {
+ LOG.error("无法获取HibernateTemplate");
+ throw new RuntimeException(e);
+ }
+ });
+ }
+
+ /**
+ * 初始化session工厂
+ *
+ * @param dataSource
+ * @param config
+ * @return
+ */
+ private SessionFactory initSessionFactory(DataSource dataSource, SessionFactoryConfig config, String defaultSchema, String dialect) throws IOException {
+ LocalSessionFactoryBean bean = new LocalSessionFactoryBean();
+ Properties properties = new Properties();
+ properties.setProperty("hibernate.dialect", dialect);
+ properties.setProperty("hibernate.format_sql", "true");
+ if (StringUtils.isNotEmpty(defaultSchema)) {
+ properties.setProperty("hibernate.default_schema", defaultSchema);
+ }
+ bean.setHibernateProperties(properties);
+ bean.setDataSource(dataSource);
+ config.call(bean);
+ bean.afterPropertiesSet();
+ return bean.getObject();
+ }
+
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ super.afterPropertiesSet();
+ init();
+ }
+}
diff --git a/hibernate/src/main/java/config/InitConfig.java b/hibernate/src/main/java/config/InitConfig.java
new file mode 100644
index 0000000..73c4f6b
--- /dev/null
+++ b/hibernate/src/main/java/config/InitConfig.java
@@ -0,0 +1,16 @@
+package config;
+
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.util.ClassUtils;
+
+public class InitConfig implements InitializingBean {
+ public static final Logger LOG = LogManager.getLogger();
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ LOG.info("初始化"+ ClassUtils.getUserClass(this.getClass())+"配置");
+ }
+}
diff --git a/hibernate/src/main/java/config/ParseDataSource.java b/hibernate/src/main/java/config/ParseDataSource.java
new file mode 100644
index 0000000..b63b43b
--- /dev/null
+++ b/hibernate/src/main/java/config/ParseDataSource.java
@@ -0,0 +1,9 @@
+package config;
+
+import model.DataSourceModel;
+
+import java.util.List;
+
+public interface ParseDataSource {
+ List parse();
+}
diff --git a/hibernate/src/main/java/config/SessionFactoryConfig.java b/hibernate/src/main/java/config/SessionFactoryConfig.java
new file mode 100644
index 0000000..ec6b43f
--- /dev/null
+++ b/hibernate/src/main/java/config/SessionFactoryConfig.java
@@ -0,0 +1,10 @@
+package config;
+
+import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
+
+/**
+ * 每个工厂有个性化配置单独封装一个回调函数
+ */
+public interface SessionFactoryConfig {
+ void call(LocalSessionFactoryBean bean);
+}
diff --git a/hibernate/src/main/java/model/AbstractModel.java b/hibernate/src/main/java/model/AbstractModel.java
new file mode 100644
index 0000000..647ed06
--- /dev/null
+++ b/hibernate/src/main/java/model/AbstractModel.java
@@ -0,0 +1,18 @@
+package model;
+
+import com.alibaba.fastjson.JSON;
+
+import java.io.Serializable;
+
+/**
+ * Created by reborn on 2017/8/3.
+ */
+
+public abstract class AbstractModel{
+
+ public abstract Serializable primaryKey();
+
+ public String toJSON(){
+ return JSON.toJSONString(this);
+ }
+}
diff --git a/hibernate/src/main/java/model/DataSourceModel.java b/hibernate/src/main/java/model/DataSourceModel.java
new file mode 100644
index 0000000..cbdfa2c
--- /dev/null
+++ b/hibernate/src/main/java/model/DataSourceModel.java
@@ -0,0 +1,129 @@
+package model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import config.DBType;
+
+import java.lang.annotation.Annotation;
+
+public class DataSourceModel {
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+ private String dbName;
+ private DBType dbType;
+ private String dbDesc;
+ private Class extends Annotation> annotation;
+ private String sessionFactoryBean;
+ private String hibernateBean;
+ private String transactionManagerBean;
+ private String packagesToScan[];
+
+ @JSONField
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ @JSONField
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ @JSONField
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ @JSONField
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ @JSONField
+ public String getDbName() {
+ return dbName;
+ }
+
+ public void setDbName(String dbName) {
+ this.dbName = dbName;
+ }
+
+ @JSONField
+ public DBType getDbType() {
+ return dbType;
+ }
+
+ public void setDbType(DBType dbType) {
+ this.dbType = dbType;
+ }
+
+ @JSONField
+ public String getDbDesc() {
+ return dbDesc;
+ }
+
+ public void setDbDesc(String dbDesc) {
+ this.dbDesc = dbDesc;
+ }
+
+ @JSONField
+ public Class extends Annotation> getAnnotation() {
+ return annotation;
+ }
+
+ public void setAnnotation(Class extends Annotation> annotation) {
+ this.annotation = annotation;
+ }
+
+ @JSONField
+ public String getSessionFactoryBean() {
+ return sessionFactoryBean;
+ }
+
+ public void setSessionFactoryBean(String sessionFactoryBean) {
+ this.sessionFactoryBean = sessionFactoryBean;
+ }
+
+ @JSONField
+ public String getHibernateBean() {
+ return hibernateBean;
+ }
+
+ public void setHibernateBean(String hibernateBean) {
+ this.hibernateBean = hibernateBean;
+ }
+
+ @JSONField
+ public String getTransactionManagerBean() {
+ return transactionManagerBean;
+ }
+
+ public void setTransactionManagerBean(String transactionManagerBean) {
+ this.transactionManagerBean = transactionManagerBean;
+ }
+
+ @JSONField
+ public String[] getPackagesToScan() {
+ return packagesToScan;
+ }
+
+ public void setPackagesToScan(String... packagesToScan) {
+ this.packagesToScan = packagesToScan;
+ }
+}
diff --git a/mybatis/pom.xml b/mybatis/pom.xml
new file mode 100644
index 0000000..2a245b9
--- /dev/null
+++ b/mybatis/pom.xml
@@ -0,0 +1,95 @@
+
+
+ 4.0.0
+
+ org.pqh
+ mybatis
+ 1.0-SNAPSHOT
+
+
+ UTF-8
+ UTF-8
+ 1.8
+ 8.0.15
+ 2.0.1
+ 1.2.56
+ 2.11.2
+ 1.1.15
+ 5.1.6.RELEASE
+ 2.6
+ 3.5.1
+
+
+
+
+ org.springframework
+ spring-orm
+ ${spring.version}
+
+
+
+ org.springframework
+ spring-context
+ ${spring.version}
+
+
+
+ mysql
+ mysql-connector-java
+ ${mysql.version}
+
+
+
+ org.mybatis
+ mybatis
+ ${mybatis.version}
+
+
+
+ org.mybatis
+ mybatis-spring
+ ${mybatis-spring.version}
+
+
+
+ org.apache.logging.log4j
+ log4j-web
+ ${log4j.version}
+
+
+
+ com.alibaba
+ druid
+ ${druid.version}
+
+
+
+ com.alibaba
+ fastjson
+ ${fastjson.version}
+
+
+
+ commons-io
+ commons-io
+ ${commons-io.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.1
+
+
+ ${java.version}
+ ${project.build.sourceEncoding}
+
+
+
+
+
\ No newline at end of file
diff --git a/mybatis/src/main/java/config/DBType.java b/mybatis/src/main/java/config/DBType.java
new file mode 100644
index 0000000..cc47679
--- /dev/null
+++ b/mybatis/src/main/java/config/DBType.java
@@ -0,0 +1,24 @@
+package config;
+
+import java.sql.Driver;
+
+public enum DBType {
+ mysql57(com.mysql.cj.jdbc.Driver.class);
+
+ private Class extends Driver> driver;
+
+ DBType(Class extends Driver> driver) {
+ this.driver = driver;
+ }
+
+ public Class extends Driver> getDriver() {
+ return driver;
+ }
+
+ public String getUrl(String host,int port,String name){
+ switch (DBType.valueOf(this.name())){
+ case mysql57: return "jdbc:mysql://" + host + ":" + port + "/" + name + "?serverTimezone=GMT%2b8";
+ default:throw new RuntimeException("NotFound type:"+this.name());
+ }
+ }
+}
diff --git a/mybatis/src/main/java/config/InitConfig.java b/mybatis/src/main/java/config/InitConfig.java
new file mode 100644
index 0000000..73c4f6b
--- /dev/null
+++ b/mybatis/src/main/java/config/InitConfig.java
@@ -0,0 +1,16 @@
+package config;
+
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.util.ClassUtils;
+
+public class InitConfig implements InitializingBean {
+ public static final Logger LOG = LogManager.getLogger();
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ LOG.info("初始化"+ ClassUtils.getUserClass(this.getClass())+"配置");
+ }
+}
diff --git a/mybatis/src/main/java/config/MyBatisConfig.java b/mybatis/src/main/java/config/MyBatisConfig.java
new file mode 100644
index 0000000..bae9d07
--- /dev/null
+++ b/mybatis/src/main/java/config/MyBatisConfig.java
@@ -0,0 +1,107 @@
+package config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.TypeReference;
+import model.DataSourceModel;
+import org.apache.commons.io.FileUtils;
+import org.apache.ibatis.session.Configuration;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.support.DefaultListableBeanFactory;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.util.ResourceUtils;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.util.List;
+
+public class MyBatisConfig extends InitConfig {
+ private static final String CONFIG_NAME = "classpath:database.json";
+
+ @Autowired
+ private DefaultListableBeanFactory beanFactory;
+
+ /**
+ * 注册数据源
+ *
+ * @param dbName 数据库名
+ * @param dbPort 端口
+ * @param username 用户名
+ * @param password 密码
+ * @param type 数据库类型
+ * @return
+ */
+ private DruidDataSource dataSource(String dbHost, String dbName, int dbPort, String username, String password, DBType type) {
+ DruidDataSource dataSource = new DruidDataSource();
+ dataSource.setUsername(username);
+ dataSource.setPassword(password);
+ String url = "";
+ switch (type) {
+ case mysql57:
+ url = type.getUrl(dbHost, dbPort, dbName);
+ dataSource.setUrl(url);
+ dataSource.setDriverClassName(type.getDriver().getName());
+ break;
+ }
+ LOG.info("数据源初始化\nurl=" + url + "\nusername=" + username + "\npassword=" + password);
+ return dataSource;
+ }
+
+ private DruidDataSource dataSource(DataSourceModel dataSourceModel) {
+ return dataSource(dataSourceModel.getHost(), dataSourceModel.getDbName(), dataSourceModel.getPort(), dataSourceModel.getUsername(), dataSourceModel.getPassword(), dataSourceModel.getDbType());
+ }
+
+ private void init() {
+
+ //从根数据源读取其他数据源信息,并初始化
+ List dataSourceModels;
+ try {
+ dataSourceModels = JSON.parseObject(FileUtils.readFileToString(ResourceUtils.getFile(CONFIG_NAME), "UTF-8"), new TypeReference>() {
+ });
+ } catch (IOException e) {
+ LOG.error("解析数据库配置失败");
+ throw new RuntimeException(e);
+ }
+
+ dataSourceModels.forEach(dataSourceModel -> {
+ SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
+ DataSource dataSource=dataSource(dataSourceModel);
+ factoryBean.setDataSource(dataSource);
+
+ DataSourceTransactionManager transactionManager=new DataSourceTransactionManager();
+ transactionManager.setDataSource(dataSource);
+ beanFactory.registerSingleton(dataSourceModel.getTransactionManagerBean(), transactionManager);
+
+ Configuration configuration = new Configuration();
+ PathMatchingResourcePatternResolver resolver=new PathMatchingResourcePatternResolver();
+ try {
+ String path="classpath*:/"+dataSourceModel.getPackageName().replaceAll("\\.","/")+"/*.xml";
+ LOG.info("Mapper匹配规则"+path);
+ factoryBean.setMapperLocations(resolver.getResources(path));
+ } catch (IOException e) {
+ throw new RuntimeException("mapper匹配规则解析出错");
+ }
+ factoryBean.setConfiguration(configuration);
+ try {
+ if(factoryBean.getObject()!=null){
+ beanFactory.registerSingleton(dataSourceModel.getFactoryBean(), factoryBean.getObject());
+ }else{
+ LOG.error("初始化数据库配置" + JSON.toJSONString(dataSourceModel) + "失败");
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw new RuntimeException("初始化数据库配置" + JSON.toJSONString(dataSourceModel) + "失败");
+ }
+ });
+
+
+ }
+
+ @Override
+ public void afterPropertiesSet() throws Exception {
+ super.afterPropertiesSet();
+ init();
+ }
+}
diff --git a/mybatis/src/main/java/model/DataSourceModel.java b/mybatis/src/main/java/model/DataSourceModel.java
new file mode 100644
index 0000000..03dbba1
--- /dev/null
+++ b/mybatis/src/main/java/model/DataSourceModel.java
@@ -0,0 +1,107 @@
+package model;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import config.DBType;
+
+public class DataSourceModel {
+ private String host;
+ private int port;
+ private String username;
+ private String password;
+ private String dbName;
+ private String dbDesc;
+ private DBType dbType;
+ private String factoryBean;
+ private String packageName;
+ private String transactionManagerBean;
+
+ @JSONField
+ public String getHost() {
+ return host;
+ }
+
+ public void setHost(String host) {
+ this.host = host;
+ }
+
+ @JSONField
+ public int getPort() {
+ return port;
+ }
+
+ public void setPort(int port) {
+ this.port = port;
+ }
+
+ @JSONField
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ @JSONField
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ @JSONField
+ public String getDbName() {
+ return dbName;
+ }
+
+ public void setDbName(String dbName) {
+ this.dbName = dbName;
+ }
+
+ @JSONField
+ public String getDbDesc() {
+ return dbDesc;
+ }
+
+ public void setDbDesc(String dbDesc) {
+ this.dbDesc = dbDesc;
+ }
+
+ @JSONField
+ public DBType getDbType() {
+ return dbType;
+ }
+
+ public void setDbType(DBType dbType) {
+ this.dbType = dbType;
+ }
+
+ @JSONField
+ public String getFactoryBean() {
+ return factoryBean;
+ }
+
+ public void setFactoryBean(String factoryBean) {
+ this.factoryBean = factoryBean;
+ }
+
+ @JSONField
+ public String getPackageName() {
+ return packageName;
+ }
+
+ public void setPackageName(String packageName) {
+ this.packageName = packageName;
+ }
+
+ @JSONField
+ public String getTransactionManagerBean() {
+ return transactionManagerBean;
+ }
+
+ public void setTransactionManagerBean(String transactionManagerBean) {
+ this.transactionManagerBean = transactionManagerBean;
+ }
+}