spring 的 mybatis基础配置(mybatis-spring)

    通过上一节 spring 的 mybatis基础配置,可以进行最基本的mybatis进行数据库操作,但有个比较麻烦的是,每次进行数据库操作时,必须要打开session、绑定mapper、关闭session这三个操作,多了许多代码,一个项目中往往有非常多的不同数据库操作,这样将给有非常多的代码冗余,也不好维护。

    这节我们通过mybatis提供的mybatis-spring包,解决代冗余问题,关于mybatis-spring包如何找,可以到这个地址https://mvnrepository.com/artifact/org.mybatis/mybatis,这个网站一般都找到maven包的。

    在mybatis-spring里,最基础的两个类:

  1. SqlSessionFactoryBean:实现了利用SqlSessionFactoryBuilder来自动生成SqlSessionFactory实例,无需我们自己手动造轮子了,并可以自动绑定mapper(xml)映射;
  2. MapperScannerConfigurer:通过SqlSessionFactoryBean实例,并mapper与接口关系对应。

主要代码

ConfigDBUtils.java,增加getSqlSessionFactoryBean和getMapperScannerConfigurer方法,用于创建SqlSessionFactoryBean和MapperScannerConfigurer实例,原先的getSqlSessionFactory可以删除

/**
     * 使用SqlSessionFactoryBean,扫描或绑定mapper(xml)位置
     *
     * @param dataSource 数据源
     * @param mapperPath mapper(xml)位置
     */
    public static SqlSessionFactoryBean getSqlSessionFactoryBean(DataSource dataSource, String mapperPath) {
        SqlSessionFactoryBean s = new SqlSessionFactoryBean();
        s.setDataSource(dataSource);
        ApplicationContext ctx = new FileSystemXmlApplicationContext();

        try {
            s.setMapperLocations(ctx.getResources(mapperPath));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return s;
    }

/**
     * 使用MapperScannerConfigurer,扫描或绑定 mapper接口位置,并与xml文件映射生产相应实例
     *
     * @param sqlSessionFactoryBean
     * @param packageName
     */
    public static MapperScannerConfigurer getMapperScannerConfigurer(String sqlSessionFactoryBean, String packageName) {
        MapperScannerConfigurer m = new MapperScannerConfigurer();
        //包名:指定mapper接口所在包位置
        m.setBasePackage(packageName);
        //SqlSessionFactoryBea的名称,用与mapper的接口和xml的映射
        m.setSqlSessionFactoryBeanName(sqlSessionFactoryBean);
        return m;
    }

Config.java

增加sqlSessionFactoryBean和mapperScannerConfigurer方法,系统启动时会自动创建

/**
     * 利用SqlSessionFactoryBean,绑定mapper(xml)位置
     * @param dataSource 数据源
     * @return
     */
    @Bean("SqlSessionFactory")
    public SqlSessionFactoryBean getSqlSessionFactory(DataSource dataSource) {
        return ConfigDBUtils.getSqlSessionFactoryBean(dataSource, "classpath*:mapper/*.xml");
    }

/**
     * mapper配置扫描并绑定
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        //SqlSessionFactory名称即是SqlSessionFactoryBean的指定bean名
        return ConfigDBUtils.getMapperScannerConfigurer("SqlSessionFactory", "com.blueinfinite.mapper");
    }

 

mapper(xml)和mapper的接口都已配置扫描位置,并会自动每个mybatis mapper的实例,所以我在使用时只要注入对应接口实例即可,测试代码如下:

import com.blueinfinite.App;
import com.blueinfinite.mapper.CustomMapper;
import com.blueinfinite.mapper.DepartmentMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringJUnitConfig(App.class)
public class TestMybatisSpring {

    @Autowired
    CustomMapper customMapper;

    @Autowired
    DepartmentMapper departmentMapper;

    @Test
    public void test_mybatis() {
        //查询
        System.out.println(customMapper.getCustom(3));
        System.out.println(departmentMapper.getInfo(5));
    }
}

业务代码已经比之前简单许多了,在一些小型应用中,由于业务特殊,还可以使用mybatis-spring的SqlSessionFactoryBean轻松实现多数据源管理,各数据库只需要指定对应的Bean名称即可。

源码参考:https://github.com/blueinfinite/testmybatisspring/

 

java,mybatis,spring | 2018-05-27 05:44:22