文章目录

  • 1、引言
  • 2、Spring整合Mybatis
    • 2.1、常规整合
      • 2.1.1、项目的结构
      • 2.1.2、applicationContext.xml配置
      • 2.1.3、UserInfoMapper接口的定义
      • 2.1.4、UserMapper.xml配置
      • 2.1.5、UserService定义和实现
    • 2.2、使用`SqlSessionTemplate`整合
      • 2.2.1、项目结构
      • 2.2.2、新增加`sqlSessionTemplate`配置
      • 2.2.3、实现UserInfoMapper接口
    • 2.3、使用`SqlSessionDaoSupport`整合
      • 2.3.1、项目结构
      • 2.3.2、新增BaseMapper配置
      • 2.3.3、实现UserInfoMapper接口
    • 2.4、使用`org.apache.ibatis.annotations`提供注解方式整合
      • 2.4.1、项目结构
      • 2.4.2、关键配置
      • 2.4.3、UserInfoMapper的定义
  • 3、总结

1、引言

本文一共提供了四种Spring整合MyBatis的方式分别是:

  1. 常规整合
  2. 使用SqlSessionTemplate整合
  3. 使用SqlSessionDaoSupport整合
  4. 使用org.apache.ibatis.annotations提供注解方式整合
    本文的相关源码请参考:
    chapter-6-springmvc-mybatis1(常规整合)
    chapter-6-springmvc-mybatis2(使用SqlSessionTemplate整合)
    chapter-6-springmvc-mybatis3( 使用SqlSessionDaoSupport整合)
    chapter-6-springmvc-mybatis4(使用org.apache.ibatis.annotations提供注解方式整合)
    https://gitee.com/leo825/spring-framework-learning-example.git

2、Spring整合Mybatis

建表语句

-- 创建一个简单的用户表
DROP TABLE IF EXISTS USER_INFO;CREATE TABLE USER_INFO (ID INT (11) PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',NAME VARCHAR (20) COMMENT '用户名称',GENDER VARCHAR (2) COMMENT '用户性别:0女1男',AGE VARCHAR (3) COMMENT '用户年龄',REMARKS VARCHAR (100) COMMENT '备注信息'
) COMMENT = '用户信息表'

pom.xml配置相同

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>spring-framework-learning-parents</artifactId><groupId>spring-framework-learning-example</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>chapter-6-springmvc-mybatis1</artifactId><packaging>war</packaging><description>Spring集成mybatis</description><!-- 工程展示名称 --><name>chapter-6-springmvc-mybatis1</name><!-- 工程的地址 --><url>https://gitee.com/leo825/spring-framework-learning-example.git</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>4.3.25.RELEASE</spring.version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- springmvc核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!-- aspectJ AOP 织入器 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.8.9</version></dependency><!--mybatis-spring适配器 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><!-- mybatis ORM框架 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency><!--c3p0 连接池 --><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version></dependency><!-- tomcat中存在此web运行的jar包 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2</version><scope>provided</scope></dependency><!-- 使用SpringJDBC进行数据库配置 --><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><!-- mysql数据库连接的驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.30</version></dependency><!-- Spring-test配合junit使用 --><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version><scope>test</scope></dependency><!-- SpirngMVC支持文件上传的工具包 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.3</version></dependency><!--log4j2支持集成日志框架--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.2</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.2</version></dependency></dependencies><build><finalName>chapter-6-springmvc-mybatis1</finalName><pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) --><plugins><plugin><artifactId>maven-clean-plugin</artifactId><version>3.1.0</version></plugin><!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging --><plugin><artifactId>maven-resources-plugin</artifactId><version>3.0.2</version></plugin><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.8.0</version></plugin><plugin><artifactId>maven-surefire-plugin</artifactId><version>2.22.1</version></plugin><plugin><artifactId>maven-war-plugin</artifactId><version>3.2.2</version></plugin><plugin><artifactId>maven-install-plugin</artifactId><version>2.5.2</version></plugin><plugin><artifactId>maven-deploy-plugin</artifactId><version>2.8.2</version></plugin></plugins></pluginManagement></build>
</project>
2.1、常规整合
2.1.1、项目的结构

2.1.2、applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd"><!--1 引入属性文件,在配置中占位使用 --><context:property-placeholder location="classpath*:application.properties"/><!--2 配置C3P0数据源 --><bean id="datasource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"><!--驱动类名 --><property name="driverClass" value="${datesource.driverClassName}"/><!-- url --><property name="jdbcUrl" value="${datesource.url}"/><!-- 用户名 --><property name="user" value="${datesource.username}"/><!-- 密码 --><property name="password" value="${datesource.password}"/><!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数  --><property name="acquireIncrement" value="5"></property><!-- 初始连接池大小 --><property name="initialPoolSize" value="10"></property><!-- 连接池中连接最小个数 --><property name="minPoolSize" value="5"></property><!-- 连接池中连接最大个数 --><property name="maxPoolSize" value="20"></property></bean><!--3 会话工厂bean sqlSessionFactoryBean --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><!-- 数据源 --><property name="dataSource" ref="datasource"></property><!-- 别名 --><property name="typeAliasesPackage" value="com.leo.model"></property><!-- sql映射文件路径 --><property name="mapperLocations" value="classpath*:mapper/*Mapper.xml"></property></bean><!--4 自动扫描对象关系映射 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property><!-- 指定要自动扫描接口的基础包,实现接口 --><property name="basePackage" value="com.leo.mapper"></property></bean><!--5 声明式事务管理 --><!--定义事物管理器,由spring管理事务 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="datasource"></property></bean><!--支持注解驱动的事务管理,指定事务管理器 --><tx:annotation-driven transaction-manager="transactionManager"/><!--6 容器自动扫描IOC组件  --><context:component-scan base-package="com.leo"></context:component-scan><!--7 aspectj支持自动代理实现AOP功能 --><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
</beans>
2.1.3、UserInfoMapper接口的定义
public interface UserInfoMapper {/*** 增加用户信息* @param userInfo*/void insertUserInfo(UserInfo userInfo);/*** 删除用户信息* @param id*/void deleteUserInfo(Integer id);/*** 修改用户信息* @param newUserInfo*/void updateUserInfo(UserInfo newUserInfo);/*** 查询用户信息* @return*/List<UserInfo> getUserInfoList();
}
2.1.4、UserMapper.xml配置
<?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="com.leo.mapper.UserInfoMapper"><sql id="BaseSql">ID id, NAME name, GENDER gender,AGE age,REMARKS remarks</sql><!-- 增加 --><insert id="insertUserInfo" parameterType="com.leo.model.UserInfo">INSERT INTO USER_INFO(NAME,GENDER,AGE,REMARKS) VALUES(#{name},#{gender},#{age},#{remarks})</insert><!-- 删除 --><delete id="deleteUserInfo" parameterType="integer">DELETE FROM USER_INFO WHERE ID=#{ID}</delete><!-- 修改 --><update id="updateUserInfo" parameterType="com.leo.model.UserInfo">UPDATE USER_INFO<if test="name!=null">SET NAME = #{name},</if><if test="gender!=null">SET GENDER = #{gender},</if><if test="age!=null">SET AGE = #{age},</if><if test="remarks!=null">SET REMARKS = #{remarks},</if>WHERE ID=#{ID}</update><select id="getUserInfoList" resultType="com.leo.model.UserInfo">SELECT<include refid="BaseSql"/>FROM USER_INFO WHERE 1=1</select></mapper>
2.1.5、UserService定义和实现
public interface UserInfoService {/*** 增加用户信息* @param userInfo*/void insertUserInfo(UserInfo userInfo);/*** 删除用户信息* @param id*/void deleteUserInfo(Integer id);/*** 修改用户信息* @param newUserInfo*/void updateUserInfo(UserInfo newUserInfo);/*** 查询用户信息* @return*/List<UserInfo> getUserInfoList();
}

实现层

@Service
public class UserInfoServiceImpl implements UserInfoService {@ResourceUserInfoMapper userInfoMapper;@Overridepublic void insertUserInfo(UserInfo userInfo) {userInfoMapper.insertUserInfo(userInfo);}@Overridepublic void deleteUserInfo(Integer id) {userInfoMapper.deleteUserInfo(id);}@Overridepublic void updateUserInfo(UserInfo newUserInfo) {userInfoMapper.updateUserInfo(newUserInfo);}@Overridepublic List<UserInfo> getUserInfoList() {return userInfoMapper.getUserInfoList();}
}
2.2、使用SqlSessionTemplate整合
2.2.1、项目结构

2.2.2、新增加sqlSessionTemplate配置

在applicationContext.xml中新增

    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory"/></bean>
2.2.3、实现UserInfoMapper接口

这种方式,UserMapper.xml和第一个一样,不在重复赘述了,需要自己通过sqlSessionTemplate去实现数据库操作的增、删、改、查。
UserInfoMapperImpl.java

@Service
public class UserInfoMapperImpl implements UserInfoMapper {@AutowiredSqlSessionTemplate sqlSessionTemplate;@Overridepublic void insertUserInfo(UserInfo userInfo) {sqlSessionTemplate.insert("com.leo.mapper.UserInfoMapper.insertUserInfo", userInfo);}@Overridepublic void deleteUserInfo(Integer id) {sqlSessionTemplate.delete("com.leo.mapper.UserInfoMapper.deleteUserInfo", id);}@Overridepublic void updateUserInfo(UserInfo newUserInfo) {sqlSessionTemplate.update("com.leo.mapper.UserInfoMapper.updateUserInfo", newUserInfo);}@Overridepublic List<UserInfo> getUserInfoList() {return sqlSessionTemplate.selectList("com.leo.mapper.UserInfoMapper.getUserInfoList");}
}
2.3、使用SqlSessionDaoSupport整合
2.3.1、项目结构

2.3.2、新增BaseMapper配置

这块是定义一个父类,这个父类继承SqlSessionDaoSupport,然后覆盖这个父类的etSqlSessionFactory将我们的sqlSessionFactory注入进来,这样我们的子类只要继承这个父类就自动把sqlSessionFactory注进来了。

public class BaseMapperImpl extends SqlSessionDaoSupport{//初始化注入sqlSessionFactoryBaseMapperImpl(SqlSessionFactory sqlSessionFactory){super.setSqlSessionFactory(sqlSessionFactory);}
}

然后在applicationContext.xml中增加配置

    <!-- 定义一个父类,并且将sqlSessionFactory注入,子类继承这个父类--><bean id="baseMapper" class="com.leo.mapper.impl.BaseMapperImpl" lazy-init="false"><constructor-arg index="0" ref="sqlSessionFactory"/></bean>
2.3.3、实现UserInfoMapper接口

继承我们的BaseMapperImpl,并实现UserInfoMapper

@Service
public class UserInfoMapperImpl extends BaseMapperImpl implements UserInfoMapper {UserInfoMapperImpl(SqlSessionFactory sqlSessionFactory) {super(sqlSessionFactory);}@Overridepublic void insertUserInfo(UserInfo userInfo) {this.getSqlSession().insert("com.leo.mapper.UserInfoMapper.insertUserInfo", userInfo);}@Overridepublic void deleteUserInfo(Integer id) {this.getSqlSession().delete("com.leo.mapper.UserInfoMapper.deleteUserInfo", id);}@Overridepublic void updateUserInfo(UserInfo newUserInfo) {this.getSqlSession().update("com.leo.mapper.UserInfoMapper.updateUserInfo", newUserInfo);}@Overridepublic List<UserInfo> getUserInfoList() {return this.getSqlSession().selectList("com.leo.mapper.UserInfoMapper.getUserInfoList");}
}

如果不使用这种方式,那么我们的每一个Mapper接口的实现类写到配置文件中然后将sqlSessionFactory注入。一个Mapper就要写一个,多个的话需要配置很多

    <bean id="userInfoMapper" class="com.leo.mapper.impl.UserInfoMapperImpl"><property name="sqlSessionFactory" ref="sqlSessionFactory"/></bean>

相应的实现类UserInfoMapperImpl,其他代码跟上面一样,所以省略了。

@Service
public class UserInfoMapperImpl extends SqlSessionDaoSupport implements UserInfoMapper {
2.4、使用org.apache.ibatis.annotations提供注解方式整合
2.4.1、项目结构

结构图中,少了Mapper的实现类,也少了Mapper.xml文件,看起来很简洁

2.4.2、关键配置

配置文件的org.mybatis.spring.mapper.MapperScannerConfigurer不能少,注意要扫描的Mapper接口的包名basePackage,不需要配置Mapper.xml路径了,通过配置实现不需要了。

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!--指定会话工厂,如果当前上下文中只定义了一个则该属性可省去 --><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/><!-- 指定要自动扫描接口的基础包,实现接口 --><property name="basePackage" value="com.leo.mapper"/></bean>
2.4.3、UserInfoMapper的定义

UserInfoMapper.java定义如下:

public interface UserInfoMapper {/*** 增加用户信息** @param userInfo*/@Insert("INSERT INTO USER_INFO(NAME,GENDER,AGE,REMARKS) VALUES(#{name},#{gender},#{age},#{remarks})")void insertUserInfo(UserInfo userInfo);/*** 删除用户信息** @param id*/@Delete("DELETE FROM USER_INFO WHERE ID=#{ID}")void deleteUserInfo(Integer id);/*** 修改用户信息** @param newUserInfo*/@Update("UPDATE USER_INFO SET NAME = #{name},GENDER = #{gender},AGE = #{age},REMARKS = #{remarks}")void updateUserInfo(UserInfo newUserInfo);/*** 查询用户信息** @return*/@Select("SELECT ID id, NAME name, GENDER gender,AGE age,REMARKS remarks FROM USER_INFO WHERE 1=1")List<UserInfo> getUserInfoList();
}

通过org.apache.ibatis.annotations提供给我们的注解,加上sql语句就可以实现以前在Mapper.xml配置中实现的功能。

3、总结

  1. 第一种整合方式比较常见也比较常用
  2. 第二第三种整合方式比较灵活,也可以结合第一种方式使用
  3. 第四种方式配置比较少,但是工作中实际上是不常见的,因为xml文件更加清晰,并且修改起来比修改代码更加方便。

SpringMVC学习(六)——Spring四种方式整合MyBatis相关推荐

  1. Spring 四种方式教你异步接口返回结果

    富士山终究留不住欲落的樱花 

  2. spring学习笔记(一)创建对象的四种方式

    spring学习笔记(一)创建对象的四种方式 一.简介 ​ Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架. ​ 所谓IoC就是Iversion of Control,控制反 ...

  3. java配置文件实现方式_java相关:详解Spring加载Properties配置文件的四种方式

    java相关:详解Spring加载Properties配置文件的四种方式 发布于 2020-4-29| 复制链接 摘记: 一.通过 context:property-placeholder 标签实现配 ...

  4. 【Spring】SpringMVC 作用域传值的 4 种方式

    一.四大作用域复习 2.1 page 2.1.1 在当前页面不会重新实例化. 2.2 request 2.2.1 在一次请求中同一个对象,下次请求重新实例化一个request 对象. 2.3 sess ...

  5. jdbc Template 介绍和 spring 链接数据源的四种方式

    为什么具体讲template介绍和spring jdbc链接数据源的几种方式放在一起介绍,在于你在使用template的时候,具体配置数据源,或者在链接配置数据源的时候要是使用template,就在在 ...

  6. spring四种依赖注入方式

    平常的java开发中,程序员在某个类中需要依赖其它类的方法,通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理. spring提出了依赖注入的思想,即依赖不由程序 ...

  7. spring加载ApplicationContext.xml的四种方式

    spring加载ApplicationContext.xml的四种方式 spring 中加载xml配置文件的方式,好像有4种, xml是最常见的spring 应用系统配置源.Spring中的几种容器都 ...

  8. 用spring管理和实例化对象的四种方式

    用spring管理和实例化对象的四种方式 方式一:无参构造函数(最常用) 对象是spring创建,创建的对象还要交给spring容器管理 bean:豆子 id:在spring容器中Hello对象的名, ...

  9. java类加入到spring容器_普通java类加入spring容器的四种方式

    今天在自己开发的工具类中使用了spring注入的方式调用了其他类,但是发生的报错,在整理了后今天小结一下. 首先简单介绍下spring容器,spring容器是整个spring框架的核心,通常我们说的s ...

最新文章

  1. C++ 共用体union 的使用
  2. python运行mcmc为何老出错_python – 使用pyMCMC / pyMC对数据/观察结果设置非线性函数...
  3. 同域下iframe操作时,js访问document出现拒绝访问的问题原因
  4. 合同相似可逆等价矩阵的关系及性质_线性代数预习自学笔记-11:等价性与相似性...
  5. Netty核心组件总览
  6. Exchange Server 2016 独立部署/共存部署 (一)—— 前期准备
  7. WCF框架基础(一)
  8. xp大容量u盘补丁_大容量硬盘补丁
  9. JSP标准标签购物车项目
  10. django book学习笔记
  11. Racket编程指南——17 创造语言
  12. 阿朱:研发管理者必读文章
  13. PLC滤波算法之卡尔曼滤波(kalman Filter)代码+测试
  14. samba报错:smbd dead but pid file exists
  15. 阿里云服务器遭到攻击怎么办?
  16. 浅谈sklearn中DBSCAN的欧式距离(Euclidean Distance)的计算
  17. C++周末训练题-机器人迷宫(BFS)
  18. Coursera机器学习+deeplearning.ai+斯坦福CS231n
  19. 贪心——Greedy
  20. 文章伪原创-文章伪原创工具

热门文章

  1. 下巴痤疮的治疗方法有哪些?
  2. SAP 货币转换中的转换因子
  3. SAP固定资产的几个关键日期
  4. 卡萨帝:用发明去超越历史!15年走完百年路
  5. 金融行业创新突围,华为如何趟过产业数字化深水区?
  6. 操作系统使用户和计算机的接口 对吗,计算机操作系统教程--核心与设计原理习题10答案...
  7. php重定向和静态化,PHP实现URL静态化
  8. python降级pip_1.2 pip降级selenium3.0
  9. vue怎么截取时间年月_Vue + Element 获取标准时间、时间戳进行转换与操作(年月日)...
  10. js根据月数计算有效日期_你真的看懂产品生产日期了么