SpringBoot整合多数据源JdbcTemplate、Mybatis、Jpa"/>
【Java】SpringBoot整合多数据源JdbcTemplate、Mybatis、Jpa
SpringBoot 整合 JdbcTemplate 多数据源
pom
<!-- 引入阿里的数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version>
application.properties
#快捷键alt拉动一列添加one,此时自动配置失效
#数据源one
spring.datasource.one.url=jdbc:mysql://localhost:3306/db_jdbctemplate
spring.datasource.one.username=root
spring.datasource.one.password=rootroot
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
#数据源two
spring.datasource.two.url=jdbc:mysql://localhost:3306/db_jdbctemplate2
spring.datasource.two.username=root
spring.datasource.two.password=rootroot
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
- config
DataSourceConfig.java
package com.bennyrhys.jdbctemplate2.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/*** 指定配置文件对应的不同数据源*/
@Configuration
public class DataSourceConfig {@Bean@ConfigurationProperties(prefix = "spring.datasource.one")DataSource dsOne(){return DruidDataSourceBuilder.create().build();}@Bean@ConfigurationProperties(prefix = "spring.datasource.two")DataSource dsTwo(){return DruidDataSourceBuilder.create().build();}
}
JdbcTemplateConfig.java
package com.bennyrhys.jdbctemplate2.config;import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;@Configuration
public class JdbcTemplateConfig {//@Qualifier("dsOne")指明要注入的bean,后面的参数名无所谓@BeanJdbcTemplate jdbcTemplateOne(@Qualifier("dsOne") DataSource dsOne){return new JdbcTemplate(dsOne);}@BeanJdbcTemplate jdbcTemplateTwo(@Qualifier("dsTwo") DataSource dsTwo){return new JdbcTemplate(dsTwo);}
}
- bean
public class User {private Integer id;private String username;private String address;
- test
package com.bennyrhys.jdbctemplate2;import com.bennyrhys.jdbctemplate2.bean.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import javax.annotation.Resource;
import java.util.List;@SpringBootTest
class Jdbctemplate2ApplicationTests {@Autowired //是按照类型查找的,但现在有两个template类型(会报错,需要结合)@Qualifier("jdbcTemplateOne")JdbcTemplate jdbcTemplateOne;@Resource(name = "jdbcTemplateTwo")JdbcTemplate jdbcTemplateTwo;@Testvoid contextLoads() {List<User> list1 = jdbcTemplateOne.query("select * from user", new BeanPropertyRowMapper<>(User.class));System.out.println(list1);List<User> list2 = jdbcTemplateTwo.query("select * from user", new BeanPropertyRowMapper<>(User.class));System.out.println(list2);}}
控制台输出:
[User{id=2, username=‘bennyrhys’, address=‘jilin’}, User{id=3, username=‘bennyrhys’, address=‘lanzou’}]
2020-01-19 22:39:03.408 INFO 6114 — [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-2} inited
[User{id=1, username=‘zhangsan’, address=‘通化’}]
SpringBoot整合Mybatis多数据源
现在很少用,一般用中间件MyCat整合或者jdbctemplate的同源
pom.xml
<!--修改版本信息--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope><version>8.0.16</version></dependency>
<!-- 引入阿里数据源--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency>
application.properties
#数据源1
spring.datasource.one.url=jdbc:mysql://localhost:3306/db_jdbctemplate
spring.datasource.one.username=root
spring.datasource.one.password=rootroot
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
#数据源2
spring.datasource.two.url=jdbc:mysql://localhost:3306/db_jdbctemplate2
spring.datasource.two.username=root
spring.datasource.two.password=rootroot
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
com.bennyrhys.mybatis2.bean.User
public class User { private Integer id; private String username; private String address;
- config
DataSourceConfig.java
package com.bennyrhys.mybatis2.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;/** * 数据源的配置 */@Configurationpublic class DataSourceConfig { @Bean @ConfigurationProperties(prefix = "spring.datasource.one") DataSource dsOne(){ return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.two") DataSource dsTwo(){ return DruidDataSourceBuilder.create().build(); }}
MyBatisConfigOne.java
package com.bennyrhys.mybatis2.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;import javax.sql.DataSource;@Configuration@MapperScan(basePackages = "com.bennyrhys.mybatis2.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1", sqlSessionTemplateRef = "sessionTemplate1")public class MyBatisConfigOne { @Resource(name = "dsOne") DataSource dsOne; @Bean SqlSessionFactory sqlSessionFactory1(){ SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); try { bean.setDataSource(dsOne); return bean.getObject(); } catch (Exception e) { e.printStackTrace(); } return null; } @Bean SqlSessionTemplate sessionTemplate1(){ SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory1()); return template; }}
MyBatisConfigTwo.java
package com.bennyrhys.mybatis2.config;import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;
import javax.sql.DataSource;@Configuration
@MapperScan(basePackages = "com.bennyrhys.mybatis2.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2", sqlSessionTemplateRef = "sessionTemplate2")
public class MyBatisConfigTwo {@Resource(name = "dsTwo")DataSource dsTwo;@BeanSqlSessionFactory sqlSessionFactory2(){SqlSessionFactoryBean bean = new SqlSessionFactoryBean();try {bean.setDataSource(dsTwo);return bean.getObject();} catch (Exception e) {e.printStackTrace();}return null;}@BeanSqlSessionTemplate sessionTemplate2(){SqlSessionTemplate template = new SqlSessionTemplate(sqlSessionFactory2());return template;}}
- mapper1
UserMapper1.java
package com.bennyrhys.mybatis2.mapper1;import com.bennyrhys.mybatis2.bean.User;import java.util.List;public interface UserMapper1 {List<User> getAllUsers();
}
UserMapper1.xml
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" ".dtd" ><mapper namespace="com.bennyrhys.mybatis2.mapper1.UserMapper1"> <select id="getAllUsers" resultType="com.bennyrhys.mybatis2.bean.User"> select * from user; </select></mapper>
- mapper2
UserMapper2
package com.bennyrhys.mybatis2.mapper2;import com.bennyrhys.mybatis2.bean.User;import java.util.List;public interface UserMapper2 {List<User> getAllUser();
}
UserMapper2.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis//DTD Mapper 3.0//EN" ".dtd" >
<mapper namespace="com.bennyrhys.mybatis2.mapper2.UserMapper2"><select id="getAllUser" resultType="com.bennyrhys.mybatis2.bean.User">select * from user;</select>
</mapper>
Pom.xml 修改访问路径
<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource><resource><directory>src/main/resources</directory></resource></resources>
test
package com.bennyrhys.mybatis2;import com.bennyrhys.mybatis2.bean.User;
import com.bennyrhys.mybatis2.mapper1.UserMapper1;
import com.bennyrhys.mybatis2.mapper2.UserMapper2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class Mybatis2ApplicationTests {@AutowiredUserMapper1 userMapper1;@AutowiredUserMapper2 userMapper2;//记得启动之前,要声明mapper.xml位置,pom中定义/*** [User{id=2, username='bennyrhys', address='jilin'}, User{id=3, username='bennyrhys', address='lanzou'}]* 2020-01-20 13:30:35.558 INFO 1927 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-2} inited* [User{id=1, username='zhangsan', address='通化'}]*/@Testvoid contextLoads() {List<User> list1 = userMapper1.getAllUsers();System.out.println(list1);List<User> list2 = userMapper2.getAllUser();System.out.println(list2);}}
SpringBoot整合Jpa多数据源
模板选择web、mysql driver、jpa
pom.xml
<!--修改mysql版本--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>8.0.16</version> </dependency><!-- 添加阿里数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency>
application.properties
#配置数据源spring.datasource.one.url=jdbc:mysql://localhost:3306/db_jdbctemplatespring.datasource.one.username=rootspring.datasource.one.password=rootrootspring.datasource.one.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.two.url=jdbc:mysql://localhost:3306/db_jdbctemplate2spring.datasource.two.username=rootspring.datasource.two.password=rootrootspring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource#配置jpa,前面配置定义了propertiesspring.jpa.properties.show-sql=truespring.jpa.properties.hibernate.ddl-auto=updatespring.jpa.properties.database=mysqlspring.jpa.properties.database-platform=mysqlspring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect
Book
@Entity(name = "t_book")public class Book { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; private String author;
- config
DataSourceConfig
package com.bennyrhys.jpa2.config;import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import javax.sql.DataSource;@Configurationpublic class DataSourceConfig { @Bean @Primary //优先使用,特色 @ConfigurationProperties(prefix = "spring.datasource.one") DataSource dsOne(){ return DruidDataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.two") DataSource dsTwo(){ return DruidDataSourceBuilder.create().build(); }}
JpaConfig1
package com.bennyrhys.jpa2.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;@Configuration
//JPA相关扫描dao
@EnableJpaRepositories(basePackages = "com.bennyrhys.jpa2.dao1",entityManagerFactoryRef = "localContainerEntityManagerFactoryBean1",transactionManagerRef = "platformTransactionManager1")
public class JpaConfig1 {@Autowired@Qualifier("dsOne")DataSource dsOne;@Autowired //加载properties的jpaJpaProperties jpaProperties;@Bean@Primary //多实例,优先使用LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean1(EntityManagerFactoryBuilder builder){return builder.dataSource(dsOne).properties(jpaProperties.getProperties()).persistenceUnit("pu1").packages("com.bennyrhys.jpa2.bean").build();}
// 事务@BeanPlatformTransactionManager platformTransactionManager1(EntityManagerFactoryBuilder builder){return new JpaTransactionManager(localContainerEntityManagerFactoryBean1(builder).getObject());}
}
JpaConfig2
package com.bennyrhys.jpa2.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;@Configuration
//JPA相关扫描dao
@EnableJpaRepositories(basePackages = "com.bennyrhys.jpa2.dao2",entityManagerFactoryRef = "localContainerEntityManagerFactoryBean2",transactionManagerRef = "platformTransactionManager2")
public class JpaConfig2 {@Autowired@Qualifier("dsTwo")DataSource dsTwo;@Autowired //加载properties的jpaJpaProperties jpaProperties;@BeanLocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean2(EntityManagerFactoryBuilder builder){return builder.dataSource(dsTwo).properties(jpaProperties.getProperties()).persistenceUnit("pu2").packages("com.bennyrhys.jpa2.bean").build();}
// 事务@BeanPlatformTransactionManager platformTransactionManager2(EntityManagerFactoryBuilder builder){return new JpaTransactionManager(localContainerEntityManagerFactoryBean2(builder).getObject());}
}
- dao1
BookDao1
package com.bennyrhys.jpa2.dao1;import com.bennyrhys.jpa2.bean.Book;
import org.springframework.data.jpa.repository.JpaRepository;public interface BookDao1 extends JpaRepository<Book,Integer> {
}
- dao2
BookDao2
package com.bennyrhys.jpa2.dao2;import com.bennyrhys.jpa2.bean.Book;
import org.springframework.data.jpa.repository.JpaRepository;public interface BookDao2 extends JpaRepository<Book,Integer> {
}
Test
package com.bennyrhys.jpa2;import com.bennyrhys.jpa2.bean.Book;
import com.bennyrhys.jpa2.dao1.BookDao1;
import com.bennyrhys.jpa2.dao2.BookDao2;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class Jpa2ApplicationTests {@AutowiredBookDao1 dao1;@AutowiredBookDao2 dao2;@Testvoid contextLoads() {List<Book> all = dao1.findAll();System.out.println(all);List<Book> all1 = dao2.findAll();System.out.println(all1);}}
更多推荐
【Java】SpringBoot整合多数据源JdbcTemplate、Mybatis、Jpa
发布评论