您的位置:首页 > 编程语言 > Java开发

【MyBatis学习14】MyBatis和Spring整合

2017-03-21 20:06 483 查看
本文博客地址:http://blog.csdn.net/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>


有两个属性需要我们注入:sqlSessionFactorymapperInterface(对应的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.csdn.net/soonfly/article/details/64495909 (转载请注明出处)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: