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类)



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

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

(0)
上一篇 2022年5月18日 下午1:20
下一篇 2022年5月18日 下午1:20


相关推荐

  • bwapp sql部分[通俗易懂]

    bwapp sql部分[通俗易懂]文章目录SQLInjection(GET/Search)SQLInjection(GET/Select)SQLInjection(POST/Search)SQLInjection(POST/Select)SQLInjection(AJAX/JSON/jQuery)SQLInjection(CAPTCHA)SQLInjection(LoginForm/Hero)SQLInjection(LoginForm/User)SQLInjection(SQLite)SQLInj

    2026年2月21日
    2
  • 为什么要进行分销?

    为什么要进行分销?

    2021年6月17日
    97
  • 【python总结】python学习框架梳理

    【python总结】python学习框架梳理目录基础注释与变量名等基本规则关键字操作符数字字符串条件控制序列列表元组映射集合字典函数函数基础内置函数有哪些?模块数字字符串OSlogging、argparase、cmd综合模板错误和异常面向对象提高文件操作函数式编程正则表达式网络编程多线程与多进程本专栏不适合才学python的新手,适合学过python,但总体框架不清晰的朋友。跟我一起总结提升吧!抓住三个点:操作符、、内置函数、

    2022年6月9日
    32
  • mac phpstorm 激活码【2021.8最新】

    (mac phpstorm 激活码)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS32PGH0SQB-eyJsaWNlbnNlSW…

    2022年3月26日
    76
  • XSS(跨站脚本攻击)相关内容总结整理

    XSS的攻击相关资料整理文章目录XSS的攻击相关资料整理跨站脚本攻击(XSS)XSS 简介XSS 危害XSS 原理XSS 分类XSS 防御总结XSS 问答参考资料跨站脚本攻击(XSS)XSS 简介人们经常将跨站脚本攻击(Cross Site Scripting)缩写为CSS,但这会与层叠样式表(Cascading Style Sheets,CSS)的缩写混淆。因此,有人将跨站脚本攻击缩写为XSS。跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户

    2022年3月1日
    52
  • thinphp 安装 系统不支持curl!

    thinphp 安装 系统不支持curl!找到php.ini配置文件找到:修改前;extension=php_curl.dll修改后extension=php_curl.dll  //只是去掉前面的”;’分号php_curl.dll存在于php安装包的\ext文件夹下面,如果实在没有,自己去网上下载一个php_curl.dll放到:….\php\ext目录下注意:保存之后,重启一次服务器(

    2022年7月27日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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