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)


相关推荐

  • java的大数运算(高新技术产品有哪些)

    java的大数运算(高新技术产品有哪些)本篇博客主要介绍Java常用类库之大数操作,主要是BigInteger和BigDecimal的API学习。之后介绍华为的一道历年真题,十六进制转换成十进制,我们可以看到题目中给我们设置的陷阱,以及如何解决它!

  • HibernateTemplate的常用方法「建议收藏」

    HibernateTemplate的常用方法「建议收藏」HibernateTemplate提供非常多的常用方法来完成基本的操作,比如通常的增加、删除、修改、查询等操作,Spring2.0更增加对命名SQL查询的支持,也增加对分页的支持。大部分情况下,使用Hibernate的常规用法,就可完成大多数DAO对象的CRUD操作。 下面是HibernateTemplate的常用方法简介:     voiddelete(Objecte…

  • HDU5432-Pyramid Split[通俗易懂]

    HDU5432-Pyramid Split[通俗易懂]最近以各种借口偷懒了,上次BC的题一直也没补,今天才补完第一题,非常好过,可当时就是想不通~#include#include#include#defineeps1e-5doublea[10005],b[10005];intn;intbSearch(doublebegin,doubleend,doublee){doublemid,left=begi

  • 蓝墨云班课计算机测试题答案,20155317 第一周蓝墨云班课考题「建议收藏」

    蓝墨云班课计算机测试题答案,20155317 第一周蓝墨云班课考题「建议收藏」201553172016-2017-2蓝墨云班课考题第2周上周蓝墨云班课考题1(单选题|1分)Amdahl定律说明,我们对系统的某个部分做出重大改进,可以显著获得一个系统的加速比。A.正确B.错误正确答案:B解析:课本16页:Amdahl定律的主要思想是:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。假设系统某部分所需执行时间与…

    2022年10月26日
  • emgucv 抠图[通俗易懂]

    我的环境的KinectSDK2.0+EmguCV3.0.0依旧还是WinFrom和ImageBox因为需要用到BodyIndex的数据,但BodyIndex的分辨率和RGB图像的分辨率不同,所以需要用的CoordinateMap类中的坐标转换函数。然后直接对colorimage的像素点进行操作。同样,需要用的指针,要把项目调整为允许不安全的代码。代码和注释如

  • HEX文件格式_hex是什么格式文件

    HEX文件格式_hex是什么格式文件冒号本行数据长度本行数据起始地址数据类型数据校验码:1byte2bytes1bytenbyte1byte:05001000A2C2A280FE67:00000001FF第

发表回复

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

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