MyBatis的动态 SQL、代理机制与多级缓存

MyBatis的动态 SQL、代理机制与多级缓存

    • 前言
    • 一、动态 SQL
    • 二、代理机制
    • 三、多级缓存
    • 最后

前言

MyBatis 是一个开源的 Java 持久层框架,它通过 XML 或注解的方式将 SQL 语句与 Java 对象进行映射。相比于传统的 JDBC 操作数据库,MyBatis 简化了很多重复的代码和操作,同时也提供了很多功能强大、易于使用的特性。MyBatis 可以与各种数据库进行交互,支持主流的关系型数据库,如 MySQL、Oracle、SqlServer、Postgres 等。其主要特点包括:

  1. 简单易学:MyBatis 的设计思路很简单,易于理解和学习。
  2. 灵活可控:MyBatis 提供了很多灵活可控的特性,如动态 SQL、缓存等。
  3. 映射灵活:MyBatis 支持多种映射方式,如 XML 配置文件、注解等。
  4. 可扩展性强:MyBatis 可以通过自定义插件来扩展其功能。
  5. 缓存支持:MyBatis 提供了多级缓存支持,在高并发场景下可以大幅提升性能。

总之,MyBatis 是一款非常优秀的 ORM 框架,它不仅提供了很多开发效率和运行性能上的优势,还能够帮助开发人员更好地组织和管理项目中的 SQL 语句。MyBatis 提供了多种缓存机制来提高数据访问性能。MyBatis 缓存是指在 MyBatis 应用程序中为特定查询缓存结果集或查询状态的机制。MyBatis 缓存有两种类型:本地缓存和二级缓存。MyBatis 缓存的使用可以提高查询性能,但也需要注意缓存的更新和清除机制,避免数据一致性问题。在使用缓存时,需要根据具体业务情况进行选择和配置。

一、动态 SQL

MyBatis 的动态 SQL 允许在 SQL 语句中添加条件判断、循环、动态拼接 SQL 等操作,以便根据不同需求生成不同的 SQL 语句。通过动态 SQL,可以减少重复编写 SQL 语句的工作量,提高应用程序的可维护性和灵活性。
MyBatis的动态SQL允许你根据条件生成不同的sql语句,这样可以更加灵活地处理不同的查询条件。MyBatis提供了多种动态SQL元素,包括:

  1. If元素:用于根据条件判断是否包括某段SQL语句。
<select id="selectBlog" resultType="Blog">SELECT * FROM blog WHERE 1=1<if test="title != null">AND title like #{title}</if><if test="author != null">AND author like #{author}</if>
</select>
  1. Choose元素:类似于Java中的switch语句,根据不同的条件选择不同的SQL语句。
<select id="selectBlog" resultType="Blog">SELECT * FROM blog WHERE 1=1<choose><when test="title != null">AND title like #{title}</when><when test="author != null">AND author like #{author}</when><otherwise>AND 1=1</otherwise></choose>
</select>
  1. Where元素:用于将where关键字和条件拼接起来,如果没有条件则不会有where关键字。
<select id="selectBlog" resultType="Blog">SELECT * FROM blog<where><if test="title != null">AND title like #{title}</if><if test="author != null">AND author like #{author}</if></where>
</select>
  1. Trim元素:类似于Where元素,用于将where关键字和条件拼接起来,但是可以自定义前缀、后缀和连接符,可以更灵活地处理条件。
<select id="selectBlog" resultType="Blog">SELECT * FROM blog<trim prefix="WHERE" prefixOverrides="AND |OR "><if test="title != null">AND title like #{title}</if><if test="author != null">OR author like #{author}</if></trim>
</select>
  1. Set元素:用于更新操作中,根据条件更新不同的字段。
<update id="updateBlog" parameterType="Blog">UPDATE blog<set><if test="title != null">title = #{title},</if><if test="author != null">author = #{author},</if></set>WHERE id = #{id}
</update>

以上就是MyBatis动态SQL的五种元素,可以根据具体的需求选择不同的方式来生成SQL语句。

二、代理机制

MyBatis 使用了代理模式来实现 DAO 接口的实现类。在运行期间,MyBatis 会根据 Mapper 文件自动生成代理对象,在代理对象中实现了对底层数据库的 CRUD 操作。代理对象是 MyBatis 实现 ORM 的重要工具,它可以隐藏数据访问的细节,提供了数据访问的统一接口。

Mybatis代理机制主要包括两种代理方式:JDK动态代理CGLIB代理

  1. JDK动态代理方式是基于接口的代理方式,它是在运行时动态生成一个代理类,用于代理目标接口的实现类。这个代理类实现了目标接口,并将所有的方法调用转发到InvocationHandler接口的invoke方法中,实现了在不修改目标接口实现类的情况下,对其进行增强或者拦截其方法调用的功能。

  2. CGLIB代理方式是基于继承的代理方式,CGLIB代理会直接生成目标接口实现类的子类,并重写其方法,从而实现对目标接口方法的增强和拦截。CGLIB代理方式相对于JDK动态代理方式的优势在于,它不依赖于接口,可以直接代理目标类,同时也可以代理没有公共构造方法的类。

Mybatis的代理机制通过MapperProxy类实现,当Mybatis解析Mapper接口时,会使用JDK动态代理或者CGLIB代理的方式创建Mapper接口的代理实现类,通过代理实现类来操作数据库。代理实现类中会包含一个SqlSession实例,用于执行数据操作,同时也会包含一个Mapper接口实例,用于实现Mapper接口的所有方法。当代理实现类的方法被调用时,会将实际执行的操作传递到SqlSession实例中,并最终由SqlSession实例完成数据的操作。

三、多级缓存

  1. 本地缓存:是 MyBatis 默认启用的一种基于 Per-Statement 的本地缓存,也就是说同一个会话中,如果多次执行相同的 SQL 语句,MyBatis 会通过本地缓存来缓存结果。本地缓存的特点是生命周期短,仅在会话期间内有效。

  2. 二级缓存:是指 MyBatis 所有 SqlSession 共享的一级缓存,它可以在多个 SqlSession 中共享缓存。二级缓存需要在 mybatis-config.xml 配置文件中配置开启,并需要在 Mapper 文件中设置缓存的实现方式(如 Ehcache、Redis 等)。二级缓存的特点是生命周期长,对于经常查询的数据可以提高查询速度。

MyBatis 支持多级缓存,包括本地缓存、二级缓存和分布式缓存。本地缓存是指在同一个 SqlSession 中缓存查询结果;二级缓存是指在不同的 SqlSession 之间共享同一个缓存,需要配置;分布式缓存是指通过分布式缓存框架(如 Redis)来共享缓存。使用多级缓存可以加快数据访问速度,减少数据库的访问次数,提高应用程序的性能。

最后

在使用 MyBatis 时,动态 SQL 可以帮助我们灵活的构建查询条件,代理机制可以实现数据访问的封装和统一管理,多级缓存可以加速数据的读取。但是需要注意,使用多级缓存时需要合理设置缓存策略,否则会出现数据不一致的问题。同时,动态 SQL 和代理机制也需要合理使用,避免代码逻辑混乱和性能问题。

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

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

相关文章

uni-app获取地理位置

在uni-app中&#xff0c;可以通过uni.getLocation()方法获取地理位置。具体步骤如下&#xff1a; 在uni-app项目中的manifest.json文件中&#xff0c;添加需要获取地理位置的权限&#xff1a; {"mp-weixin": {"appid": "...","permission…

【CSS】画个三角形或圆形或环

首先通过调整边框&#xff0c;我们可以发现一些端倪 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style>.box{width: 150px;height:150px;border: 50px solid black;}</style&g…

[JAVEee]SpringBoot项目的创建

SpringBoot可以更好的开发Spring项目,本文章将使用idea社区版来演示创建项目的过程与注意事项. SpringBoot的优点 SpringBoot中内置快速添加依赖的功能,能够便捷的集成各种框架,帮助开发.内置运行容器,无需配置Tomcat容器等其他web容器,可直接进行项目的部署与运行.更好的使用…

2023年中国研究生数学建模竞赛D题解题思路

为了更好的帮助大家第一天选题&#xff0c;这里首先为大家带来D题解题思路&#xff0c;分析对应赛题之后做题阶段可能会遇到的各种难点。 稍后会带来D题的详细解析思路&#xff0c;以及相关的其他版本解题思路 成品论文等资料。 赛题难度评估&#xff1a;A、B>C>E、F&g…

Git创建干净分支,本地操作不依赖任何分支

clone远程项目: git clone gittest.git查看分支: git branch -a创建新分支: git checkout --orphan test, 返回Switched to a new branch test删除当前项目文件夹下所有文件: git rm -rf .提交变更: git commit -m "new branch for test"查看分支: git branch -a, 发…

MDK工程转换Vscode+EIDE方法

MDK工程转换VscodeEIDE方法 1、VscodeEIDE环境搭建方法 请按下方视频完成环境搭建&#xff0c;并编译成功。下载&#xff0c;单步调试如无视频中芯片可暂不执行。 https://www.bilibili.com/video/BV1Zu4y1f72H/?spm_id_from333.337.search-card.all.click&vd_source73…

flex布局与float布局

float布局 俩栏 三栏 flex布局

如何快速实现一个可视化看板?

一、用python实现一个可视化数据看板&#xff0c;最多支持多大体量的数据处理&#xff1f; Python可以通过多种可视化库来实现数据看板&#xff0c;例如Matplotlib、Seaborn、Plotly等。这些库可以处理各种规模的数据&#xff0c;从小型数据集到大型数据集都可以应用。 对于小型…

深拷贝和浅拷贝的区别

本文内容 主要阐述下深拷贝和浅拷贝的区别 通俗理解 深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体&#xff0c;而不是引用。 假设B复制了A&#xff0c;修改A的时候&#xff0c;看B是否发生变化&#xff1a; 如果B跟着也变了&#xff0c;说明是浅拷贝&…

第一百五十一回 自定义组件综合实例:游戏摇杆二

文章目录 内容回顾实现方法位置细节示例代码我们在上一章回中介绍了如何实现 游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在上一章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的…

MLAgents (0) Unity 安装及运行

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…

7.2、如何理解Flink中的水位线(Watermark)

目录 0、版本说明 1、什么是水位线&#xff1f; 2、水位线使用场景&#xff1f; 3、设计水位线主要为了解决什么问题&#xff1f; 4、怎样在flink中生成水位线&#xff1f; 4.1、自定义标记 Watermark 生成器 4.2、自定义周期性 Watermark 生成器 4.3、内置Watermark生…

软考网络工程师华为配置考点总结

华为交换机配置基础 1.vlan的配置 华为设备中划分VLAN的方式有&#xff1a; 静态的划分&#xff1a;基于接口动态划分&#xff1a;基于MAC地址、基于IP子网、基于协议、基于策略&#xff08;MAC地址、Ip地址&#xff09;。 其中基于接口划分VLAN&#xff0c;是最简单&#x…

AI视频剪辑:批量智剪技巧大揭秘

对于许多内容创作者来说&#xff0c;视频剪辑是一项必不可少的技能。然而&#xff0c;传统的视频剪辑方法需要耗费大量的时间和精力。如今&#xff0c;有一种全新的剪辑方式正在改变这一现状&#xff0c;那就是批量AI智剪。这种智能化的剪辑方式能够让你在短时间内轻松剪辑大量…

Fourier变换的积分性质及其证明过程

Fourier变换的积分性质及其证明过程 一、积分性质 如果当 t → ∞ t \to \infty t→∞时&#xff0c; g ( t ) ∫ − ∞ t f ( t ) d t → 0 g(t) \int_{ - \infty }^t {f(t){\rm{d}}t \to 0} g(t)∫−∞t​f(t)dt→0&#xff0c;则&#xff1a; F [ ∫ − ∞ t f ( t ) …

2591. 将钱分给最多的儿童(Java)

给你一个整数 money &#xff0c;表示你总共有的钱数&#xff08;单位为美元&#xff09;和另一个整数 children &#xff0c;表示你要将钱分配给多少个儿童。 你需要按照如下规则分配&#xff1a; 所有的钱都必须被分配。 每个儿童至少获得 1 美元。 没有人获得 4 美元。 请你…

代码随想录算法训练营第23期day3| 203.移除链表元素 ,707.设计链表,206.反转链表

目录 一、链表 基础操作 二、&#xff08;leetcode 203&#xff09;移除链表元素 1.使用原来的链表 2.设置虚拟头结点 三、&#xff08;leetcode 707&#xff09;设计链表 四、&#xff08;leetcode 206&#xff09;反转链表 1.双指针法 2.递归法 一、链表 单链表定义…

大型集团借力泛微搭建语言汇率时区统一、业务协同的国际化OA系统

国际化、全球化集团&#xff0c;业务遍布全世界&#xff0c;下属公司众多&#xff0c;集团对管理方式和企业文化塑造有着很高的要求。不少大型集团以数字化方式助力全球统一办公&#xff0c;深化企业统一管理。 面对大型集团全球化的管理诉求&#xff0c;数字化办公系统作为集…

观测云产品更新 | 优化日志数据转发、索引绑定、基础设施自定义等

观测云更新 日志 数据转发&#xff1a;新增外部存储转发规则数据查询&#xff1b;支持启用/禁用转发规则&#xff1b;绑定索引&#xff1a;日志易新增标签绑定&#xff0c;从而实现更细颗粒度的数据范围查询授权能力。 基础设施 > 自定义 【默认属性】这一概念更改为【必…

指夹式脉搏血氧仪方案

随着科技的进步&#xff0c;家庭医疗器械的需求已经从简单测量到智能健康管理转变&#xff0c;比如能够对不同家庭成员的健康分别记录管理&#xff0c;将监测数据同步给家庭成员&#xff0c;专属家庭医生提供线上医疗服务等等。当前&#xff0c;在全球范围内&#xff0c;对更好…