【SpringBoot】实现JdbcTemplate、Druid、Dynamic-Data。。。
⽂章⽬录
⼀.前⾔
1.多数据源的使⽤场景
1. 操作同⼀台服务器上不同的数据库,或者多台服务器上的相同或不相同数据库。
2. 进⾏跨库操作、多数据源进⾏分离数据;
3. 使得程序得以扩展,当⼀台或者部分服务器宕机,不影响整个应⽤的服务;
2.多数据源配置的思路
1. 创建数据源DataSource ,指定使⽤哪个数据源(如Druid,DBCP,C3P0),并初始化数据源配置项,如连接url、驱动包、⽤户
名、密码、连接数、超时时间等等。
2. 创建会话⼯⼚ sqlsessionFactory,并注⼊数据源以及要扫描mapper⽂件路径
3. 创建事务管理器 transactionManager,并注⼊数据源。
4. 创建 sqlSessionTemplate 模板,并注⼊会话⼯⼚sqlsessionFactory。
SpringBoot 默认⽀持如下数据源;
1. ⾃动配置都在org.springframework.boot.autoconfigure.jdbc 包下。
2. org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 数据源配置类作⽤是根据逻辑判断之后,添加数据源
1. com.zaxxer.hikari.HikariDataSource (Spring Boot
2.0 以上,默认使⽤此数据源)
2. at.jdbc.pool.DataSource (Spring Boot 2.0.x 以下,默认使⽤此数据源)
3. org.apachemons.dbcp2.BasicDataSource
⼆.JdbcTemplate的多数据源配置
HikariDataSource 号称 Java WEB 当前速度最快的数据源,相⽐于传统的 C3P0 、DBCP、Tomcat jdbc 等连接池更加优秀
1.默认数据源-HikariDataSource
1. 全局配置⽂件l中 spring.datasource.* 下只配置账号、密码、数据库地址、连接驱动,默认使⽤的是
com.zaxxer.hikari.HikariDataSource 数据源
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.58.129:3307/horse?characterEncoding=UTF-8
driver-class-name:Driver
2. 如果过是⾃定义数据源,⽐如 Druid,则可以使⽤pe指定
spring:
datasource:
username: root
password: root
url: jdbc:mysql://192.168.58.129:3307/horse?characterEncoding=UTF-8
driver-class-name:Driver
type:DruidDataSource
Spring Boot 2.x 默认使⽤ com.zaxxer.hikari.HikariDataSource 数据源
Spring Boot 2.x⼀下 默认使⽤ at.jdbc.pool.DataSource 作为数据源
2.默认数据源数据库操作类JdbcTemplate
1. 即使不使⽤第三⽅第数据库操作框架,如 MyBatis、Hibernate 、spring-data-jpa 等,Spring 本⾝也对 原⽣的 JDBC 做了轻量级
的封装,即org.JdbcTemplate。
2. JdbcTemplate 是 core 包的核⼼类,⽤于简化 JDBC 操作,还能避免⼀些常见的错误,如忘记关闭数据库连接。
3. Spring Boot 不仅提供了默认的数据源HikariDataSource,同时默认为JdbcTemplate注⼊数据源并初始化到Spring容器中,使⽤
时只需⾃⼰注⼊即可使⽤
4. JdbcTemplate 的⾃动配置原理是依赖 org.springframework.boot.autoconfigure.jdbc 包下的
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration 类
3.使⽤步骤
3.1.修改配置⽂件l
配置多个数据源
spring:
datasource:
master:
# 基本属性 url、user、password
driver-class-name: sql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/master_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTi mezone=UTC
username: root
password:123456
slave:
# 基本属性 url、user、password
driver-class-name: sql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/slave_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTim ezone=UTC
username: root
password:123456
数据源连接配置2.x和1.x的配置项是有区别的:
2.x使⽤spring.datasource.master.jdbc-url
1.x版本使⽤spring.datasource.master.url
如果你在配置的时候发⽣了这个报错java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.,那么就是这个配置项的问题。
3.2.JdbcTemplate数据源配置类
@Configuration
public class DataSourceConfiguration {
@Bean
@ConfigurationProperties(prefix ="spring.datasource.master")
@Primary
public DataSource masterDataSource(){
ate().build();
}
@Bean
@ConfigurationProperties(prefix ="spring.datasource.slave")
public DataSource slaveDataSource(){
ate().build();
}
@Bean
@Primary
public JdbcTemplate masterJdbcTemplate(@Qualifier("masterDataSource") DataSource primaryDataSource){
return new JdbcTemplate(primaryDataSource);
}
jpa mybatis@Bean
public JdbcTemplate slaveJdbcTemplate(@Qualifier("slaveDataSource") DataSource secondaryDataSource){
return new JdbcTemplate(secondaryDataSource);
}
}
1. 前两个Bean是数据源的创建,通过**@ConfigurationProperties** 可以知道这两个数据源分别加载
了spring.datasource.master.*和spring.datasource.slave.*的配置然后初始化数据源。
2. @Primary注解指定了主数据源,就是当我们不特别指定哪个数据源的时候,就会使⽤这个Bean
后两个Bean是每个数据源对应的JdbcTemplate。可以看到这两个JdbcTemplate创建的时候,分别注⼊了masterDataSource数据源和slaveDataSource数据源
3.2.测试
JdbcTemplate 的CRUD伪代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter37ApplicationTests {
@Autowired
protected JdbcTemplate masterJdbcTemplate;
@Autowired
protected JdbcTemplate slaveJdbcTemplate;
@Before
public void setUp(){
primaryJdbcTemplate.update("DELETE  FROM  USER ");
secondaryJdbcTemplate.update("DELETE  FROM  USER ");
}
@Test
public void test()throws Exception {
// 往第⼀个数据源中插⼊ 2 条数据
masterJdbcTemplate.update("insert into user(name,age) values(?, ?)","aaa",20);
masterJdbcTemplate.update("insert into user(name,age) values(?, ?)","bbb",30);
// 往第⼆个数据源中插⼊ 1 条数据,若插⼊的是第⼀个数据源,则会主键冲突报错
slaveJdbcTemplate.update("insert into user(name,age) values(?, ?)","ccc",20);
// 查⼀下第⼀个数据源中是否有 2 条数据,验证插⼊是否成功
Assert.assertEquals("2", masterJdbcTemplate.queryForObject("select count(1) from user", String.class));
Assert.assertEquals("2", masterJdbcTemplate.queryForObject("select count(1) from user", String.class));
// 查⼀下第⼀个数据源中是否有 1 条数据,验证插⼊是否成功
Assert.assertEquals("1", masterJdbcTemplate.queryForObject("select count(1) from user", String.class)); }
/**查询*/
@Test
public void userList(){
/**
* List 中的1个 Map 对应数据库的 1⾏数据
* Map 中的 key 对应数据库的字段名,value 对应数据库的字段值
*/
List<Map<String, Object>> mapList = masterJdbcTemplate.queryForList("SELECT * FROM phone");
}
//--------update ⽅法可以做查询以外的增加、修改、删除操作---------------
/**新增*/
@Test
public void savePhone(){
String sql ="INSERT INTO phone(number,region) VALUES (?,?)";
Object[] objects =new Object[2];
objects[0]="186********";
objects[1]="湖南";
masterJdbcTemplate.update(sql, objects);
}
/**修改*/
@Test
public void updatePhone(){
String sql ="UPDATE phone SET number=? WHERE pid=?";
Object[] objects =new Object[2];
objects[0]="186********";
objects[1]="1";
masterJdbcTemplate.update(sql, objects);
}
/**删除*/
@Test
public void deletePhone(){
String sql ="DELETE FROM phone WHERE number=?";
Object[] objects =new Object[1];
objects[0]="186********";
masterJdbcTemplate.update(sql, objects);
}
}
三.Spring-Data-JPA的多数据源配置(了解即可)
1.引⼊依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2.修改配置⽂件l
配置多个数据源
spring:
datasource:
master:
# 基本属性 url、user、password
driver-class-name: sql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/master_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTi mezone=UTC
username: root
password:123456
slave:
# 基本属性 url、user、password
driver-class-name: sql.jdbc.Driver
jdbc-url: jdbc:mysql://127.0.0.1:3306/slave_db?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTim ezone=UTC
username: root
password:123456
3.Jpa数据源配置类
有⼏个数据源就写⼏个配置类
master数据源的JPA配置:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。