简单几步使用Spring整合MyBatis(含配置多数据源和多Mapper XML文件路径)
2024-01-07 17:52:58
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文件的位置
@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();
}
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配置方式
@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;
}
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配置文件。
@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();
}
2.4.3 配置多个MapperScanner
@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;
}
至此多数据源配置完成!
文章来源:https://blog.csdn.net/Bronze5/article/details/135422867
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!