# jpa-starter
**Repository Path**: wip/jpa-starter
## Basic Information
- **Project Name**: jpa-starter
- **Description**: springboot整合spring data jpa 实现多数据源,动态数据源和自动建库建表
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 2
- **Created**: 2022-03-02
- **Last Updated**: 2024-03-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# springboot整合spring-boot-starter-data-jpa
> 该项目使用spring-boot-starter-data-jpa和druid-spring-boot-starter实现多数据源,动态数据源和自动建库建表
## 1.新建springboot项目,pom.xml导入依赖
`
mysql
mysql-connector-java
runtime
com.oracle.database.jdbc
ojdbc8
runtime
21.5.0.0
com.alibaba
druid-spring-boot-starter
1.2.8
org.springframework.boot
spring-boot-starter-data-jpa
`
## 2.yml配置文件
`
spring:
#数据源配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
master:
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/springboot?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
//slave1:
//enable: true
//driverClassName: oracle.jdbc.OracleDriver
//url: jdbc:oracle:thin:@127.0.0.1:1521:xe?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
//username: boot
//password: boot
slave:
driverClassName: com.mysql.cj.jdbc.Driver
enable: true
url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
#初始连接数
initialSize: 5
#最小连接池数量
minIdle: 10
#最大连接池数量
maxActive: 20
#配置获取连接等待超时的时间
maxWait: 60000
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
#配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
#配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
#打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙,此处是filter修改的地方
filters:
commons-log.connection-logger-name: stat,wall,log4j
#通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
#合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
#配置 DruidStatFilter
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
stat-view-servlet:
enabled: true
url-pattern: /druid/*
#IP 白名单,没有配置或者为空,则允许所有访问
allow: 127.0.0.1
#IP 黑名单,若白名单也存在,则优先使用
deny: 192.168.31.253
#禁用 HTML 中 Reset All 按钮
reset-enable: false
#登录用户名/密码
login-username: admin
login-password: 123456
#慢SQL记录
filter:
stat:
enabled: true
#慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
jpa:
properties:
hibernate:
show_sql: true
hbm2ddl:
auto: update
`
## 3.包文件介绍
#### 数据源配置
com.example.jpa.config.DruidDataSourceConfig
#### 事务配置
com.example.jpa.config.DruidTransactionMasterConfig
com.example.jpa.config.DruidTransactionSlaveConfig
#### 注解式AOP切面,用于实现动态数据源
com.example.jpa.annotation.DataSource
com.example.jpa.aspect.DynamicDataSourceAspect
#### 常量文件
com.example.jpa.constant.DataSourcesType
#### 工具类
com.example.jpa.utils.DynamicDataSourceContextHolder
#### 实体类扫描包
自动建库建表扫描包
com.example.jpa.pojo
基本pojo类:
com.example.jpa.pojo.base.BasePojo
自定义注解生成策略:
com.example.jpa.pojo.base.HibernateUUIDKeyGenerator
自动建表字段顺序错乱解决办法
org.hibernate.cfg.PropertyContainer
#### 主数据源扫描包
com.example.jpa.master
#### 从数据源扫描包
com.example.jpa.slave
## 4.测试结果展示
@Test
void ms() {
masterSaveAll();
slaveList();
}
控制台输出:
正在使用的数据源是:=> MASTER
Hibernate: insert into Person (createTime, createUser, updateTime, updateUser, enable, name, age, address, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Person (createTime, createUser, updateTime, updateUser, enable, name, age, address, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Person (createTime, createUser, updateTime, updateUser, enable, name, age, address, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Person (createTime, createUser, updateTime, updateUser, enable, name, age, address, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Hibernate: insert into Person (createTime, createUser, updateTime, updateUser, enable, name, age, address, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?)
Person{id='21567724103741038a972c53402bfc39'createTime='2023-08-21T00:25:06.548'createUser='OS'name='李白', age=23, address='武汉'}
Person{id='6761a8c494724f64a6bff0f0a0effd3d'createTime='2023-08-21T00:25:06.548'createUser='OS'name='李四', age=24, address='上海'}
Person{id='56e22de724254aafb664b75984f3753c'createTime='2023-08-21T00:25:06.548'createUser='OS'name='王五', age=25, address='深圳'}
Person{id='a44bacd2c39d40eb91fa0a81ce0a9a0d'createTime='2023-08-21T00:25:06.548'createUser='OS'name='赵六', age=26, address='广州'}
Person{id='cd2749f238ba4bc98ca5d636f8f23386'createTime='2023-08-21T00:25:06.548'createUser='OS'name='约翰', age=27, address='北京'}
正在使用的数据源是:=> SLAVE
Hibernate: select person0_.id as id1_0_, person0_.createTime as createti2_0_, person0_.createUser as createus3_0_, person0_.updateTime as updateti4_0_, person0_.updateUser as updateus5_0_, person0_.enable as enable6_0_, person0_.name as name7_0_, person0_.age as age8_0_, person0_.address as address9_0_ from Person person0_
Person{id='6'createTime='2023-08-21T00:08:08'createUser='OS'name='老六', age=66, address='六六大顺'}
###### 特别说明:
- 该项目启动前需要手动创建主数据库(springboot)和从数据库(test),并修改配置文件中的数据库连接参数(用户名root和密码root)
- 该项目通过在业务类上使用自定义注解@DataSource并传入自定义类DataSourcesType中的参数来切换数据源