MyBatis3与Spring4整合方法详解(使用SqlSessionTemplate类)

时间:2023-01-16 05:10:48
摘要:由于项目需要,第一次接触MyBatis,在网上找了很多MyBatis与Spring的整合方法,网上的资料不够详细,虽然讲了很多整合方法,但却没有针对每一种方法去详细讲解,对于没有相关基础的人难以操作,因此自己整理记录如下 转载自:http://p.primeton.com/articles/54c1dcc5be20aa3884000012 由于项目需要,第一次接触MyBatis,在网上找了很多MyBatis与Spring的整合方法,网上的资料不够详细,虽然讲了很多整合方法,但却没有针对每一种方法去详细讲解,对于没有相关基础的人难以操作,因此自己整理记录如下(注:本次使用的是比较常用的SqlSessionTemplate,没有使用Mapper接口)。

本次使用版本为MyBatis 3.2.5、Spring4.0.7,为了将两者整合还需要一个jar包"mybatis-spring-1.2.2.jar",工具使用的是Eclipse kepler,本次使用到的所有jar包会附在最后。

本次整合创建的是普通Java Web工程,没有使用Maven工程,整合好之后的程序目录结构如下图所示,src与conf是类路径,src用于存放代码,conf用于存放配置文件以及MyBatis映射文件。applicationContext.xml是Spring配置文件,MyBatisConf.xml是MyBatis配置文件,这配置文件的名字可以随意命名。


MyBatis3与Spring4整合方法详解(使用SqlSessionTemplate类)


首先创建Java Web工程,并参考上图创建相应文件夹与包,导入MyBatis的jar包、Spring的jar包、Oracle驱动包、数据库连接池的jar包。

一.创建库表映射类并配置MyBatis

 首先在数据库中创建一张表“USER_INFO”
create table USER_INFO
(
ID VARCHAR2(10) not null,
USER_NAME VARCHAR2(50) not null,
USER_AGE VARCHAR2(100) not null,
USER_ADD VARCHAR2(200)
)
表创建好之后便创建其映射类“UserInfo”,位于包“vo”中
public class UserInfo {
private String id;
private String userName;
private String userAge;
private String userAdd;
public String getId()
{ return id; }
public void setId(String id)
{ this.id = id; }
public String getUserName()
{ return userName; }
public void setUserName(String userName)
{ this.userName = userName; }
public String getUserAge()
{ return userAge; }
public void setUserAge(String userAge)
{ this.userAge = userAge; }
public String getUserAdd()
{ return userAdd; }
public void setUserAdd(String userAdd)
{ this.userAdd = userAdd; }
}
映射类创建好之后便创建MyBatis映射文件(即Mapper文件),位于conf的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="UserInfoMapper">
<resultMap type="UserInfo">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="userAge" column="user_age" />
<result property="userAdd" column="user_add" />
</resultMap>
</mapper>
Mapper文件中的resultMap用于配置表中字段与映射类属性间的映射关系,其中的"type"表示映射类的完整类名,但此处没有使用"vo.UserInfo"的原因是在MyBatis配置文件中配置了其别名。

 紧接着就是创建MyBatis的配置文件"MyBatisConf.xml",用于配置映射类的别名并配置Mapper文件的路径,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 配置映射类的别名 -->
<typeAliases>
<typeAlias alias="UserInfo"/>
</typeAliases>
<!-- 配置Mapper文件的路径 -->
<mappers>
<mapper resource="mapper/UserInfoMapper.xml"/>
</mappers>
</configuration>
如果不与Spring进行整合的话,此配置文件还需要配置数据源信息,与Spring整合之后数据源就配置在Spring配置文件中,只需要配置映射文件的路径就可以了。

二.配置Spring

在配置数据源Bean时,其中的连接参数可以直接写在配置文件里,但更好的是将连接参数单独放到一个属性文件中,然后将此文件配置在Spring配置文件中让数据源Bean读取即可。在conf中创建jdbc配置文件“jdbc.properties”,文件内容如下:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=des
jdbc.password=des
接下来创建Spring配置文件“applicationContext.xml”,此时配置文件是空的,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
</beans>

然后便可以在Spring配置文件中引入jdbc配置文件了,代码如下所示:

<context:property-placeholder location="classpath:jdbc.properties"/>

然后在Spring配置文件配置数据源Bean,代码如下:
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property value="${jdbc.driverClassName}" />
<property value="${jdbc.url}" />
<property value="${jdbc.username}" />
<property value="${jdbc.password}" />
</bean>
在Mybatis中对数据库的所有操作都是基于一个SqlSession的,而SqlSession是由SqlSessionFactory来产生的,SqlSessionFactory又是由SqlSessionFactoryBuilder来生成的。但是Mybatis-Spring给我们封装了一个SqlSessionFactoryBean,在这个bean里面还是通过SqlSessionFactoryBuilder来建立对应的SqlSessionFactory,进而获取到对应的SqlSession。通过SqlSessionFactoryBean我们可以通过对其指定一些属性来提供Mybatis的一些配置信息。所以接下来我们需要在Spring的applicationContext配置文件中定义一个SqlSessionFactoryBean。
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定使用的数据源 -->
<property ref="dataSource" />
<!-- 指定MyBatis配置文件路径 -->
<property name="configLocation" value="MyBatisConf.xml"/>
</bean>
在定义SqlSessionFactoryBean的时候,dataSource属性是必须指定的,它表示用于连接数据库的数据源。当然,我们也可以指定一些其他的属性,下面简单列举几个:

l  mapperLocations:它表示我们的Mapper文件存放的位置,当我们的Mapper文件跟对应的Mapper接口处于同一位置的时候可以不用指定该属性的值。

l  configLocation:用于指定Mybatis的配置文件位置。如果指定了该属性,那么会以该配置文件的内容作为配置信息构建对应的SqlSessionFactoryBuilder,但是后续属性指定的内容会覆盖该配置文件里面指定的对应内容。

l  typeAliasesPackage:它一般对应我们的实体类所在的包,这个时候会自动取对应包中不包括包名的简单类名作为包括包名的别名。多个package之间可以用逗号或者分号等来进行分隔。

l  typeAliases:数组类型,用来指定别名的。指定了这个属性后,Mybatis会把这个类型的短名称作为这个类型的别名,前提是该类上没有标注@Alias注解,否则将使用该注解对应的值作为此种类型的别名。
<property>
<array>
<value>com.tiantian.mybatis.model.Blog</value>
<value>com.tiantian.mybatis.model.Comment</value>
</array>
</property>
l  plugins:数组类型,用来指定Mybatis的Interceptor。

l  typeHandlersPackage:用来指定TypeHandler所在的包,如果指定了该属性,SqlSessionFactoryBean会自动把该包下面的类注册为对应的TypeHandler。多个package之间可以用逗号或者分号等来进行分隔。

l  typeHandlers:数组类型,表示TypeHandler。

在配置好SqlSessionFactory之后,我们便可以配置SqlSessionTemplate了。Mybatis-Spring为我们提供了一个实现了SqlSession接口的SqlSessionTemplate类,它是线程安全的,可以被多个Dao同时使用。同时它还跟Spring的事务进行了关联,确保当前被使用的SqlSession是一个已经和Spring的事务进行绑定了的。而且它还可以自己管理Session的提交和关闭。当使用了Spring的事务管理机制后,SqlSession还可以跟着Spring的事务一起提交和回滚。

使用SqlSessionTemplate时我们可以在Spring的applicationContext配置文件中如下定义:
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
这样我们就可以通过Spring的依赖注入在Dao中直接使用SqlSessionTemplate来编程了。

三.编写Dao、Service代码

 在完成MyBatis与Spring的基本配置之后便可以编写Dao层、Service层代码。首先在MyBatis的Mapper文件中编写SQL语句,内容如下:

<select parameterType="String" resultMap="UserInfoMap">
select * from user_info where id = # {id}
</select>
此SQL表示根据用户ID查询用户信息,"id"用于唯一表示此SQL语句,"parameterType"表示传入参数类型,"resultMap"表示返回映射类要与映射关系元素的"id"保持一致。此时完整的Mapper文件内容如下(不包括文件头):
<mapper namespace="UserInfoMapper">
<resultMap type="UserInfo">
<id property="id" column="id" />
<result property="userName" column="user_name" />
<result property="userAge" column="user_age" />
<result property="userAdd" column="user_add" />
</resultMap>
<select parameterType="String" resultMap="UserInfoMap">
select * from user_info where id = #
</select>
</mapper>
然后创建接口IUserDao,位于包"dao"中,代码如下:
public interface IUserDao {\
/**
* 根据用户ID查询用户信息
* @param id
* @return
*/
public UserInfo findUserById(String id);
}
然后创建此接口的实现类"UserDaoImpl",位于包"dao.impl"中,代码如下:
public class UserDaoImpl implements IUserDao {
private SqlSessionTemplate sessionTemplate;
public void setSessionTemplate(SqlSessionTemplate sessionTemplate)
{ this.sessionTemplate = sessionTemplate; }
@Override
public UserInfo findUserById(String id)
{ UserInfo user = sessionTemplate.selectOne("UserInfoMapper.selectUserByID", "12"); return user; }
}
然后在Spring配置文件中注册此实现类的Bean,并为其注入"sessionTemplate"的属性值,代码如下:
<bean class="dao.impl.UserDaoImpl">
<property name="sessionTemplate" ref="sessionTemplate" />
</bean>
最后一步便是编写Service代码,由于此案例没有使用前端页面调用的方式,所以就在Service中通过main方法模拟对Dao层的调用,否则还应有Service层接口、controller层编码以及前端页面。Service类"UserService "位于包"service"中
public class UserService {
//Spring容器
private static ApplicationContext ctx;
private static IUserDao userDao;
static
{
// 在类路径下寻找Spring配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); }
public static void main(String[] args)
{ userDao = (IUserDao)ctx.getBean("userDao"); UserInfo user = userDao.findUserById("12"); System.out.println(user.getId()); System.out.println(user.getUserName()); }
}
上述类中有两个属性,"ctx"就是Spring容器,在main方法中先通过其给属性"userDao"赋值,然后调用其方法"findUserById"通过用户ID查询用户信息。


至此,MyBatis与Spring整合的实例便已完成。

附:jar包列表
MyBatis3与Spring4整合方法详解(使用SqlSessionTemplate类)