mybatis高级特性

文章目录

  • 数据库事务管理
  • 批处理
  • 插件扩展
  • 持久化和ORM
  • 缓存机制

数据库事务管理

通过注解方式: 在需要进行事务管理的方法上添加@Transactional注解,该注解可以用于类或方法上。在配置文件中开启事务管理器,并指定事务管理器的类型和连接池等相关信息。
示例

java
@Transactional
public void updateUserInfo(UserInfo userInfo) {// 执行更新操作// ...
}

通过XML配置方式: 在Mapper XML文件中使用标签来配置事务管理器,以及tx:advice标签配置事务的传播行为和异常处理策略。

xml
<transactions><transactionManager type="JDBC"><dataSource type="POOLED"><!-- 配置数据源 --></dataSource></transactionManager><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/></tx:attributes></tx:advice>
</transactions>

在配置文件中,还需要配置事务管理器和数据源相关的信息。

xml
<environments default="development"><environment id="development"><transactionManager type="JDBC"><dataSource type="POOLED"><!-- 配置数据源 --></dataSource></transactionManager></environment>
</environments>

需要注意的是,事务管理器的类型和数据源的配置需根据具体的数据库和连接池来进行配置。

另外,MyBatis还支持对事务的手动提交和回滚操作,可通过SqlSession实例的commit()和rollback()方法来手动控制事务的提交和回滚

java
SqlSession sqlSession = sqlSessionFactory.openSession();
try {// 执行数据库操作sqlSession.commit();
} catch (Exception e) {sqlSession.rollback();
} finally {sqlSession.close();
}

以上方式配置和管理事务,可以保证MyBatis在执行数据库操作时的数据一致性和事务的可靠性

批处理

批处理是指一次性执行多个数据库操作语句的功能。这在某些场景下可以提高性能。

  • 在MyBatis中,使用SqlSession的insert、update和delete方法来执行批处理。这些方法可以接受一个包含多个参数的集合,每个参数表示一次数据库操作。例如:
java
List<User> userList = new ArrayList<>();
userList.add(new User("user1"));
userList.add(new User("user2"));SqlSession sqlSession = sqlSessionFactory.openSession();
try {sqlSession.insert("insertUser", userList);sqlSession.commit();
} finally {sqlSession.close();
}
  • 在上面的示例中,insertUser是一个Mapper中的插入语句,userList是包含多个User对象的集合,表示多次插入操作。调用insert方法后,MyBatis会将每个User对象作为参数执行一次插入操作。

  • 需要注意的是,为了提高批处理的性能,通常需要将SqlSession的autoCommit属性设置为false,并在执行完批处理后手动调用commit方法提交事务。

  1. MyBatis还提供了一种更高效的方式来执行批处理,即使用批量插入/更新/删除语句。这种方式可以通过在Mapper接口中定义一个返回类型为int的方法,并使用@InsertProvider、@UpdateProvider和@DeleteProvider注解来指定相应的动态SQL提供者。例如:
java
@Mapper
public interface UserMapper {@InsertProvider(type = BatchInsertProvider.class, method = "insert")int batchInsert(List<User> userList);
}public class BatchInsertProvider {public String insert(Map<String, Object> map) {List<User> userList = (List<User>) map.get("list");StringBuilder sb = new StringBuilder();sb.append("INSERT INTO user (username) VALUES ");for (User user : userList) {sb.append("(#{item.username}),");}sb.deleteCharAt(sb.length() - 1);return sb.toString();}
}List<User> userList = new ArrayList<>();
userList.add(new User("user1"));
userList.add(new User("user2"));int result = userMapper.batchInsert(userList);
  1. 上面的示例中,BatchInsertProvider是一个动态SQL提供者,根据传入的参数动态生成批量插入语句。batchInsert方法接受一个包含多个User对象的集合,并返回插入成功的记录数。
    需要注意的是,使用批量插入/更新/删除语句时,对应的Mapper方法的返回类型必须为int,表示插入/更新/删除的记录数。

插件扩展

插件是用于扩展和增强MyBatis框架功能的组件。它可以拦截MyBatis的执行过程,实现一些自定义的逻辑。
常用的MyBatis插件扩展

  1. 拦截器(Interceptor):Interceptor接口,可以在MyBatis执行的各个阶段拦截方法调用,并加入自定义的逻辑。常见的用途包括日志记录、权限控制、结果集处理等。
  2. 类型处理器(Type Handler):类型处理器用于将Java类型与数据库中的数据类型进行转换。可以通过实现TypeHandler接口,自定义类型转换逻辑,以支持自定义的数据类型。
  3. 参数处理器(Parameter Handler):参数处理器用于将Java对象转换为SQL语句的参数。通过实现TypeHandler接口,可以实现自定义的参数转换逻辑。
  4. 数据源(DataSource):MyBatis默认使用的是JDBC连接池来管理数据库连接。通过实现DataSource接口,可以自定义数据源,以实现对其他连接池的支持。

持久化和ORM

  1. 持久化就是程序的数据,在瞬时状态(new)和持久状态(数据库等)之间转化。通过数据库操作进行转化。
    • 瞬态状态指的是对象在没有被持久化到数据库之前的状态。在瞬态状态下,对象的属性可能已经被赋值,但这些改变还没有被保存到数据库中。
    • 持久状态是指对象在数据库中的持久化状态,它提供了方便的数据库访问和操作方式,同时支持缓存以提高查询效率。
  2. ORM.(O=javaBean)(R=关系型数据库)(M=映射)
    • JavaBean是指遵循特定命名约定和规范的Java类,用来封装数据和提供访问这些数据的方法。它是Java语言中一种编程规范。
    • 关系型数据库(Relational Database)是指采用了关系模型的数据库管理系统。关系模型是由埃德加·科德提出的,它将数据组织为表格的形式,表格由行和列组成。关系型数据库通过在不同表格之间建立关系(通过主键和外键),来表示实体之间的联系。
    • 映射是一个广泛应用的概念,在不同的领域中有着不同的含义和作用,但核心的概念都是将一个对象或值关联到另一个对象或值上的过程或规则。
    • 注意:ORM这三方面要保持一致。任意部分的变动都要一起检测。

缓存机制

  1. 一级缓存
    • session级别的缓存。
    • 默认都会有,不需要手动开启。
    • 线程不共享的。
    • 当session关闭或者flush时。session清空。
  2. 二级缓存
    • sessionFactroy级别的缓存。同一个namespace内的select会被缓存。
    • 默认缓存不开启。需要手动开启。
    • 线程共享。
    • 当进行增删改的时候,缓存将被清空。
  3. 二级缓存开启的步骤
    • 在mybatis的主配置文件中,开启缓存
<configuration><settings><setting name="cacheEnable" value="true"/><setting name="lazyLoadingEnabled" value="false"/></settings>
</configuration>
  • 在mapper中的设置缓存
<cacheeviction="FIFO"    // 回收策略flushInterval="60000"  // 缓存刷新的间隔时间size="512"         // 缓存大小readOnly="true" />  // 默认时false,表示其他线程调用都是复制缓存对象。如果为true,线程使用的时原始的缓存对象

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

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

相关文章

Java SpringBoot Vue智能停车系统

基础环境 JDK1.8、Maven、Mysql、IntelliJ IDEA 内置功能 系统管理&#xff1a;角色管理、接口管理、系统菜单、全局配置 账号管理&#xff1a;用户管理、合作单位 系统监控&#xff1a;监控大屏、日志监控 财务管理&#xff1a;订单列表 停车记录&#xff1a;停车记录 车辆管…

Labview选项卡之实现被选择选项卡工作

文章目录 前言一、使用选项卡二、实现被选择选项卡工作1、需求2、分析3、实现①、前面板②、程序框图 三、效果展示四、源码自取 前言 有些时候&#xff0c;我们做界面&#xff0c;需要好多个界面切换。如果是同一个 VI 里界面切换&#xff0c;一般都是选项卡了。切换不同选项…

使用phpstorm开发调试thinkphp

1.环境准备 1.开发工具下载&#xff1a;PhpStorm: PHP IDE and Code Editor from JetBrains 2.PHP下载&#xff1a;PHP: Downloads 3. PHP扩展&#xff1a;PECL :: Package search 4.用与调试的xdebug模块&#xff1a; Xdebug: Downloads xdebug模块&#xff0c;如果是php8以…

23.8.16日总结

原先写的评论是每级评论用缩进来区分&#xff0c;所以最多设置的是九级评论&#xff0c;修改了排版和格式&#xff1a; 还有管理员页面&#xff0c;查看文章时可以进行点赞&#xff0c;收藏的操作&#xff0c;现在进行了修改&#xff0c;将相关操作隐藏。 还有点击查看未发布…

js如何获取字符串大小是几M

js如何获取字符串大小是几M 在JavaScript中&#xff0c;可以使用以下方法来获取字符串的大小&#xff08;以字节为单位&#xff09;&#xff1a; function getStringSizeInBytes(str) {// 使用UTF-8编码计算字符串的字节长度let totalBytes new Blob([str]).size;// 将字节长…

14-矩阵相乘及其运算法则

矩阵与向量的乘法 在这一篇文章中我们就将基于上一篇重新审视矩阵的这个视点来理解矩阵的乘法&#xff0c;那么在这一篇&#xff0c;我们主要来看一下矩阵和向量的乘法。这里这个线性方程组是上一小节给大家举的模拟的一个非常简单的小型经济系统的例子&#xff0c;我们可以把…

文件的导入与导出

文章目录 一、需求二、分析1. Excel 表格数据导出2. Excel 表格数据导入一、需求 在我们日常开发中,会有文件的导入导出的需求,如何在 vue 项目中写导入导出功能呢 二、分析 以 Excel 表格数据导出为例 1. Excel 表格数据导出 调用接口将返回的数据进行 Blob 转换,附: 接…

logstash日志换行处理小解

logstash主用于日志实时数据收集、解析&#xff0c;并将数据转发的工具&#xff0c;内置的功能也相当强大。但&#xff0c;同时意味着&#xff0c;他可能接收到各种情况的数据。 此处&#xff0c;我们主要讲解我实际使用中&#xff0c;碰到的一个小问题&#xff0c;换行(\n)。…

redis 和 mongodb 比较

Redis和MongoDB是两种不同类型的数据库&#xff0c;它们在数据存储和查询方式、数据模型以及适用场景等方面有一些明显的区别。下面是Redis和MongoDB之间的一些比较&#xff1a; 数据模型&#xff1a; Redis&#xff1a;Redis是一个键值存储系统&#xff0c;支持多种数据结构如…

FPGA应用学习笔记--时钟域的控制 亚稳态的解决

时钟域就是同一个时钟的区域&#xff0c;体现在laways语句边缘触发语句中&#xff0c;设计规模增大就会导致时钟不同步&#xff0c;有时差&#xff0c;就要设计多时钟域。 会经过与门的延时产生的新时钟域&#xff0c;这种其实不推荐使用&#xff0c;但在ascl里面很常见 在处理…

八大排序超详解(动图+源码)

&#x1f493;博主个人主页:不是笨小孩&#x1f440; ⏩专栏分类:数据结构与算法&#x1f440; 刷题专栏&#x1f440; C语言&#x1f440; &#x1f69a;代码仓库:笨小孩的代码库&#x1f440; ⏩社区&#xff1a;不是笨小孩&#x1f440; &#x1f339;欢迎大家三连关注&…

虚幻5中Lumen提供哪些功能以及如何工作的

虚幻引擎 5 中的 Lumen 是一个完全动态的全局照明和反射系统。它可以在虚幻引擎 5 中使用&#xff0c;因此创作者无需自行设置。它是为下一代控制台和建筑可视化等高端可视化而设计的。那么它提供了哪些功能以及如何工作&#xff1f; 全局照明 当光离开光源时&#xff0c;它会…

负载均衡搭建

LVS-DR部署 [客户端] node1 192.168.157.148 [lvs] node2 192.168.157.142 [web服务器] node3 192.168.157.145 node4 192.168.157.146&#xff08;1&#xff09;[lvs] yum install -y ipvsadm.x86_64 配置LVS负载均衡服务 &#xff08;1&#xff09;手动添加LVS转发1&#xff…

系统架构设计专业技能 · 软件工程之软件测试与维护(六)【系统架构设计师】

系列文章目录 系统架构设计专业技能 网络规划与设计&#xff08;三&#xff09;【系统架构设计师】 系统架构设计专业技能 系统安全分析与设计&#xff08;四&#xff09;【系统架构设计师】 系统架构设计高级技能 软件架构设计&#xff08;一&#xff09;【系统架构设计师…

MAVEN利器:一文带你了解MAVEN以及如何配置

前言&#xff1a; 强大的构建工具——Maven。作为Java生态系统中的重要组成部分&#xff0c;Maven为开发人员提供了一种简单而高效的方式来构建、管理和发布Java项目。无论是小型项目还是大型企业级应用&#xff0c;Maven都能帮助开发人员轻松处理依赖管理、编译、测试和部署等…

YOLOV7改进:加入RCS-OSA模块,提升检测速度

1.该文章属于YOLOV5/YOLOV7/YOLOV8改进专栏,包含大量的改进方式,主要以2023年的最新文章和2022年的文章提出改进方式。 2.提供更加详细的改进方法,如将注意力机制添加到网络的不同位置,便于做实验,也可以当做论文的创新点。 2.涨点效果:RCS-OSA模块更加轻量化,有效提升检…

Spring Boot业务代码中使用@Transactional事务失效踩坑点总结

1.概述 接着之前我们对Spring AOP以及基于AOP实现事务控制的上文&#xff0c;今天我们来看看平时在项目业务开发中使用声明式事务Transactional的失效场景&#xff0c;并分析其失效原因&#xff0c;从而帮助开发人员尽量避免踩坑。 我们知道 Spring 声明式事务功能提供了极其…

uniapp条件编译

uniapp条件编译 uni-app 将已经将可以跨平台兼容处理的组件及 API 等进行了封装&#xff0c;但是部分平台的特性无法跨平台。 由此&#xff0c;uni-app 提供了条件编译的方案&#xff0c;来处理不同平台的特定或差异。 写法 #ifdef&#xff1a; 仅在某平台存在#ifndef&#xf…

Kafka 01——Kafka的安装及简单入门使用

Kafka 01——Kafka的安装及简单入门使用 1. 下载安装1.1 JDK的安装1.2 Zookeeper的安装1.2.1 关于Zookeeper版本的选择1.2.2 下载、安装Zookeeper 1.3 kafka的安装1.3.1 下载1.3.2 解压1.3.3 修改配置文件 2. 启动 kafka2.1 Kafka启动2.2 启动 kafka 遇到的问题2.2.1 问题12.2.…

Python爱心光波

文章目录 前言Turtle入门简单案例入门函数 爱心光波程序设计程序分析 尾声 前言 七夕要来啦&#xff0c;博主在闲暇之余创作了一个爱心光波&#xff0c;感兴趣的小伙伴们快来看看吧&#xff01; Turtle入门 Turtle 是一个简单而直观的绘图工具&#xff0c;它可以帮助你通过简…