在生产实际应用场景中,多数据源还是会普遍存在和使用的。下面这个实例用于展示多springboot+mybaties如何配置。多数据情况需要设置一个 @Primary 主数据源,第二个,第三个等数据源就不需要@Primary这个注解了,如果不设置主数据源,会出现“to many datasource"等错误,具体可以实际试一下。springboot + JPA 这些配置都是非常简单的,在此就不多介绍了。
@ConfigurationProperties 注解用于自动注入配置,prefix 即匹配前缀
第一个admin数据源:
package com.xxx.xxx.admin.congifuration.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
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.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;
/**
* 管理后台 admin 数据源
* Created by percy on 2017/3/23.
*/
@Configuration
@MapperScan(basePackages = {"com.xx.xx.admin.dao.adminDB"} ,sqlSessionFactoryRef = "AdminSqlSessionFactory")
@ConfigurationProperties(prefix = "db.datasource.admin") /*@ConfigurationProperties 注解用于自动注入配置*/
public class AdminDataSource {
@Bean(name = "AdminDataSource")
@Primary
public DataSource DataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(url); //设置URL
dataSource.setUsername(username); //设置用户名
dataSource.setPassword(password); //设置密码
return dataSource;
}
@Bean(name = "AdminTransactionManager")
@Primary
public DataSourceTransactionManager TransactionManager() {
return new DataSourceTransactionManager(DataSource());
}
@Bean(name = "AdminSqlSessionFactory")
@Primary
public SqlSessionFactory AdminSqlSessionFactory(@Qualifier("AdminDataSource") DataSource AdminDataSource) throws Exception {
final SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
fb.setDataSource(AdminDataSource);
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "mysql");
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("pageSizeZero", "zero");
properties.setProperty("pageNum", "start");
properties.setProperty("pageSize", "limit");
properties.setProperty("reasonable", "false");
properties.setProperty("count", "contsql");
pageHelper.setProperties(properties);
fb.setPlugins(new Interceptor[]{pageHelper});
fb.setTypeAliasesPackage("com.xxx.xxx.admin.bean;com.xxx.xxx.admin.bean");
//设置驼峰转换,例如数据库字段user_name可以映射到javaBean的属性userName上
fb.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
// 当列的数据为空值时,mybatis在返回的map中并不会存在对应的key,此配置可避免没有空值key
fb.getObject().getConfiguration().setCallSettersOnNulls(true);
return fb.getObject();
}
private String url;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第二个User数据源:
package com.xxx.xxx.admin.congifuration.datasource;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;
/**
* user 模块 数据源
* Created by percy on 2017/3/28.
*/
@Configuration
@MapperScan(basePackages = {"com.xxx.xxx.admin.dao.userDB"}, sqlSessionFactoryRef = "UserSqlSessionFactory")
@ConfigurationProperties(prefix = "db.datasource.user")
public class UserDataSource {
@Bean(name = "UserDataSource")
public DataSource UserDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(url); //设置URL
dataSource.setUsername(username); //设置用户名
dataSource.setPassword(password); //设置密码
return dataSource;
}
@Bean(name = "UserTransactionManager")
public DataSourceTransactionManager TransactionManager() {
return new DataSourceTransactionManager(UserDataSource());
}
@Bean(name = "UserSqlSessionFactory")
public SqlSessionFactory UserSqlSessionFactory(@Qualifier("UserDataSource") DataSource UserDataSource) throws Exception {
final SqlSessionFactoryBean fb = new SqlSessionFactoryBean();
fb.setDataSource(UserDataSource);
//分页插件
PageHelper pageHelper = new PageHelper();
Properties properties = new Properties();
properties.setProperty("dialect", "mysql");
properties.setProperty("offsetAsPageNum", "true");
properties.setProperty("rowBoundsWithCount","true");
properties.setProperty("pageSizeZero", "zero");
properties.setProperty("pageNum", "start");
properties.setProperty("pageSize", "limit");
properties.setProperty("reasonable", "false");
properties.setProperty("count", "contsql");
pageHelper.setProperties(properties);
fb.setPlugins(new Interceptor[]{pageHelper});
fb.setTypeAliasesPackage("com.xxx.xxx.admin.bean");
//设置驼峰转换,例如数据库字段user_name可以映射到javaBean的属性userName上
fb.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
// 当列的数据为空值时,mybatis在返回的map中并不会存在对应的key,此配置可避免没有空值key
fb.getObject().getConfiguration().setCallSettersOnNulls(true);
return fb.getObject();
}
private String url;
private String username;
private String password;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
yml配置:
# 数据源1(默认) admin
db.datasource.admin.url=jdbc:mysql://【地址】:3306/dev-admin?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
db.datasource.admin.username=
db.datasource.admin.password=
# 数据源2 user
db.datasource.user.url=jdbc:mysql://【地址】:3306/dev-user?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
db.datasource.user.username=
db.datasource.user.password=