1. Mapper映射器是Mybatis中的核心工具,也是Mybatis的核心功能。通过映射器,我们可以自定义SQL语句,灵活的操作数据库,
这也是Mybatis的特色所在。所以,熟练使用映射器是掌握Mybatis的核心。Mybatis映射器由mapper接口和mapper xml配置文件组成
2.我们之前采用的都是字符串的方式来指定我们的映射器,这种方式有哪些缺点,,比如你拼写的过程里有错误,编译期是无法识别的,只能运行时才能发现,如果明明空间发生变化,会导致很多地方需要修改,不易维护
3.我们还可以使用getMapper方法,根据指定的映射器和映射文件最直接生成实现类,但是在集成开发环境里
这并非是最佳的选择,我们可以利用mybatis-spring 提供的组件,可以不需要每次调用get方法,而是以配置的
方式直接为业务对象注入映射器的实现,无需额外的编码。
第一种方式:
采用数据映射器(MapperFactoryBean)的方式完成对数据库操作
根据Mapper接口获取Mapper对象,它封装了原有的SqlSession.getMapper()功能的实现
<!-- 配置DAO -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="cn.kgc.dao.UserMapper"/>
<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
</bean>
第二种方式:为了解决第一种方式的问题
若映射器很多的话,相应的配置项也会很多,如何简化配置工作量?
MapperScannerConfigurer 类
自动扫描指定包下的Mapper接口,并将它们直接注册为MapperFactoryBean
MapperScannerConfigurer 与@Autowired注解或@Resource注解配合使用,自动创建映射器实现并注入给业务组件,能够最大限度地减少DAO组件与业务组件的编码和配置工作
@Service("userService")
public class UserServiceImpl implements UserService {
@Autowired // 或 @Resource
private UserMapper userMapper; //属性
//……代码省略
}
id可以省略, 默认是接口的名称 ,首字母小写
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 可以自动扫描 DAO 包下的接口-->
<property name="basePackage" value="cn.kgc.dao" />
</bean>
<!-- 配置扫描注解定义的业务Bean -->
<context:component-scan base-package="cn.kgc.service" />
配置事物管理器(xml)
<!-- 定义事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务管增强 -->
<!-- 配置事务管增强 需要指定一个事物管理器-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="find*" propagation="SUPPORTS" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="del*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<!-- 定义切面 -->
<aop:config>
<!-- 定义切入点,及切入点的表达式 和id -->
<aop:pointcut id="serviceMethod"
expression="execution(* cn.kgc.service..*.*(..))" />
<!-- 把增强的引用和切入点的引用组合起来-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" />
</aop:config>