# 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中的参数来切换数据源