简单几步使用Spring整合MyBatis(含配置多数据源和多Mapper XML文件路径)

发布时间:2024年01月06日

1. 逻辑梳理

我们先分析下使用者视角:代码中使用Mapper接口对数据进行数据库操作,具体的SQL在Mapper xml文件中。可以看到Mapper接口Mapper xml是有一定的关联关系的,我们的配置思路也是如此,就是把两者绑定起来即可。

  1. 首先我们需要先定义一个dataSource,用于连接数据库;
  2. 其次我们需要定义一个sessionFactory来管理dataSourceMapper文件
  3. 最后我们需要使用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文件)

这个配置也非常简单,只需要配置要引用的datasourcemapper文件的位置

    @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接口了。这个配置只需要指定sessionFactoryMapper接口的路径即可。
常用的配置方式有两种,下面分别示例一下。

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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。