1. 逻辑梳理
我们先分析下使用者视角:代码中使用Mapper接口
对数据进行数据库操作,具体的SQL在Mapper xml文件
中。可以看到Mapper接口
和Mapper xml
是有一定的关联关系的,我们的配置思路也是如此,就是把两者绑定起来即可。
- 首先我们需要先定义一个dataSource,用于连接数据库;
- 其次我们需要定义一个sessionFactory来管理
dataSource
和Mapper文件
; - 最后我们需要使用MapperScanner把Mapper文件和Mapper接口关联起来。
经过以上3个步骤,我们就使用Spring把Mybatis整合完成了。 根据以上思路,来具体操作下
2. 开始配置
2.1 数据源
这个比较简单,就是一个普通的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;}
2.2 配置session工厂(加载xml文件)
这个配置也非常简单,只需要配置要引用的datasource
和mapper文件的位置
@Beanpublic 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文件有多个路径,配置改为下面这样
@Beanpublic 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();}
2.3 配置MapperScanner(扫描Mapper接口,并与xml建立连接)
前面两个步骤配置好了数据源
和xml文件
,此时就可以扫描Mapper接口了。这个配置只需要指定sessionFactory
和Mapper接口的路径
即可。
常用的配置方式有两种,下面分别示例一下。
2.3.1 注解方式
// 如果存在多个包,可使用逗号分割
@MapperScan(basePackages = "com.kaka.jtest.springboot.biz.mapper",sqlSessionFactoryRef = "sqlSessionFactory")
2.3.2 java配置方式
@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();// 1. 指定Mapper接口包名(路径若有多个,使用逗号分隔)mapperScannerConfigurer.setBasePackage("com.kaka.jtest.springboot.biz.mapper");// 2. 指定工厂的bean名称mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");return mapperScannerConfigurer;}
3. 配置多数据源
看完以上步骤,应该就了解spring整合Mybatis的大致思路了,这个配置也就比较明了了。这里简单些一下。
3.1 配置多个datasource
@Bean("db1")public DruidDataSource dataSource() {// 省略具体配置...return dataSource;}@Bean("db2")public DruidDataSource dataSource() {// 省略具体配置...return dataSource;}
3.2 配置多个sessionFactory
这里不同的sessionFactory使用不同的数据源,扫描不同的xml配置文件。
@Beanpublic 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();}@Beanpublic 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();}
2.4.3 配置多个MapperScanner
@Beanpublic MapperScannerConfigurer mapperScannerConfigurer1() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();// 1. 指定Mapper接口包名(路径若有多个,使用逗号分隔)mapperScannerConfigurer.setBasePackage("com.kaka.jtest.springboot.biz.mapper");// 2. 指定工厂的bean名称mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory1");return mapperScannerConfigurer;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer2() {MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();// 1. 指定Mapper接口包名(路径若有多个,使用逗号分隔)mapperScannerConfigurer.setBasePackage("com.kaka.jtest.springboot.biz.mapper");// 2. 指定工厂的bean名称mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory2");return mapperScannerConfigurer;}
至此多数据源配置完成!