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里,最基础的两个类:
- SqlSessionFactoryBean:实现了利用SqlSessionFactoryBuilder来自动生成SqlSessionFactory实例,无需我们自己手动造轮子了,并可以自动绑定mapper(xml)映射;
- 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/