上一篇我们简单的讲解了Spring和MyBatis的整合,但你不难发现,其配置起来还是够麻烦的。最明显的一点是,我们需要在自定义的Mapper接口写个很长的SQL注解,并且还要手动注册到Spring容器。本文主要讲解简化的方法。
首先,还是定义接口,但你已看不到任何框架的痕迹,
package org.chen.mybatis.mapper; import org.chen.domain.Spitter; public interface SpitterMapper { Spitter getSpitter(String email); }
如果使用的是Maven,在资源文件夹resouces,建立和org.chen.mybatis.mapper相同的目录结构,
文件SpitterMapper的名字必须和上面的接口同名。SpitterMapper的内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.chen.mybatis.mapper.SpitterMapper"> <select id="getSpitter" resultType="org.chen.domain.Spitter"> select * from spitter where email = #{email} </select> </mapper>
id和接口对应的方法名同名,resultType是返回类名。(你可能觉得写这么长的类名很麻烦,确实是,等会有简化的方法)
接下来在Spring配置文件里,
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.chen.mybatis.mapper" /> </bean>
这个bean的作用和自动检测的一样,就是自动把basePackage指定的包下的mapper注册成MyBatis.
为了简化上面的resultType的书写,
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="org.chen.domain" /> </bean>
添加一个typeAliasesPackage,即包名的别名,这样直接写resultType="Spitter"就可以了。
最后我们向service注入Mapper,
@Service public class TestService { @Autowired private SpitterMapper spitterMapper; public void setSpitterMapper(SpitterMapper spitterMapper) { this.spitterMapper = spitterMapper; }