MyBatis进阶用法之复杂标签学习

简介: MyBatis进阶用法之复杂标签学习

前言

大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫


适合人群

  • 学完Java基础
  • 想通过Java快速构建web应用程序
  • 想学习或了解SpringBoot

大佬可以绕过 ~


背景

本节给大家讲讲 Java的SpringBoot框架, 之前我们学习的都是java的基础知识和底层提供的一些能力,我们日常工作都是在写接口。在我们在产品开发中,一般我们都会选择比较稳定的框架来帮我们加速开发,不会自己去造轮子,而在java众多框架中,spring框架表现的非常好,大部分公司都会首选它作为开发框架,而至今,大部分企业都是以springboot来构建项目了~


情景回顾

今天是第五期的内容了,如果你是一路看过来的,很高兴你能够耐心看完。上期带大家学习了MyBatis框架的基本使用, 体验了一下如何crud,本期带大家体验一下高级一点的功能。最近github可能会被墙,所以我把源码放到了国内gitee上,本节我们依然使用上期的代码


项目源码(持续更新⭐️)


上期遗留问题

我们先从一个小例子说起, 如果你是细心小伙伴或许业务试过这个语句。我们之前查询所有数据的时候并没有加条件,这次我们加个条件试试,之前我们都是用=号,我们换个比较大小


修改一下xml:

<select id="getRoles" resultMap="userRoleMap">
    select * from user_role where id > 1
</select>
复制代码


我们再执行一下,结果发现正常返回数据, 说明是认我们这个>符号的, 我们再改成 ```<````试试

<select id="getRoles" resultMap="userRoleMap">
    select * from user_role where id < 1
</select>
复制代码


再重启一下, 好家伙,还没等执行请求呢,就干报错了 (〃>皿<),报错内容:

Caused by: org.xml.sax.SAXParseException: 元素内容必须由格式正确的字符数据或标记组成。
复制代码


我可以得知,这个xml解析发生在编译阶段,说明这个<````,我们Mybatis```标签是不认的, 那这个问题怎么解决呢?


使用   解决字符问题

下面我们就解决一下这个问题:

<select id="getRoles" resultMap="userRoleMap">
    select * from user_role where id &lt; 2
</select>
复制代码


< 这个字符是转义字符,我们重启一下,发现一切都正常。因为我们的语句相对简单,所以这样写是完全可以的,但是如果很复杂的呢?难道一个个这样写吗?一方面不利于代码维护,一方面容易出错,还不利于阅读,教大家一个更加方便的方法:

<select id="getRoles" resultMap="userRoleMap">
    <![CDATA[ select * from user_role where id < 2 ]]>
</select>
复制代码


没错,只要把语句塞进去就好了,作用就是帮我们自动转换字符,安全性也高一些,后续的演示我们直接修改xml,就不修改原有的接口和控制器类了,我们这节重点学习标签


标签

这个标签的作用,类似于拆分,把sql部分语句拆出去然后还可以引用它,我们把之前的例子改写一下:

<sql id="selectRole">
    <![CDATA[ select * from user_role where id < 2 ]]>
</sql>
<select id="getRoles" resultMap="userRoleMap">
    <include refid="selectRole" />
</select>
复制代码

是不是很简单,这个作用就是帮助我们把复杂的sql进行拆分和复用,避免繁琐


&  标签

这两个标签为啥要一起讲,因为通常我们都是一起配合使用的,单独使用其实也可以, 以查询某个用户角色为例:

<select id="getRole" resultMap="userRoleMap">
    select * from user_role
    <where>
        1 = 1
        <if test="id != null and id != 0">
            AND  id=#{id}
        </if>
    </where>
</select>
复制代码


where很简单,跟真实的where一样, 1=1主要用于站位,因为假使 id是个null值,最后编译就剩下一个where了,这样运行,sql是不通过的,所以是个小技巧。if很好理解,判断的意思,test就是判断具体的参数。这么做的好处就是,避免了繁琐的sql,根据判断把没必要的sql部分去掉,所以mybatis把原生sql的能力赋予了开发者,以编写更高性能的sql


标签

这个标签有点复杂,看了你可能眼花,听我耐心分析,我们继续修改上面的例子:

<select id="getRole" resultMap="userRoleMap">
    select * from user_role
    <trim prefix="WHERE" prefixOverrides="AND">
        <if test="id != null and id != 0">
            id=#{id}
        </if>
    </trim>
</select>
复制代码

你可能有疑问❓了,where 和 and去哪了,这肯定报错。话别说太早,小伙子,运行一下看看, 好家伙正常。你之前给我讲的小技巧好像没这个厉害


trim它的主要作用是帮我去掉一些多余的东西, 比如and, ,, ()这种,因为每次我们判断都要加这些玩意,很容易忘了加了,所以干脆我就不要了。这里说的去掉不是真正意义上的删掉,而是转化。所以它的标签上有两个属性 prefix, prefixOverrides,他两就干这事的,还有一个suffix,这里就不演示了,留给大家自己试~


结束语

本期就到这里结束了,其实还有很多标签,大家可以自己尝试一下,有些其实可以在代码层面处理,说多一点,这些标签可以组合使用,但是不是说让你炫技,看谁写的复杂,像xml文件标签过多很不利于维护,如果你写的很复杂,别人看不懂咋办,过久点自己都看不懂了,所以能简洁的就简洁,能在代码层面处理的在代码层面处理,sql如果过于复杂,比如参与了运算,数据量大的时候,很影响性能,如果你的sql慢查询了导致接口阻塞,后边请求量上来,你的系统几乎就瘫了,mysql也会被影响,其它服务也可能连接着它,也会收到影响,会造成雪崩


下期预告

其实学到这里,做一个简单的博客系统,已经够应付了,但还不够,离真正业务开发还差很多。那么差在哪里呢?差在基础建设,说的有点抽象,意思就是一个健壮的系统需要一个好的基础架构,而架构需要使用复杂的技术,大部分是经过很多验证的开源技术,把它应用到我们的项目中,这也就是我即将要讲的进阶部分了。

在进阶部分中,你将学习到各种新技术,这也是目前市面上企业级开发中常用的技术栈, 如果基础部分还不够熟悉,请先看完它们,尝试自己写个博客应用。下期给大家讲的是缓存中间件Redis的使用,同样的我们集成到SpringBoot中。我们下期不见不散,关注我,不迷路 ~

相关文章
|
22天前
|
SQL Java 数据库连接
MyBatis-Plus的几种常见用法
MyBatis-Plus 为 MyBatis 提供了许多增强功能,使得开发更加便捷高效。通过基础的 CRUD 操作、条件构造器、分页插件和自动填充等功能,开发者可以显著减少代码量,提高开发效率。在实际应用中,根据具体需求选择合适的功能模块,能够更好地利用 MyBatis-Plus 提升项目开发效率。
56 22
|
1月前
|
缓存 NoSQL Java
Mybatis学习:Mybatis缓存配置
MyBatis缓存配置包括一级缓存(事务级)、二级缓存(应用级)和三级缓存(如Redis,跨JVM)。一级缓存自动启用,二级缓存需在`mybatis-config.xml`中开启并配置映射文件或注解。集成Redis缓存时,需添加依赖、配置Redis参数并在映射文件中指定缓存类型。适用于查询为主的场景,减少增删改操作,适合单表操作且表间关联较少的业务。
|
2月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
124 13
|
5月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
5月前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
4月前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
658 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
4月前
|
SQL XML Java
Mybatis的<where>,<if>等标签用法
这篇文章详细解释了Mybatis中<where>和<if>等标签的用法,展示了如何在SQL动态构建中有效地过滤条件和处理逻辑分支。
360 1
|
4月前
|
SQL Java 数据库连接
Mybatis入门(select标签)
这篇文章介绍了Mybatis中`select`标签的基本用法及其相关属性,并通过示例展示了如何配置和执行SQL查询语句。
86 0
Mybatis入门(select标签)
|
5月前
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
70 5
|
4月前
|
SQL Java 数据库连接
Mybatis的<insert>,<update>,<delete>标签用法
这篇文章详细讲解了Mybatis中<insert>, <update>, <delete>标签的使用方法,并提供了示例代码来展示如何执行数据库的增删改操作。
308 0