spring_mybatis整合心得(二) 注入映射器的实现

本文详细介绍了MyBatis框架中使用MapperFactoryBean和MapperScannerConfigurer进行自动映射的方法,避免了手动编写映射器实现类的繁琐过程,提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的一个子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值