我们先分析下使用者视角:代码中使用Mapper接口
对数据进行数据库操作,具体的SQL在Mapper xml文件
中。可以看到Mapper接口
和Mapper xml
是有一定的关联关系的,我们的配置思路也是如此,就是把两者绑定起来即可。
dataSource
和Mapper文件
;经过以上3个步骤,我们就使用Spring把Mybatis整合完成了。 根据以上思路,来具体操作下
这个比较简单,就是一个普通的bean,配置上账号
、密码
、数据库链接
就好了。数据库的个数想配置几个就配置几个,下面是两个示例。
@Bean("db1")
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/jsk?characterEncoding=utf-8&useUnicode=true");
dataSource.setUsername("root");
dataSource.setPassword("root");
return dataSource;
}
@Bean("db2")
public DruidDataSource adbDataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://xxx:3306/my_xxx?characterEncoding=utf-8&useUnicode=true");
dataSource.setPassword("root");
dataSource.setUsername("root");
return dataSource;
}
这个配置也非常简单,只需要配置要引用的datasource
和mapper文件的位置
@Bean
public SqlSessionFactory adbSqlSessionFactory() throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// 1.这里按需使用你2.1配置的数据源
// 这里多解释一下,adbDataSource()这个方法上面有@Bean注解,多次调用不会重复数据源
sessionFactory.setDataSource(adbDataSource());
// 2.mapper xml文件位置
Resource[] resources = new PathMatchingResourcePatternResolver().
getResources("classpath:com/kaka/jtest/springboot/biz/mapper/*.xml");
sessionFactory.setMapperLocations(resources);
return sessionFactory.getObject();
}
如果你的mapper文件有多个路径,配置改为下面这样
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// 1. 这一步不变,正常引用datasource即可
sessionFactory.setDataSource(dataSource());
// 2. 重要的是这里,使用PathMatchingResourcePatternResolver来读取多个路径中的xml文件即可
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
List<Resource> resources = new ArrayList<Resource>();
try {
// 每个表达式,解析出一批mapper资源
// 注意:xml的文件目录,idea的显示方式是com.kaka.jtest...(有的文件名就是“.”,就不能使用“/”了)
Resource[] mappers1 = resourceResolver.getResources("classpath:com/kaka/jtest/springboot/biz/mapper/mysql/*.xml");
resources.addAll(Arrays.asList(mappers1));
Resource[] mappers2 = resourceResolver.getResources("classpath:com/kaka/jtest/springboot/biz/mapper/adb/*.xml");
resources.addAll(Arrays.asList(mappers2));
} catch (IOException e) {
// ignore
}
// 最后使用setMapperLocations指定扫描到的mapper xml文件位置
sessionFactory.setMapperLocations(resources.toArray(new Resource[0]));
return sessionFactory.getObject();
}
前面两个步骤配置好了数据源
和xml文件
,此时就可以扫描Mapper接口了。这个配置只需要指定sessionFactory
和Mapper接口的路径
即可。
常用的配置方式有两种,下面分别示例一下。
// 如果存在多个包,可使用逗号分割
@MapperScan(basePackages = "com.kaka.jtest.springboot.biz.mapper",
sqlSessionFactoryRef = "sqlSessionFactory")
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
// 1. 指定Mapper接口包名(路径若有多个,使用逗号分隔)
mapperScannerConfigurer.setBasePackage("com.kaka.jtest.springboot.biz.mapper");
// 2. 指定工厂的bean名称
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return mapperScannerConfigurer;
}
看完以上步骤,应该就了解spring整合Mybatis的大致思路了,这个配置也就比较明了了。这里简单些一下。
@Bean("db1")
public DruidDataSource dataSource() {
// 省略具体配置...
return dataSource;
}
@Bean("db2")
public DruidDataSource dataSource() {
// 省略具体配置...
return dataSource;
}
这里不同的sessionFactory使用不同的数据源,扫描不同的xml配置文件。
@Bean
public SqlSessionFactory sqlSessionFactory1(@Qualifier("db1") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// 1.按需使用配置的数据源
sessionFactory.setDataSource(dataSource);
// 2.数据源1的mapper xml文件位置
Resource[] resources = new PathMatchingResourcePatternResolver().
getResources("classpath:com/kaka/mapper/db1/*.xml");
sessionFactory.setMapperLocations(resources);
return sessionFactory.getObject();
}
@Bean
public SqlSessionFactory sqlSessionFactory2(@Qualifier("db2") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
// 1.按需使用配置的数据源
sessionFactory.setDataSource(dataSource);
// 2.数据源2的mapper xml文件位置
Resource[] resources = new PathMatchingResourcePatternResolver().
getResources("classpath:com/kaka/mapper/db2/*.xml");
sessionFactory.setMapperLocations(resources);
return sessionFactory.getObject();
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer1() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
// 1. 指定Mapper接口包名(路径若有多个,使用逗号分隔)
mapperScannerConfigurer.setBasePackage("com.kaka.jtest.springboot.biz.mapper");
// 2. 指定工厂的bean名称
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory1");
return mapperScannerConfigurer;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer2() {
MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
// 1. 指定Mapper接口包名(路径若有多个,使用逗号分隔)
mapperScannerConfigurer.setBasePackage("com.kaka.jtest.springboot.biz.mapper");
// 2. 指定工厂的bean名称
mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory2");
return mapperScannerConfigurer;
}
至此多数据源配置完成!