前言
大家好,一直以来我都本着 用最通俗的话理解核心的知识点, 我认为所有的难点都离不开 基础知识 的铺垫
适合人群
- 学完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 < 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中。我们下期不见不散,关注我,不迷路 ~