Spring:Spring 整合 MyBatis 的具体过程

news2025/1/12 10:23:37

文章目录

  • Spring:Day 04
  • 整合 MyBatis
  • 一、配置环境
    • 1. 导入依赖
    • 2. 准备一个数据库
  • 二、用 Spring 整合 MyBatis
    • 1. 编写通用配置文件
    • 2. 编写实现类
    • 3. 编写 Spring 配置文件
    • 4. 测试
    • 5. 分析总结
  • 三、拓展
    • 1. 实现
    • 2. 总结
  • 四、事务
    • 1. 概述
    • 2. 没有事务时
    • 3. 声明式事务
    • 4. 总结
  • 注意:

Spring:Day 04

整合 MyBatis

MyBatis 使用的代码整理:点此进入。

MyBatis-Spring 官方文档:点此进入。

一、配置环境

1. 导入依赖

需要导入的依赖如下

<!-- mysql 数据库驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

<!-- spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.18</version>
</dependency>

<!-- aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.6</version>
</dependency>

<!-- spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.23</version>
</dependency>

<!-- mybatis-spring -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.6</version>
</dependency>

<!-- junit -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

<!-- lombok -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.24</version>
</dependency>

2. 准备一个数据库


二、用 Spring 整合 MyBatis

1. 编写通用配置文件

引入外部配置文件

需要注册的 bean

  • dataSource 对象:DriverManagerDataSource 类创建;
  • sqlSessionFactory 对象:SqlSessionFactoryBean 类创建;
  • sqlSessionTemplate 对象:SqlSessionTemplate 类创建。
<!-- 外部配置文件 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:db.properties"/>

<!-- 注册 dataSource -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${drive}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
</bean>

<!-- 注册 sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <!-- 绑定 MyBatis -->
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
    <property name="mapperLocations" value="classpath:com/Sun3285/dao/*.xml"/>
</bean>

<!-- 注册 sqlSessionTemplate -->
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
    <!-- 只能用构造器注入,因为类没有 set 方法 -->
    <constructor-arg index="0" ref="sqlSessionFactory"/>
</bean>

2. 编写实现类

实现类实现接口,重写了业务方法,有两个作用

  • 创建 mapper 对象;
  • 通过 mapper 对象执行方法。

通过实现类中方法的返回值可以看到,是 mapper 又执行了方法,可以理解为这个实现类相当于加了一层,把之前测试类的代码封装了。

在原来,我们的所有操作,都使用 SqlSession 来执行;在现在,用 sqlSessionTemplate 来代替。SqlSessionTemplateMyBatis-Spring 的核心。作为 SqlSession 的一个实现,这意味着可以使用它无缝代替代码中已经在使用的 SqlSessionSqlSessionTemplate线程安全的,可以被多个 DAO 或映射器所共享使用。

3. 编写 Spring 配置文件

导入通用配置文件、注册实现类对象到容器中

4. 测试

出现错误一

错误一的改正方法:修改外部配置文件中的键,改为 jdbc.xxx

出现错误二

错误二的改正方法:在 Spring 通用配置文件中注册 mapper 时,将通配符 * 修改为具体的 xml 文件,或者将 classpath 改为 classpath*,这样路径中再使用通配符就不报错了。

改正错误后,最终运行成功

5. 分析总结

用 Spring 整合 MyBatis 过程中,用 Spring 配置文件注册 bean 代替了原先所有的创建对象,也可以通过绑定 MyBatis 来代替 MyBatis 核心配置文件中的各种配置,但是一般会在 MyBatis 配置文件中留下设置和别名管理

  • Spring 配置文件注册 dataSource 管理数据源,代替了原先:MyBatis 核心配置文件中配置环境管理数据源

  • 绑定 MyBatis 后,可以在 Spring 配置文件中进行各种配置,代替了原先:MyBatis 核心配置文件中的各种配置,如注册 mapper

  • 注册 sqlSessionFactory 对象,代替了原先:在工具类中创建 sqlSessionFactory 对象

  • 注册 sqlSessionTemplate 对象,代替了原先:在测试类中创建 sqlSession 对象

  • 注册自定义实现类对象,该实现类中封装了方法,代替了原先:在测试类中创建 mapper 对象,用 mapper 对象执行方法


三、拓展

在编写实现类时,可以继承 SqlSessionDaoSupport 类。

作用:可以用来提供 SqlSession:通过调用 getSqlSession() 方法得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法。

1. 实现

编写实现类

注册 bean

测试

2. 总结

  1. 继承 SqlSessionDaoSupport 类后,可以调用 getSqlSession() 方法得到一个 SqlSessionTemplate
  2. 进行的改变有:
    • 实现类中,不需要定义 SqlSession 属性;
    • 注册实现类时,属性由 SqlSession 变为 sqlSessionFactory
    • 通用配置文件中,不需要注册 sqlSessionTemplate 对象。

四、事务

1. 概述

  1. 事务在项目的开发中十分重要,涉及到数据的一致性和完整性问题;

  2. MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理,而不是给 MyBatis 创建一个新的专用事务管理器;

  3. 在事务处理期间,一个单独的 SqlSession 对象将会被创建和使用。当事务完成时,这个 session 会以合适的方式提交或回滚

  4. 事务配置好了以后,MyBatis-Spring 将会透明地管理事务,这样在 DAO 类中就不需要额外的代码了。

  5. Spring 中事务管理的方式有两种:

    • 推荐声明式事务:是 AOP 的一个应用,代码是横切入进去的,不影响原有代码
    • 编程式事务:需要在代码中进行事务的管理,会改变原有代码

2. 没有事务时

没有事务时,如下图所示,如果想让方法中的代码出错时,进行回滚,则需要进行事务,接下来用声明式事务来实现。

结果

3. 声明式事务

通用配置文件中实现声明式事务的步骤

  • 头文件中,除了 aop、context 约束外,再导入 tx 约束;
  • 配置声明式事务
  • 结合 AOP 实现事务的织入
    • 配置事务通知(也就是切面,Spring 提供的);
    • 配置事务切入(设置切入点和执行环绕增加)。

这样通过设置后,在切入点处都会存在事务,测试

改正错误,执行成功

4. 总结

  1. 配置声明式事务时注意
    • 传入的 DataSource 可以是任何能够与 Spring 兼容的 JDBC DataSource,包括连接池和通过 JNDI 查找获得的 DataSource
    • 为事务管理器指定的 DataSource 必须和用来创建 SqlSessionFactoryBean 的是同一个数据源,否则事务管理器无法工作。
  2. 配置事务通知时注意
    • 要指定给哪些方法配置事务:其中 name 必须与接口中的方法名一致,可以用通配符 * 表示全部方法
    • 要指定事务的传播特性 propagation默认为 REQUIRED
  3. 配置事务切入包括设置切入点执行环绕增加
  4. MyBatis 管理事务通过核心配置文件中的事务管理器,Spring 管理事务通过以上配置。


注意:

  1. MyBatis-Spring 官方文档:http://mybatis.org/spring/zh/index.html
  2. 使用数据库之前先在 IDEA 中连接上数据库。
  3. 注册 bean 就是在创建对象getBean 就是从容器中获取对象
  4. 真正的实现类是编写 sql 语句的 UserMapper.xml 文件,而自己写的实现类相当于代替了原来的测试代码,最后还是 mapper 执行方法,执行的是 UserMapper.xml 文件的方法。

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

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

相关文章

“Shell“SNAT,DNAT

文章目录 一.SNAT1.1 SNAT原理1.2 SNAT的应用环境1.3 SNAT工作原理1.4 进行SNAT转换后1.5 配置SNAT策略1.6SNAT实验 二.DNAT2.1 DNAT工作原理2.2 配置DNAT策略2.3 DNAT实验 一.SNAT 1.1 SNAT原理 SNAT原理&#xff1a;修改数据包的源地址。SNAT 应用环境&#xff1a;局域网主…

基础学习——关于卷积层的记录

文章目录 前言一、功能层1、池化层2、nn.BatchNorm2d()3、全连接层4、softmax层 二、卷积层1、普通卷积2、空洞卷积3、多尺度卷积4、分组卷积5、深度可分离卷积6、形变卷积 前言 老是忘有些模块的具体作用&#xff0c;记录一下。 一、功能层 1、池化层 池化层夹在连续的卷积…

总结最全面的TCP、UDP、Socket、HTTP网络编程面试题

先看一天面试的经验&#xff1a; 第一场&#xff1a; 面试官&#xff1a;你说一下TCP的三次握手 我&#xff1a;第一次Client将SYN置1......、第二次Server收........、 第三次........ 面试官&#xff1a;很难背吧&#xff1f; 我&#xff1a;......是啊&#xff0c;很难&…

harbor安装

文章目录 先决条件硬件软件网络端口 安装docker签发证书生成证书颁发机构证书 生成服务器证书向 Harbor 和 Docker 提供证书 下载harbor安装包containerd 配置私有仓库&#xff08;二选一&#xff09;分发证书(如上文只是路径变了)配置登录加密登录打标签并推送与拉取 docker 配…

【EasyPoi实战系列】Spring Boot使用EasyPoi动态控制导出的列 - 第471篇

历史文章&#xff08;文章累计460&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 用…

机器学习神经网络——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

系列文章目录 机器学习神经网络——Adaboost分离器算法 机器学习之SVM分类器介绍——核函数、SVM分类器的使用 机器学习的一些常见算法介绍【线性回归&#xff0c;岭回归&#xff0c;套索回归&#xff0c;弹性网络】 文章目录 系列文章目录 前言 一、GBDT(Gradient Boos…

计算机网络:物理层

物理层 1. 通信基础1.1 基本概念1.1.1 通信模型1.1.2 通信方式1.1.3 数据传输方式1.1.4 数据同步的传输/通信方式1.1.5 码元1.1.6 速率1.1.7 带宽 1.2 奈氏准则|香农定理1.2.1 奈氏准则1.2.2 香农定理 1.3 编码、调制1.3.1 数字数据编码为数字信号1.3.2 数字数据调制为模拟信号…

Google Colab的使用方法

什么是 Google Colab&#xff1f; Colaboratory是一个 Google 研究项目&#xff0c;旨在帮助传播机器学习培训和研究成果。是一个Jupyter 笔记本环境&#xff0c;不需要进行任何设置就可以使用&#xff0c;并且完全在云端运行。Colaboratory笔记本存储在 Google 云端硬盘中&…

“超级品牌”已成型!解码名创优品的进阶之路

随着经济复苏&#xff0c;消费者心智和市场趋势逐渐发生变化&#xff0c;零售市场竞争步入深水区&#xff0c;为品牌带来了更大考验。但反过来&#xff0c;也令更多潜力股加速崛起。 北京时间5月16日&#xff0c;名创优品集团&#xff08;NYSE:MNSO;HKEX: 9896&#xff09;公布…

ResourceManager启动报错:Queue configuration missing child queue names for root【已解决】

Queue configuration missing child queue names for root 现象报错分析ResourceManager输出日志解决 现象 start-all.sh后缺少RM的进程 报错 查看启动日志输出文件 2023-05-23 19:28:19,863 INFO [main] resourcemanager.RMNMInfo (RMNMInfo.java:<init>(63)) - Re…

【Linux】进程控制 — 进程终止 + 进程等待

文章目录 &#x1f4d6; 前言1. 再次理解fork()函数1.1 fork()之后子进程代码和数据问题&#xff1a;1.2 fork()之后操作系统做了什么&#xff1a;1.3 为什么要写时拷贝&#xff1f;&#xff1f; 2. 进程终止2.1 main函数的返回值&#xff1a;2.2 exit() 和 _exit()&#xff1a…

以京东首页为例,设计用例框架。

以下是一个可能的京东首页的用例框架设计&#xff1a; 1. 区域划分&#xff1a; a. 顶部导航栏&#xff1a;包括京东的Logo、搜索框、登录/注册入口、购物车等。 b. 主要内容区域&#xff1a;展示各类商品、促销活动、广告位等。 c. 商品分类导航&#xff1a;提供各类…

复习之Linux下的文件管理

1.文件的建立 #touch westos-------建立空文件/修改文件的建立时间 &#xff08;1&#xff09;建立空文件 &#xff08;2&#xff09;修改文件的建立时间 ----右击点属性显示文件的建立时间 ---- 再次输入touch westos,westos文件的建立时间更新&#xff01; -----westos -t…

使用 Kafka Assistant,为您的开发加速

简要介绍 快速查看所有 Kafka 集群&#xff0c;包括Brokers、Topics和Consumers支持各种认证模式&#xff1a;PLAINTEXT、SASL_PLAINTEXT、SSL、SASL_SSL对Kafka集群进行健康检查查看分区中的消息内容并添加新消息查看消费者订阅了哪些主题&#xff0c;以及分区被分配给了哪些…

金融、医疗、教育等各场景下小程序SDK的应用

近年来&#xff0c;随着数字经济的飞速发展和移动终端的迅速普及&#xff0c;移动互联网全面覆盖&#xff0c;各类应用服务层出不穷&#xff0c;涵盖了方方面面的生活、工作和学习。 而小程序作为一种轻量级的应用形态&#xff0c;越来越受到开发者和用户的欢迎。为了满足不同行…

DataNode启动报错Failed to add storage directory [DISK]file:【已解决】

Failed to add storage directory [DISK]file hadoop启动后缺少DataNode进程报错out文件报错log文件解决 hadoop启动后缺少DataNode进程 jps查看hadoop进程缺少DataNode的进程 报错out文件 查看DataNode的out日志 DataNode启动报错 ulimit -a for user root core file size…

前k个高频单词

&#x1f495;**不要害怕前方的未知和困难&#xff0c;因为它们都是你成长的机会。不要过于在意别人的眼光和评价&#xff0c;因为唯有你的内心才知道自己真正的价值。珍惜当下&#xff0c;享受生活的点滴&#xff0c;让自己变得更加坚强、自信、成熟。**&#x1f495; &#x…

LG Gram 14 (14Z90N) 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板LG Gram 14 (14Z90N) 处理器Intel Core i5-1035G4已驱动 内存M471A1G44AB0-CWE * 2已驱动 硬盘MTFDHBA512TDV-1AZ1AABYY已驱动 显卡Intel Iris …

Axel – 用于 Linux 的命令行文件下载加速器

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果您是那种喜欢下载和试用多个 Linux 发行版的人&#xff0c;我们相信您会张开双臂欢迎一个说到做到的下载加速器——一个按照其描述进行操作的下载加速器。 在本指南[1]中&#xff0c;我们将向您介绍 Axel&#xff0c;这是一…

由浅入深Dubbo核心源码剖析高可用集群

目录 1 服务集群的概述1.1 概述1.2 调用过程1.3 组件介绍 2 集群容错机制2.1 内置集群容错策略2.2 集群容错调优2.3 源码分析 3 集群负载均衡策略3.1 负载均衡的主要作用3.2 内置的负载均衡策略3.3 负载均衡总结 4 服务治理4.1 服务治理的概述4.2 执行过程4.3 服务治理功能 1 服…