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

MyBatis3与Spring4整合方法详解(使用SqlSessionTemplate类)摘要:由于项目需要,第一次接触MyBatis,在网上找了很多MyBatis与Spring的整合方法,网上的资料不够详细,虽然讲了很多整合方法,但却没有针对每一种方法去详细讲解,对于没有相关基础的人难以操作,因此自己整理记录如下转载自:http://p.primeton.com/articles/54c1dcc5be20aa3884000012由于项目需要,第一次接触MyBatis,

大家好,又见面了,我是你们的朋友全栈君。

摘要:由于项目需要,第一次接触MyBatis,在网上找了很多MyBatis与Spring的整合方法,网上的资料不够详细,虽然讲了很多整合方法,但却没有针对每一种方法去详细讲解,对于没有相关基础的人难以操作,因此自己整理记录如下
由于项目需要,第一次接触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类)



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/144932.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • acwing-170. 加成序列(迭代加深)「建议收藏」

    acwing-170. 加成序列(迭代加深)「建议收藏」满足如下条件的序列 X(序列中元素被标号为 1、2、3…m)被称为“加成序列”:X[1]=1X[m]=nX[1]<X[2]<…<X[m−1]<X[m]对于每个 k(2≤k≤m)都存在两个整数 i 和 j (1≤i,j≤k−1,i 和 j 可相等),使得 X[k]=X[i]+X[j]。你的任务是:给定一个整数 n,找出符合上述条件的长度 m 最小的“加成序列”。如果有多个满足要求的答案,只需要找出任意一个可行解。输入格式输入包含多组测试用例。每组测试用例占据一行,包含

  • adb操作命令详解及大全

    adb操作命令详解及大全adb是什么?:adb的全称为AndroidDebugBridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听SocketTCP5554等端口的方式让ID

  • android 实现悬架控制

    android 实现悬架控制

  • 虚拟opc服务器软件,几个OPC服务器开发工具比较

    虚拟opc服务器软件,几个OPC服务器开发工具比较1、WTOPCsvr.dll2、我2004年获得WTOPCsvr.dll的代码,这个代码是我学习VC++的启蒙,也是我学习OPC服务器开发的最重要的资料。用VB开发OPC服务器的话,可以说是首选,简单调用WTOPCsvr.dll的API就可以开发服务器。我到现在还是很钟爱这份代码。完全用MFC的方式,通过嵌套类实现COM组件的接口,代码比较清晰。2、Iconics2.11和FactorySoft…

  • matlab griddata插值太慢,griddata在二维插值中的应用问题,有待解决~

    matlab griddata插值太慢,griddata在二维插值中的应用问题,有待解决~>>x=rand(100,1)*4-2;>>y=rand(100,1)*4-2;>>z=x.*exp(-x.^2-y.^2);>>ti=-2:.25:2;>>[xi,yi]=meshgrid(ti,ti);>>zi=griddata(x,y,z,xi,yi,’cubic’);>>mesh(xi,yi,…

  • Vue(14)slot插槽的使用「建议收藏」

    Vue(14)slot插槽的使用「建议收藏」为什么使用slotslot(插槽)在生活中很多地方都有插槽,电脑usb的插槽,插板当中的电源插槽插槽的目的是为了让我们原来的设备具备更多的扩展性比如电脑的USB我们可以插入U盘,手机,鼠标,键

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号