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

325 阅读6分钟

前言

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

适合人群

  • 学完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```标签是不认的, 那这个问题怎么解决呢?

使用 <![CDATA[...]] 解决字符问题

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

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

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

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

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

<sql> 标签

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

<sql id="selectRole">
    <![CDATA[ select * from user_role where id < 2 ]]>
</sql>

<select id="getRoles" resultMap="userRoleMap">
    <include refid="selectRole" />
</select>

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

<where> & <if> 标签

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

<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

<trim>标签

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

 <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>

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

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

结束语

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

下期预告

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

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