Spring事务Spring整合MyBatis

news2024/11/25 0:21:01

Spring整合MyBatis

在整合之前需要保证mybatis、springframework、mybatis-spring、spring-jdbc的包都已经导入

并且要根据官网提示保证mybatis、springframework、mybatis-spring版本相对应,否则会产生冲突报错
在这里插入图片描述
maven依赖如下:

<!--  Spring Web MVC  -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.23</version>
</dependency>

<!--  MyBatis 依赖  -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.5</version>
</dependency>

<!--  spring操作数据库  -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.3.23</version>
</dependency>

<!--  mybatis整合spring  -->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.6</version>
</dependency>

整合方式一

利用spring所内置的数据源覆盖mybatis的environment环境下的数据源,并且在applicationContext.xml文件中对sqlSession、sqlSessionFactory进行配置。mybatis中的sqlSession转换为Spring中的sqlSessionTemplate。可以在mybatis中仅留下别名配置和设置(日志实现,驼峰命名映射)

我们可以在开发中将所有的bean映射到一个Spring的xml配置文件中,再利用import标签将其引入到applicationContext文件,最终在编码时仍然通过解析applicationContext文件来获取所有配置和bean

applicationContext

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans                https://www.springframework.org/schema/beans/spring-beans.xsd">
  <import resource="classpath:Spring-dao.xml"/>
  <bean id="userMapperImpl" class="com.yuqu.dao.UserMapperImpl">
    <property name="sqlSession" ref="sqlSession"/>
  </bean>
</beans>

Spring-dao.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:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd                    http://www.springframework.org/schema/aop                  https://www.springframework.org/schema/aop/spring-aop.xsd">
  <!--  配置数据源  使用spring内置的数据源替换掉mybatis的datasource  -->
  <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url"value="jdbc:mysql://localhost:3306/sqltest?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC"/>
    <property name="username" value="root"/>
    <property name="password" value="123456"/>
  </bean>
  <!--  配置sqlSessionFactory  -->
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="datasource"/>
    <!--   绑定mybatis配置文件     -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <!--     映射器  注册mapper.xml文件   -->
    <property name="mapperLocations" value="classpath:com/yuqu/dao/*.xml"/>
  </bean>
  <!--  配置sqlsession  -->
  <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <!--      只能选择构造器注入sqlSessionFactory  没有SqlSessionTemplate提供set方法  -->
    <constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory"/>
  </bean>
</beans>

针对datasource的配置,对于driverClassName、url、username、password都是内置好的,这个字段名不可更改不可自定义

配置sqlSessionFactory,class属性使用spring提供的org.mybatis.spring.SqlSessionFactoryBean,然后继续绑定mybatis配置文件

最后再将spring提供的sqlSessionTemplate映射为bean,在使用时可以直接通过getBean来获取SqlSession,根据官网提示,sqlSessionTemplate可以完全等同于sqlSession,并且它是线程安全的

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!--  mybatis中留下设置  -->
  <settings>
    <!-- 日志实现 -->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
    <!-- 驼峰映射 -->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>
  <!--  别名管理  -->
  <typeAliases>
    <package name="com.yuqu.pojo"/>
  </typeAliases>
</configuration>

总结方式一步骤:

  1. 配置数据源
  2. 配置sqlSessionFactory
    1. 映射数据源到此
    2. 绑定mybatis配置文件
    3. 映射器 注册mapper.xml文件
  3. 配置sqlSessionTemplate
  4. 给接口添加实现类

上述程序中的Spring-dao.xml可以直接给定,每次新建项目都可以这样配置,只需要改动映射器包名路径,数据库名即可

整合方式二

使用SqlSessionDaoSupport,创建接口实现类并继承SqlSessionDaoSupport。使用该类,可以直接调用getSqlSession方法可以得到一个SqlSessionTemplate,再去执行sql语句。

该接口实现类也必须在applicationContext.xml文件中进行注册,注册的同时需要添加属性SqlSessionFactory或者SqlSessionTemplate,如果添加了SqlSessionTemplate则SqlSessionFactory将会被忽略

如下所示:

// SqlSessionDaoSupport继承类
public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper{
  public List<User> getUserList() {
   return getSqlSession().getMapper(UserMapper.class).getUserList();
  }
}
// 将该类映射到spring容器中
<bean id="UserMapperImpl2" class="com.yuqu.dao.UserMapperImpl2">
  <property name="sqlSessionTemplate" ref="sqlSession"/>
  <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
  </bean>

如上述映射bean所示,sqlSessionTemplate如果配置了就不需要再配置sqlSessionFactory

测试

@Test
public void test02(){
  ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  UserMapper impl2 = context.getBean("UserMapperImpl2", UserMapper.class);
  List<User> userList = impl2.getUserList();
  for (User user : userList) {
    System.out.println(user);
  }
}

Spring事务

mybatis-spring借助了spring的datasourceTransactionManager来实现事务管理,也就是说通过对spring的配置就可以实现自动管理事务,不再需要手动管理

首先要开启spring的事务管理功能,这包括头文件、以及DataSourceTransactionManager对象。配置好事务后,通过aop进行织入,我们可以选择哪些方法执行时开启事务哪些不需要开启,*通配符表示全部开启

<!--  开启事务管理功能  -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  <constructor-arg ref="datasource" />
</bean>
<!--  结合aop织入事务  -->
<!--  需要导入支持事务的头文件  <tx:... > -->
<!--  配置事务通知advice  -->
<tx:advice id="adviceTransaction" transaction-manager="transactionManager">
  <!--     给那些方法配置事务
    事务传播特性 propagation 常用下面两种:
       REQUIRED表示  支持当前事务,如果当前没有事务,就以非事务方式执行。
       NESTED:支持当前事务,如果当前事务存在,则执行一个嵌套事务,如果当前没有事务,就新建一个事务。
-->
<tx:attributes>
    <!-- 
<tx:method name="getUserList" propagation="REQUIRED"/>
<tx:method name="deleteUser" propagation="REQUIRED"/><tx:method name="insertUser" propagation="REQUIRED"/>
-->
    <tx:method name="*" propagation="REQUIRED"/>
    <!--            <tx:method name="*"/>-->
  </tx:attributes>
</tx:advice>

<!--  配置事务切入  pointcut  -->
<aop:config>
  <aop:pointcut id="pointcut" expression="execution(* com.yuqu.dao.*.*(..))"/>
  <aop:advisor advice-ref="adviceTransaction" pointcut-ref="pointcut"/>
</aop:config>

在此基础上不再需要对源码进行任何的改动就可以开启事务管理

总结一下这段时间对mybatis和spring的自学:

​ 最近自学的强度比较之前算是比较大的,自习之余几乎都是在不断的看别人的博客、一些机制的原理总是模模糊糊。就拿mybatis来说,学完之后只记得它优化了jdbc开发,不过它的作用实际就是这样的。只不过在使用mybatis的过程中很多常用的标签、配置不太熟悉,前天练了一下午的mybatis,之前觉得有点难以理解的resultMap的轮廓逐渐清晰,使用mybatis可以比较熟练的进行xml配置、sql编写、注解和xml混合使用。今天简单跟spring进行了整合,大致的运行原理是说的通的,但是概念不够熟悉,对spring还需要再沉淀一下,比如自动装配,虽然我觉得不难,但是到用的时候总会把大量spring提供的注解搞混或者忘记。但是也有收获,知道IOC和AOP是什么,面试问到可以说出一些自己的理解。

准备springMVC吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SAS应用入门学习笔记6

SQL (SAS): Features&#xff1a; 1&#xff09;不需要在每个query中重复调用每个SQL&#xff1b; 2&#xff09;每个statement都是独立去完成的&#xff1b; 3&#xff09;我们是没有proc print和proc sort语句的&#xff1b;&#xff08;order by&#xff09; key synta…

vue3的shallowReactive和shallowRef,readonly和shallowReadonly

shallowReactive&#xff1a;只处理对象最外层属性的响应式&#xff08;浅响应式&#xff09; <template><span>姓名&#xff1a;{{name}}</span><span>年龄&#xff1a;{{age}}</span><span>职业&#xff1a;{{salary.job.num}}</spa…

JAVA SE复习(第5章 面向对象(上))

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用5.1 面向对象编程5.1.2 类和对象1、什么是类类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。属性&#xff1a;就是该事物的状态信息。行为&#xff1a;就是在你这个程序中&am…

springboot集成kafka

选择特定版本spring-kafka官方使用文档 进入官网&#xff1a;https://spring.io/ 选择自己使用版本 点进去后按照 /2.7.0/reference/html/ 路径点进去就能看到想要版本的文档了

C++实现线程池

C实现线程池一、前言二、线程池的接口设计2.1、类封装2.2、线程池的初始化2.3、线程池的启动2.4、线程池的停止2.5、线程的执行函数run()2.6、任务的运行函数2.7、等待所有线程结束三、测试线程池四、源码地址总结一、前言 C实现的线程池&#xff0c;可能涉及以下知识点&#…

JVM - 垃圾回收

目录 垃圾回收基础和根搜索算法 垃圾回收概述 根搜索算法 引用分类 垃圾回收基础(跨代引用、记忆集、写屏障、判断垃圾的步骤、STW) 跨代引用 记忆集(Remembered Set) 写屏障 判断是否垃圾的步骤 GC类型 Stop-The-World 垃圾收集类型 判断类无用的条件 垃圾回收算…

Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程

0. 前言1. Spring对SqlSessionTemplate的管理1.1. SqlSessionTemplate的创建&#xff1a;1.2. MapperProxy中sqlSession的来源&#xff1a;2. SqlSessionInterceptor中的getSqlSession0. 前言 众所周知&#x1f60f;:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executo…

在VMware17 Pro中设置创建虚拟机Ubuntu 20

在VMware17 Pro中设置创建虚拟机Ubuntu 200 前言1 安装Ubuntu 20步骤0 前言 书接上回&#xff0c;安装好了VMware17 Pro之后&#xff0c;就是安装虚拟机了&#xff0c;前提是下好了系统安装包&#xff0c;以Ubuntu 20为例 1 安装Ubuntu 20步骤 首先点击创建新的虚拟机 新建…

利用NAS免费部署动态解析实现内网穿透

‍ 想要从外网访问家中的NAS等设备&#xff0c;一般来说我们需要知道家中路由器的公网IP。 现在固定的公网IP基本上很难免费申请到了&#xff0c;但是一般来说运营商可以免费提供一个动态变化的公网IP&#xff1a;当路由设备重启时&#xff0c;运营商会给你重新分配一个新的I…

PHP加载3D模型【WebGL】

这是另一篇关于如何使用 PHP加载 3D 模型的文章。 在这里&#xff0c;我使用 Laravel 作为后端及其存储。 我在前端使用 Three.Js 库来渲染和显示 3D 模型。 我将向您展示如何上传 3D 模型以及如何从 Laravel 存储加载 3D 模型。 请仔细完成以下步骤。 大家可以在评论区提出任何…

8Manage PPM项目管理系统独特的功能:项目完整性保护

项目有其内在复杂性&#xff08;项目管理的科学部分&#xff09;&#xff0c;这种复杂性可以进行划分和克服。项目也有人为的或偶然的复杂性&#xff08;项目管理的艺术部分&#xff09;&#xff0c;这种复杂性无法进行划分和克服。偶然的高复杂性会影响并使内在复杂性难以管理…

【系统架构设计师】计算机组成与体系结构 ① ( 计算机组成 | CPU | 存储器 | 总线 | IO 外设 | CPU 组成 | 运算器 | 控制器 )

文章目录一、计算机组成与体系结构二、计算机组成结构三、CPU 组成1、运算器2、控制器一、计算机组成与体系结构 计算机组成与体系结构 对应 大学的 计算机组成原理 课程 , 主要分为 : 计算机组成体系结构划分 两大知识板块 ; 在架构师考试时 , 平均分值是 3 分 ; 计算机组成…

三相可控全桥整流与DC Buck变换电路设计仿真问题汇总

目 录 问题 一、开关管没有打开的情况下&#xff0c;DC Buck输出负电压&#xff1f; 二、问题分析 1.输出端存在与母线电压反相的电压&#xff0c;因此可以确定为差模感应电压&#xff0c;如果输出端与母线端产生的是大小相等&#xff0c;方向相同的同相电压&#xff0c;则为共…

大数据框架之Hadoop:HDFS(六)DataNode(面试开发重点)

6.1DataNode工作机制 DataNode工作机制&#xff0c;如下图所示。 1&#xff09;一个数据块在DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c;块数据的校验和&#xff0c;以及时间戳…

ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现

发布者 以小海龟的话题消息为例,编程实现发布者通过/turtle1/cmd_vel 话题向 turtlesim节点发送消息&#xff0c;流程如图 步骤一 创建功能包&#xff08;工作空间为~/catkin_ws/src&#xff09; $ cd ~/catkin_ws/src $ catkin_create_pkg learning_topic roscpp rospy s…

FLStudio水果最新版本V21支持中文语言

FL Studio简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio习惯叫它水果。软件现有版本是FLStudio21&#xff0c;已全面升级支持简体中文语言界面 。FL Studio 能让你的计算机就像是全功能的录音室一样&#xff0c;完成编曲、剪辑、录音、混音等工作&#xff0c;帮助爱好…

2023大厂高频软件测试面试真题(附答案)

一、接口测试面试题&#xff1a;1.接口测试是怎么做的&#xff0c;如何分析数据&#xff1f;接口测试实际跟一般测试不同就是测试用例的设计部分。获取接口规范。设计接口测试功能用例&#xff08;主要从用户角度出发看接口能否实现业务需求&#xff0c;用例设计就是黑盒用例那…

2022财年净新增1159家门店,百胜中国门店高速扩张背后有何阳谋?

中国最大餐饮企业百胜中国控股有限公司&#xff08;下称“百胜中国”&#xff09;&#xff0c;2月8日发布了2022年度第四季度及全年未经审核的财务业绩。 从财报数据来看&#xff0c;这家拥有肯德基、必胜客、黄记煌等诸多餐饮品牌的巨头&#xff0c;已经顺利渡过了疫情笼罩下…

计算机网络(第7版)第五章(物理层)知识点整理

计算机网络 参考书目&#xff1a;《计算机网络&#xff08;第7版&#xff09;》&#xff1a;谢希仁——电子工业出版社 《精通Windows Sockets网络开发--基于Visual C实现》&#xff1a;孙海民——人民邮电出版社 第五章&#xff1a;物理层计算机网络一、基本概念二、传输媒体…

和数集团打造《神念无界:源起山海》,诠释链游领域创新与责任

首先&#xff0c;根据网上资料显示&#xff0c;一部《传奇》&#xff0c;二十年热血依旧。 《传奇》所缔造的成绩&#xff0c;承载的是多少人的青春回忆&#xff0c;《传奇》无疑已经在游戏史上写下了浓墨重彩的一笔。 相比《传奇》及背后的研发运营公司娱美德名声大噪&#x…