19.Spring-Boot多數據源配置


參考SpingBoot官網文檔

主要要是基於MyBatis的SpringBoot多數據源配置,這里利用多數據源演示讀寫分離,只是純粹的樣式。

application.properties

#讀數據庫配置
spring.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.db1.driverClassName = com.mysql.jdbc.Driver
spring.datasource.db1.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8 
spring.datasource.db1.username = root
spring.datasource.db1.password = 123456

#寫數據庫配置
spring.datasource.db2.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.db2.driverClassName = com.mysql.jdbc.Driver
spring.datasource.db2.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf8 
spring.datasource.db2.username = root
spring.datasource.db2.password = 123456

 

ReadDataSourceConfig.java讀數據源配置

package com.niugang;
import javax.sql.DataSource;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import com.alibaba.druid.pool.DruidDataSource;
/**
 * 數據源配置 1
 * 
 * @author niugang
 *

 */

@Configuration
@MapperScan(value = { "com.niugang.dao.read" }, sqlSessionTemplateRef = "sqlSessionTemplate1")
public class ReadDataSourceConfig implements TransactionManagementConfigurer {
@Bean(name = "dataSource1")
@ConfigurationProperties(prefix = "spring.datasource.db1")
@Primary //配置主數據庫
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
@Bean(name = "sqlSessionFactory1")
@Primary
public SqlSessionFactory testSqlSessionFactory() throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();

bean.setDataSource(dataSource());
 //讀的myBatis配置文件位置

bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/read/*.xml"));
return bean.getObject();



}



@Bean(name = "sqlSessionTemplate1")
@Primary
public SqlSessionTemplate testSqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(testSqlSessionFactory());
}
@Bean(name = "transactionManager1")
@Primary
public DataSourceTransactionManager testTransactionManager() {
return new DataSourceTransactionManager(dataSource());
}
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return testTransactionManager() ;
}

}

 

WriterDataSourceConfig.java寫數據庫配置

package com.niugang;
import javax.sql.DataSource;
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.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
import com.alibaba.druid.pool.DruidDataSource;

/**
 * 數據源配置 1
 * 
 * @author niugang
 **/
@Configuration
// @EnableTransactionManagement springboot默認是開啟事務的
@MapperScan(value = { "com.niugang.dao.writer" }, sqlSessionTemplateRef = "sqlSessionTemplate2")
public class WriterDataSourceConfig implements TransactionManagementConfigurer {


@Bean(name = "dataSource2")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}


@Bean(name = "sqlSessionFactory2")
public SqlSessionFactory testSqlSessionFactory() throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource());
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/writer/*.xml"));
return bean.getObject();

}

@Bean(name = "sqlSessionTemplate2")
public SqlSessionTemplate testSqlSessionTemplate() throws Exception {
return new SqlSessionTemplate(testSqlSessionFactory());
}
    
/**
* 配置事務所必須要的
* @return
*/
@Bean(name = "transactionManager2")
public DataSourceTransactionManager testTransactionManager() {
return new DataSourceTransactionManager(dataSource());
}
    /**
     * 配置事務所必須要
     */
@Override
public PlatformTransactionManager annotationDrivenTransactionManager() {
return testTransactionManager();
}

}

 

Dao層

如果真的要這么做,那么接口命名必須規范,防止調錯

  ReadUserDao.java 讀持久化接口

package com.niugang.dao.read;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.niugang.entity.User;
@Repository
public interface ReadUserDao {
List<User> queryList(User user);
User get(Integer id);
}

 

  WriterUserDao.java寫持久化接口

package com.niugang.dao.writer;
import org.springframework.stereotype.Repository;
import com.niugang.entity.User;
import org.springframework.transaction.annotation.Transactional;
@Repository
public interface WriterUserDao {
   @Transactional
   void save(User user);
    void delete(Integer id);
}

 

Mapper文件

 ReadUser.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.niugang.dao.read.ReadUserDao">
<resultMap id="BaseResultMap" type="com.niugang.entity.User">
<result column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<result column="phone" property="phone" />
</resultMap>
<!--查詢字段 -->
<sql id="Base_Column_List">
id, name, age,phone
</sql>
<!-- 查詢條件 -->
<sql id="queryCondition">
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
<if test="phone!=null">
and phone=#{phone}
</if>
</where>
</sql>
<select id="queryList" resultMap="BaseResultMap" parameterType="com.niugang.entity.User">
select
<include refid="Base_Column_List" />
from user
<include refid="queryCondition" />
</select>
<select id="get" parameterType="int" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where id =#{id}
</select>
</mapper>

 

WriterUser.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.niugang.dao.writer.WriterUserDao">
<insert id="save" parameterType="com.niugang.entity.User">
insert into user (name,password,age,phone)
values(#{name},#{password},#{age},#{phone})
</insert>
<delete id="delete" parameterType="int">
delete from user where id =#{id}
</delete>
</mapper>

 

微信公眾號

                          


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM