1.概述
MyBatis-Spring用于将MyBatis代码无缝地整合到Spring中。
- Spring将会加载必要的MyBatis工厂类和session类
- 提供一个简单的方式来注入MyBatis数据映射器和SqlSession到业务层的bean中
- 方便集成spring事务
- 翻译MyBatis的异常到Spring的DataAccessException异常(数据访问异常)中
MyBatis-Spring兼容性
2.集成配置最佳实践
step1.准备一个Spring项目
在pom.xml中添加相关Spring依赖。
step2.在pom.xml文件中添加MyBatis-Spring的依赖
org.mybatis
mybatis-spring
1.3.0
step3.配置SqlSessionFactoryBean
在applicationContext.xml进行配置。
step4.配置MapperScannerConfigurer
step5.配置事务
3.集成的原理分析
3.1 SqlSessionFactoryBean
在MyBatis-Spring中,SqlSessiongFacotyBean是用于创建SqlSessionFactory的。
- dataSource:用于配置数据源,该属性为必选项,必须通过这个属性配置数据源
- mapperLocations:配置SqlSessionFactoryBean扫描XML映射文件的路径,可以使用Ant风格的路径进行配置
- configLocation:用于配置mybatis config XML的路径,除了数据源外,对MyBatis的各种配置仍然可以通过这种方式进行,并且配置MyBatis settings时只能使用这种方式。但配置文件中任意环境、数据源和MyBatis的任务管理器都会被忽略。
- typeAliasesPackage:配置包中类的别名,配置后,包中的类在XML映射文件中使用时可以省略包名部分,直接使用类名。这个配置不支持Ant风格的路径,当需要配置多个包路径时可以使用分号或逗号进行分隔。
3.2 MapperScannerConfigurer
通过MapperScannerConfigurer类自动扫描所有的Mapper接口,使用时可以直接注入接口。
MapperScannerConfigurer中常配置以下两个属性:
- basePackage:用于配置基本的包路径。可以使用分号或逗号作为分隔符设置多于一个的包路径,每个映射器将会在指定的包路径中递归地被搜索到。
- annotationClass:用于过滤被扫描的接口,如果设置了该属性,那么MyBatis的接口只有包含注解才会被扫描进去。
4.集成测试
说明:jdk1.10使用@Resource测试有问题,换成jdk1.8就可以了。因此jdk1.10测试时用的是@Autowired。
服务类:
public interface UserService {
TUser getUserById(Integer id);
}
@Service
public class UserServiceImpl implements UserService{
@Autowired
private TUserMapper userMapper;
@Override
public TUser getUserById(Integer id) {
return userMapper.selectByPrimaryKey(id);
}
}
applicationContext.xml自动扫描service:
测试:
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(locations = "file:src/main/resources/applicationContext.xml")
@ContextConfiguration("classpath:applicationContext.xml")
public class MybatisSpringTest {
@Autowired
private UserService us;
@Test
public void TestSpringMyBatis(){
System.out.println(us.getUserById(1).toString());
}
测试结果:
17:56:47.022 [main] DEBUG c.e.m.m.T.selectByPrimaryKey - ==> Preparing: select id, user_name, real_name, sex, mobile, email, note, position_id from t_user where id = ?
17:56:47.055 [main] DEBUG c.e.m.m.T.selectByPrimaryKey - ==> Parameters: 1(Integer)
17:56:47.082 [main] DEBUG c.e.m.m.T.selectByPrimaryKey - <== Total: 1
17:56:47.083 [main] DEBUG c.a.druid.pool.PreparedStatementPool - {conn-10001, pstmt-20000} enter cache
17:56:47.084 [main] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2bcec6a6]
TUser [id=1, userName=lison, realName=李小宇, sex=1, mobile=186995587422, [email protected], note=lison的备注, positionId=1]
参考
- 1)享学课堂Lison老师笔记