(转)MyBatis框架的学习(六)——MyBatis整合Spring
http://blog.csdn.net/yerenyuan_pku/article/details/71904315
本文将手把手教你如何使用MyBatis整合Spring,这儿,我本人使用的MyBatis是MyBatis3.2.7这个版本,Spring是Spring4.1.3这个版本。读者只要学会这两个版本的框架整合之后,其他版本之间的整合就一通百通了。
整合思路
MyBatis整合Spring的思路如下:
- SqlSessionFactory对象应该放到spring容器中作为单例存在。
- 传统Dao的开发方式中,应该从spring容器中获得sqlsession对象。
- Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
- 数据库的连接以及数据库连接池事务管理都交给spring容器来完成。
整合需要的jar包
MyBatis整合Spring所需的jar包如下:
- Spring的jar包。
- Mybatis的jar包。
- Spring+Mybatis的整合包,即
mybatis-spring-1.2.2.jar
。 - MySql的数据库驱动jar包。
- 数据库连接池的jar包。
我整理出来的MyBatis与Spring整合全部jar包(包括springmvc):
整合的步骤
下面我将按照下面整合的步骤来整合MyBatis与Spring:
- 第一步:创建一个java工程。
- 第二步:导入jar包(上面提到的jar包)。
- 第三步:编写mybatis的配置文件——SqlMapConfig.xml。
- 第四步:编写Spring的配置文件。
- 数据库连接及连接池
- 事务管理(暂时可以不配置)
- sqlsessionFactory对象,配置到spring容器中
- mapeer代理对象或者是dao实现类配置到spring容器中
- 第五步:编写Dao或者mapper.xml映射文件。
- 第六步:测试。
按照上面的步骤来整合MyBatis与Spring的话,一般来说,MyBatis的核心配置文件——SqlMapConfig.xml的内容就应是:
<?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>
<!-- 配置pojo别名 -->
<typeAliases>
<!-- <typeAlias type="cn.itheima.mybatis.po.User" alias="user"/> -->
<!-- 扫描包的形式创建别名,别名就是类名,不区分大小写 -->
<package name="cn.itheima.mybatis.po" />
</typeAliases>
<!-- 加载mapper文件 -->
<mappers>
<!-- resource是基于classpath来加载的 -->
<mapper resource="sqlmap/user.xml" />
</mappers>
</configuration>
Spring核心配置文件——application-context.xml的内容就应是:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- SqlSessionFactory的配置 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据库连接池 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis的核心配置文件 -->
<property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml"></property>
</bean>
</beans>
其中db.properties配置文件中的内容是:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=yezi
Dao层的开发
MyBatis整合Spring之后,就要开发Dao层了, Dao层的开发有三种实现方式:
- 传统Dao层的开发方式。
- 使用mapper代理形式开发方式。
- 使用扫描包配置mapper代理。
下面我依次来讲解这三种实现方式。
传统Dao层的开发方式
传统Dao层的开发是使用接口+实现类的方式来完成的,Dao层实现类需要继承SqlsessionDaoSupport类,就像下面这样:
以上Dao层实现类——UserDaoImpl.java的内容为:
// 原始Dao开发方式,须继承抽象类SqlSessionDaoSupport
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User getUserById(int id) {
SqlSession sqlSession = getSqlSession();
// 根据id来查询用户信息
User user = sqlSession.selectOne("test.getUserById", id);
// 不要手动关闭SqlSession,如果你手动关闭了,就会抛出一个异常
// sqlSession.close();
return user;
}
@Override
public List<User> getUserByName(String username) {
// 创建一个SQLSession对象
SqlSession sqlSession = getSqlSession();
// 执行查询
List<User> list = sqlSession.selectList("getUserByName", username);
// 不要手动释放资源
// sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
// 创建一个SQLSession对象
SqlSession sqlSession = getSqlSession();
// 插入用户
sqlSession.insert("insertUser", user);
// 提交事务
sqlSession.commit();
// 不要手动释放资源
// sqlSession.close();
}
}
注意:以上每个方法中不要手动关闭SqlSession,如果你手动关闭了,就会抛出一个异常。
接着要把Dao层实现类——UserDaoImpl.java配置到Spring容器中,如下:
<!-- 传统dao的配置方法 -->
<bean id="userDaoImpl" class="cn.itheima.mybatis.dao.impl.UserDaoImpl">
<!-- 注入sqlSessionFactory这个属性 -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
最后我们就要进行测试了,在如下UserDaoTest单元测试类中
编写一个testGetUserById单元测试方法,如下:
public class UserDaoTest {
private ApplicationContext applicationContext;
@Before
public void init() {
// 初始化Spring容器
applicationContext = new ClassPathXmlApplicationContext("classpath:spring/application-context.xml");
}
@Test
public void testGetUserById() {
UserDao userDao = applicationContext.getBean(UserDao.class); // 通过类型去装配
// UserDao userDao = (UserDao) applicationContext.getBean("userDaoImpl");
User user = userDao.getUserById(24);
System.out.println(user);
}
}
运行testGetUserById方法,有可能出现以下异常:
异常信息已用红框框出,怎么解决呢?聪明的小伙伴们肯定知道了,有可能你之前UserDaoImpl实现类的getUserById方法是写成这样的:
@Override
public User getUserById(int id) {
SqlSession sqlSession = getSqlSession();
// 根据id来查询用户信息
User user = sqlSession.selectOne("getUserById", id);
// 不要手动关闭SqlSession,如果你手动关闭了,就会抛出一个异常
// sqlSession.close();
return user;
}
要解决该异常,只须将以上方法修改为:
@Override
public User getUserById(int id) {
SqlSession sqlSession = getSqlSession();
// 根据id来查询用户信息
User user = sqlSession.selectOne("test.getUserById", id);
// 不要手动关闭SqlSession,如果你手动关闭了,就会抛出一个异常
// sqlSession.close();
return user;
}
为什么要这样修改呢?我截图一张,你就应该明白了。
讲完传统Dao层的开发方式后,下面我来讲第二种实现方式——使用mapper代理形式开发Dao层。
Mapper代理形式开发Dao层
首先开发mapper接口及相对应的mapper.xml映射文件,如下所示:
然后配置mapper代理,即需要在application-context.xml文件中添加如下配置:
<!-- mapper代理形式dao的配置 -->
<!-- 第一种方式,配置代理对象 -->
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<!-- 设置代理的mapper接口,即为哪一个接口创建代理对象 -->
<property name="mapperInterface" value="cn.itheima.mybatis.mapper.UserMapper"></property>
<!-- 由于MapperFactoryBean这个类继承自SqlSessionDaoSupport类,所以要注入sqlSessionFactory这个属性 -->
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
整体效果看起来就像下面这样:
最后我们就要进行测试了,在UserDaoTest单元测试类中编写如下方法:
@Test
public void testUserMapper() {
UserMapper userMapper = applicationContext.getBean(UserMapper.class);
User user = userMapper.getUserById(24);
System.out.println(user);
}
小结:使用Mapper代理形式开发Dao层,在实际开发中显然不经用,因为万一有很多很多mapper接口需要配置其代理对象呢?所以下面我就要讲开发Dao层的第三种实现方式了,它在实际开发中就经常用到。
扫描包形式配置mapper代理
使用扫描包的形式配置mapper代理来开发Dao层,需要在application-context.xml文件中配置一个包扫描器,即在该文件中添加如下配置:
<!-- 第二种方式,配置包扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 配置要扫描的包 -->
<property name="basePackage" value="cn.itheima.mybatis.mapper" />
</bean>
注意:
- 该扫描器会自动去Spring容器中去找你已经初始化好后的sqlSessionFactory, 所以在此并不需要配置。
- 如果要扫描多个包,那么使用半角逗号分隔。
- 使用扫描包的形式配置mapper代理之后,每个mapper代理对象的id就是类名,且首字母小写。
这样,整体效果看起来就像下面这样:
并且如果在application-context.xml文件中配置了扫描包之后,在SqlMapConfig.xml配置文件中就不需要以下配置了:
<!-- 加载mapper文件 -->
<mappers>
<!-- resource是基于classpath来加载的 -->
<mapper resource="sqlmap/user.xml" />
</mappers>
至此,MyBatis整合Spring我就已总结完了,觉得还蛮走心的。读者如需查看源码,可参考MyBatis框架的学习(六)——MyBatis整合Spring!
(转)MyBatis框架的学习(六)——MyBatis整合Spring的更多相关文章
- (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码
http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...
- (转)MyBatis框架的学习(二)——MyBatis架构与入门
http://blog.csdn.net/yerenyuan_pku/article/details/71699515 MyBatis框架的架构 MyBatis框架的架构如下图: 下面作简要概述: S ...
- (转)MyBatis框架的学习(一)——MyBatis介绍
http://blog.csdn.net/yerenyuan_pku/article/details/71699343 MyBatis介绍 MyBatis本是apache的一个开源项目iBatis,2 ...
- (转)MyBatis框架的学习(三)——Dao层开发方法
http://blog.csdn.net/yerenyuan_pku/article/details/71700957 使用MyBatis开发Dao层,通常有两个方法,即原始Dao开发方法和Mappe ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- (转)MyBatis框架的学习(四)——Mapper.xml文件中的输入和输出映射以及动态sql
http://blog.csdn.net/yerenyuan_pku/article/details/71893689 前面对MyBatis框架的学习中,我们对Mapper.xml映射文件多少有些了解 ...
- Java数据持久层框架 MyBatis之API学习六(Mapper XML 文件详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- mybatis框架搭建学习初步
mybatis框架搭建步骤:1. 拷贝jar到lib目录下,而且添加到工程中2. 创建mybatis-config.xml文件,配置数据库连接信息 <environments default=& ...
- 用IntelliJ IDEA 开发Spring+SpringMVC+Mybatis框架 分步搭建三:配置spring并测试
这一部分的主要目的是 配置spring-service.xml 也就是配置spring 并测试service层 是否配置成功 用IntelliJ IDEA 开发Spring+SpringMVC+M ...
随机推荐
- CSproject文件总是在Solution中被修改PROJECT GUID问题
1.情况: 打开2个Solution 一个是client,一个是server 他们会互相修改GUID,切换solution的时候都会显示 xxxxx已经被外部修改云云 2.原因: 一般是在其中一个So ...
- [Xcode 实际操作]三、视图控制器-(2)UITabBarController选项卡(标签)视图控制器
目录:[Swift]Xcode实际操作 本文将为你演示,选项卡视图控制器的创建和使用. 在项目文件夹[DemoApp]上点击鼠标右键,弹出右键菜单. [New File]->[Cocoa Tou ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:1. 连接阿里云物联网
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- eclipse svn 相关
eclipse本身带有cvs插件,我们也可以在eclipse里面加上svn插件,请参考eclipse安装svn插件,以及使用,但是在eclipse的左边栏,.svn,.cvs的文件会显示出来,目录拉的 ...
- 码云最火爆开源项目 TOP 50,你都用过哪些?
前 20 名预览 排名软件排名软件 1zheng11AOSuite 2JFinal12Spiderman 3t-io13AG-Admin 4guns14renren-security 5hutool1 ...
- springMVC-上传图片
SpringMVC文件上传与下载 上传图片 配置多媒体文件解析器 配置虚拟目录 在tomcat上配置图片虚拟目录,在tomcat下conf/server.xml中添加: <Context doc ...
- Apache的多处理模块MPM
本博文主要参数 Apache 2.2文档以及Apache模块开发指南 Apache的整个运行可以分为两个阶段:启动阶段和运行阶段. 在启动阶段时,它以ROOT特权来启动,进行解析配置文件(一般就是ht ...
- 在WIN7、WIN8中,将快捷方式锁定到任务栏,C#
其实很简单,使用 API 函数 ShellExecute,就可以解决这个问题. 首先添加引用 using System.Runtime.InteropServices; 代码如下: using Sys ...
- Java中的数据类型——通过示例学习Java编程(5)
作者:CHAITANYA SINGH 来源:https://www.koofun.com//pro/kfpostsdetail?kfpostsid=15 数据类型用来定义变量可以采用的值,例如,如果变 ...
- 关于php和docker
Docker在PHP项目开发环境中的应用 http://www.wolonge.com/zhuanlan/detail/117441 Docker在PHP项目开发环境中的应用 http://linux ...