(1) 在这里面使用@Configuration注解的作用是交由Spring的配置管理进行管理
(2) @MapperScan注解是告诉Spring要扫描的包的位置
package com.wangtiansoft.dkyw.config.mybatis;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageHelper;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration // 交由Spring 的配置文件进行管理
// 配置Spring要扫描的包:basePackages扫描的包的位置,sqlSessionFactoryRef要交给的session工厂
@MapperScan(basePackages = MyBatisConfig.PACKAGE, sqlSessionFactoryRef = "sqlSessionFactory")
public class MyBatisConfig {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.wangtiansoft.dkyw.persistence.dao";
static final String MAPPER_LOCATION = "classpath*:mapper/*.xml";
@Primary // 表明优先使用,不用添加此注解也是可以的
@Bean(name = "dataSource") // 将数据源交由Spring管理
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
@Bean(name = "sqlSessionFactory") // 注册sql工厂
@Primary
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dataSource") DataSource masterDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(masterDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MyBatisConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
@Bean(name = "transactionManager") // 将sql工厂交由管理机构进行管理
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
pageHelper.setProperties(p);
return pageHelper;
}
}
用于上述配置的配置文件,也是spirngBoot中默认的配置文件。
spring.datasource.url=jdbc:mysql://localhost:3306/db_temp_account?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driverClassName=com.mysql.jdbc.Driver
===================================假如在此项目中再配置一个mysql进行连接========================
@Configuration
@MapperScan(basePackages = MyBatisDkConfig.PACKAGE, sqlSessionFactoryRef = "dkSqlSessionFactory")
public class MyBatisDkConfig {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.wangtiansoft.dkyw.persistence.dkdao";
static final String MAPPER_LOCATION = "classpath*:dkmapper/*.xml";
@Value("${dk.datasource.url}")
private String url;
@Value("${dk.datasource.username}")
private String user;
@Value("${dk.datasource.password}")
private String password;
@Value("${dk.datasource.driverClassName}")
private String driverClass;
@Bean(name = "dkDataSource")
public DataSource dkDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
return dataSource;
}
@Bean(name = "dkTransactionManager")
public DataSourceTransactionManager dkTransactionManager() {
return new DataSourceTransactionManager(dkDataSource());
}
@Bean(name = "dkSqlSessionFactory")
public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("dkDataSource") DataSource dkDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dkDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MyBatisDkConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
@Bean
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
pageHelper.setProperties(p);
return pageHelper;
}
}
它所对应的配置文件:
dk.datasource.url=jdbc:mysql://localhost:3306/exam20?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
dk.datasource.username=root
dk.datasource.password=123456
dk.datasource.driverClassName=com.mysql.jdbc.Driver
====================================当配置第三个只读的连接时===================================
package com.wangtiansoft.dkyw.config.mybatisDkro;
import com.alibaba.druid.pool.DruidDataSource;
import com.github.pagehelper.PageHelper;
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.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@MapperScan(basePackages = MyBatisDkroConfig.PACKAGE, sqlSessionFactoryRef = "dkroSqlSessionFactory")
public class MyBatisDkroConfig {
// 精确到 master 目录,以便跟其他数据源隔离
static final String PACKAGE = "com.wangtiansoft.dkyw.persistence.dkrodao";
static final String MAPPER_LOCATION = "classpath*:dkromapper/*.xml";
@Value("${dk.ro.datasource.url}")
private String url;
@Value("${dk.ro.datasource.username}")
private String user;
@Value("${dk.ro.datasource.password}")
private String password;
@Value("${dk.ro.datasource.driverClassName}")
private String driverClass;
@Value("${dk.ro.datasource.default-read-only}")
private boolean defaultReadOnly;
@Bean(name = "dkroDataSource")
public DataSource dkroDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setUrl(url);
dataSource.setUsername(user);
dataSource.setPassword(password);
dataSource.setDefaultReadOnly(defaultReadOnly);
return dataSource;
}
@Bean(name = "dkroTransactionManager")
public DataSourceTransactionManager dkroTransactionManager() {
return new DataSourceTransactionManager(dkroDataSource());
}
@Bean(name = "dkroSqlSessionFactory")
public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("dkroDataSource") DataSource dkroDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dkroDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(MyBatisDkroConfig.MAPPER_LOCATION));
return sessionFactory.getObject();
}
@Bean
public PageHelper pageHelper() {
PageHelper pageHelper = new PageHelper();
Properties p = new Properties();
p.setProperty("offsetAsPageNum", "true");
p.setProperty("rowBoundsWithCount", "true");
pageHelper.setProperties(p);
return pageHelper;
}
@Bean(name = "readOnlyJdbcTemplate")
public JdbcTemplate readOnlyJdbcTemplate(@Qualifier("dkroDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
它的配置文件
dk.ro.datasource.url=jdbc:mysql://localhost:8635/exam20?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
dk.ro.datasource.username=exam20_ro
dk.ro.datasource.password=V0GvkVdh!
dk.ro.datasource.default-read-only=true // 设置此mysql为只读mysql
dk.ro.datasource.driverClassName=com.mysql.jdbc.Driver