1. 手动编写映射器实现存在的问题:
(1) SqlSession.selectList() 等方式需要采用字符串来指定映射项,
即如下代码示例中需要记住"com.zb.mapper.UserMapper.login"这样一串路径字符串,很不方便;
sqlSession.selectOne("com.zb.mapper.UserMapper.login",userCode);
(2) SqlSession.getMapper() 等方式需要每次调用时都实现一次映射器接口,才能调用相应的方法,
即每次的执行到getMapper(UserMapper.class)时,都会实现一次此接口,占用资源和时间;
sqlSession.getMapper(UserMapper.class).login(userCode);
2. 使用MapperFactoryBean,指定映射器的接口在哪儿。此处的第一个value,与实体类的映射文件的命名空间(UserMapper.xml的namespace)和UserMapper.java完全限定名一致,才能自动映射;采用此方法,不需要去手动编写UserMapperImpl()这类的映射器实现类。
<!-- 注入映射器,MapperFactoryBean -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 指定映射器mapper接口的地址 -->
<property name="mapperInterface" value="com.zb.mapper.UserMapper" />
<!-- 用set注入方式将sqlSessionFactory注入到这个类的实例中 -->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
注意:
(1). 此处映射器必须为接口类型;
(2). sqlSessionFactory必须要提供;
(3). 如果UserMapper.xml与Usermapper.java在同一个路径下的,spring_mybatis.xml文件中的mapper映射语句是不需要写的,会被MapperFactoryBean自动解析。
3. MapperScannerConfigurer
按照上面的写法,若映射器很多的话,相应的配置项也会很多;
MapperScannerConfigurer可以自动扫描包下的Mapper接口,并将它们自动注册为MapperFactoryBean
<!--
MapperScannerConfigurer自动扫描com.zb.mapper包下的以及子包下的所有映射器(mapper)接口,
并自动注册为MapperFactoryBean;
basePackage:指定扫描的基准包
-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.zb.mapper" />
</bean>
此时使用扫描映射器的方式,将省去手写映射器配置的代码,即如上第2点的mapper注入映射器代码将省去。此处的映射器必须为接口。自动注册的映射器取得默认别名为该映射器的名字首字母小写。
例如:该路径下UserMapper接口映射器,自动扫描注册后,别名为userMapper。
4. Service层利用注解自动注入
//Service的实现类
@Service("userService")
public class UserServiceImpl implements UserService{
//@Autowired用于自动装配userMapper属性
@Autowired
//@Qualifier标识符通过别名的方式将指定的Mapper映射器选中
@Qualifier("userMapper")
private UserMapper userMapper;
public UserMapper getUserMapper() {
return userMapper;
}
public void setUserMapper(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User login(String userCode, String userPassword) {
return userMapper.login(userCode, userPassword);
}
}
5. 测试类
private Logger logger = Logger.getLogger("SmbmsTest.class");
@Test
public void loginTest() {
ApplicationContext ac = new ClassPathXmlApplicationContext("spring_mybatis.xml");
UserService um = (UserService) ac.getBean("userService");//此处引号内的userService就是上段代码中@Service中取得别名
logger.info(um.login("admin","1234567"));
}
运行结果:
[INFO] 2018-08-09 12:24:33,836 SmbmsTest.class - User [id=1, userCode=admin, userName=系统管理员 。。。
后面的就不写了,结果是成功的,同时节省了大量的编码
MapperFactoryBean是SqlSessionDaoSupport的一个子类。