本文博客地址:http://blog.youkuaiyun.com/soonfly/article/details/64495909 (转载请注明出处)
MyBatis和Spring整合可以有很多种方式,只要明白几个重要的类,就能随心所欲整合了。
导入包
我们可以从Mybatis官网上下载Mybatis-Spring的jar包添加到我们项目的类路径下。
当然不要忘记添加Mybatis的相关jar包和Spring的相关jar包。
(点击下载相关包)
接下来要在Spring的applicationContext.xml配置文件中进行主要类的配置
一、SqlSessionFactoryBean
我们知道在Mybatis的所有操作都是基于SqlSession的。SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。
Mybatis-Spring包(org.mybatis.spring)封装了一个SqlSessionFactoryBean,在这个bean里面也是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。
所以无论哪种方式,第一步必须配置SqlSessionFactoryBean (首先还得配置数据源)
<!-- 加载db.properties数据库连接信息 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}" />
<!-- 连接池最大数量 -->
<property name="maxActive" value="${maxActive}" />
<!-- 连接池最大空闲 -->
<property name="maxIdle" value="${maxIdle}" />
<!-- 连接池最小空闲 -->
<property name="minIdle" value="${minIdle}" />
<!-- 获取连接最大等待时间 -->
<property name="maxWait" value="${maxWait}" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 加载数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
除了必填的dataSource属性外,还有几个重要属性:
configLocation:指定Mybatis的配置文件位置,并以该配置信息构建SqlSessionFactoryBuilder。后续属性指定的内容会覆盖该配置文件里面指定的对应内容。
mapperLocations:指定Mapper配置文件位置,批量载入。当Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。同mybatis配置中的<mappers>
作用。
typeAliasesPackage:指定实体POJO类所在的包,并取类名作为别名。多个package之间可以用逗号或者分号等来进行分隔。同mybatis配置中的<typeAliases>
作用。
typeAliases:数组类型。用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名。类上标注@Alias
注解,将优先使用注解。同mybatis配置中的<typeAliases>
作用。
<property name="typeAliases">
<array>
<value>twm.mybatisdemo.pojo.User</value>
<value>twm.mybatisdemo.pojo.Order</value>
</array>
</property>
plugins:数组类型,用来指定Mybatis的Interceptor。
typeHandlersPackage:用来指定TypeHandler所在的包,如果指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间可以用逗号或者分号等来进行分隔。
typeHandlers:数组类型,表示TypeHandler。
有了上面这些参数,可以发现,原来SqlMapConfig.xml
的配置全都可以在SqlSessionFactoryBean
的属性中完成。
二、MapperFactoryBean
我们已经完成通过Mybatis-Spring包(org.mybatis.spring)中的SqlSessionFactoryBean获取Sqlsession了。
接下来,就要获取Mapper对象进行业务开发了。
在Spring的applicationContext文件中定义Mapper对象,是通过Mybatis-Spring包中MapperFactoryBean类实现的
<bean id="UserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="twm.mybatisdemo.mapper.UserMapper" />
<!-- 上面定义的sqlSessionFactory -->
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
有两个属性需要我们注入:sqlSessionFactory和mapperInterface(对应的Mapper接口)
定义好后,spring容器已经接管UserMapper对象,这时可以开始业务逻辑的编写了:
public static void main(String[] args) throws Exception {
ApplicationContext context =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
UserMapper usermp = context.getBean(UserMapper.class);
System.out.println(usermp.selectAll().size());
}
一切OK!成功
很简单的配置,只需两个类搞定整合。当然,我们还要继续探讨。
三、MapperScannerConfigurer
利用上面的方法进行整合的时候,我们要一个一个的定义MapperFactoryBean来生成Mapper对象。如果mapper数量一多就傻了。
为此Mybatis-Spring为我们提供了一个叫做MapperScannerConfigurer
的类,这个会自动为我们注册Mapper对应的MapperFactoryBean对象。
多个包之间可以使用逗号或者分号进行分隔。
因此,可以直接把上面那段org.mybatis.spring.mapper.MapperFactoryBean
的定义删掉,改用:
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="twm.mybatisdemo.mapper" />
</bean>
如果要缩小搜索和注册范围:
annotationClass:当指定了annotationClass的时候,只有使用annotationClass注解标记的接口才会被注册。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="twm.mybatisdemo.mapper" />
<property name="annotationClass" value="twm.mybatisdemo.mapper.testannotation"/>
</bean>
markerInterface:markerInterface用于指定一个接口的,当指定了markerInterface之后,MapperScannerConfigurer将只注册继承自markerInterface的接口。
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="twm.mybatisdemo.mapper" />
<property name="markerInterface" value=""twm.mybatisdemo.mapper.baseMapper"/>
</bean>
如果上述两个属性都指定了的话,那么MapperScannerConfigurer将取它们的并集,而不是交集。也就是接口需要同时满足上述两个条件。
sqlSessionFactoryBeanName:用于指定选择一个sqlSessionFactory对象。如果在前面定义了多个sqlSessionFactory,这里不指定的话,系统会出错,不知道使用哪个,所以必须指定一个。如果整个配置中只有一个sqlSessionFactory,就可以不用指定。
四、SqlSessionTemplate
上面都是针对Mapper接口(含用注解实现的接口)的配置。
在使用mybatis进行业务层开发中,我们还有一种不使用Mapper接口的方式,而是直接用sqlsession访问Mapper配置文件,在《【MyBatis学习03】调用Mapper映射的3种使用方式》可以看到:
SqlSession session = SqlSessionAssist.getSession();
session.insert("twm.mybatisdemo.mapper.User2Mapper.insert",aPerson);
因此,我们需要在代码中直接获取Sqlsession对象。
Mybatis-Spring为我们提供了一种直接使用SqlSession的方式,就是一个实现了SqlSession接口的SqlSessionTemplate类(它是线程安全的,可以被多个Dao同时使用)。
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
然后我们在业务层调用:
ApplicationContext context =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
SqlSession session = context.getBean("sqlSession",SqlSession.class);
User userEntity=session.selectOne("twm.mybatisdemo.mapper.UserMapper.selectById",86);
System.out.println(userEntity.getUsername());
五、SqlSessionDaoSupport类
这一个不是配置,而是一个类。
如果继承该类的都可以通过this.getSqlSession()
获取到SqlSession,进而进行业务操作。
它是一个抽象类,本身使用场景就是作为 DAO 的基类来使用的。它需要一个 SqlSessionTemplate 或一个 SqlSessionFactory ,若两者都设置了,则 SqlSessionFactory 会被忽略(实际上它接收了 SqlSessionFactory 后也会利用 SqlSessionFactory 创建一个 SqlSessionTemplate )。
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
if (!this.externalSqlSession) {
this.sqlSession = new SqlSessionTemplate(sqlSessionFactory);
}
}
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSession = sqlSessionTemplate;
this.externalSqlSession = true;
}
这样,我们在子类中就能通过调用 SqlSessionDaoSupport 类的 getSqlSession()
方法来获取这个 SqlSessionTemplate 对象。
来看一个例子:
映射器接口:
interface UserDaoService{
public User selectUserById(int id);
}
DAO层:
class UserDaoServiceImpl extends SqlSessionDaoSupport implements User{
SqlSession session;
UserDaoServiceImpl(){
session=this.getSqlSession();
}
public User selectUserById(int id){
User userEntity = session.selectOne(
"twm.mybatisdemo.mapper.UserMapper.selectById", id);
return userEntity;
}
}
Mapper配置文件:
<?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="twm.mybatisdemo.mapper.UserMapper">
<select id="selectById" parameterType="int" resultType="User" useCache="true">
select * from user where id=#{id}
</select>
</mapper>
applicationContext.xml配置:
<bean id="userDaoServiceImpl" class="twm.mybatisdemo.DaoImpl.UserDaoServiceImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
本文博客地址:http://blog.youkuaiyun.com/soonfly/article/details/64495909 (转载请注明出处)