目录
[🍖#{ }和{ }的区别](#{ }和{ }的区别)
[🍐第一种:#{ }](#{ })
[🍐第二种: { }](#🍐第二种: { })
[🍐#{ }写法](#{ }写法)
[🍐{ }写法](#🍐{ }写法)
[🍐#{ }写法](#{ }写法)
🍖多表查询
前置数据,我们有两张表
article_info表

user_info表

然后我们有两个实体类,
ArticleInfo类

UserInfo类

🍖左连接-查询两张表
上篇博客,我们介绍的都是单表查询,而没讲过多表查询。我们一起看看多表查询。
接口写法

我先介绍一下这个,就是我们写了个接口,返回值是ArticleInfo实体类,
对应的xml

id后面跟着接口类里的要实现抽象方法,
测试

结果

这个打印结果呢,大家要看清楚了,上面的那个呢,是我们在yml文件里面配置的一个mybatis打印日志,如下

而下面那个红框框呢,是我们测试的打印articleInfo对象实体的tostrinhg方法,而我们细心观察到,我们对应的实体类的属性全都映射上了,这也是因为我们在yml文件里配置了驼峰自动转化,这个不多讲,但是根据我们学习数据库的左连接知识,也根据上上图的打印信息来看,明显两张表的字段没有,也不能直接有位置映射到只含部分属性的articleInfo实体类上,所以我们在ArticleInfo类上再添加几个属性,

我们直接看打印日志

发现,加上4个属性,和我们改动的地方一模一样,所以我们得出结论:
当我们进行多表查询的时候,返回的视图(不严谨,但我觉得这样说我自己好理解,看大家咋理解的)映射到我们对应接收的实体类ArticleInfo中,没有对应的属性就直接丢弃,有的话进行赋值。
🍖#{ }和${ }的区别
然后呢,我觉得给大家截图截的有点重复,我就调精简的来吧,大家体谅一下,虽然也能写,可我觉得不够精炼。
使用#{ }的xml写法

结果

另一种就是
使用${ }的xml写法

结果

然后我们对比一下#{ }和${ }写法,这样吧,我截个图,给大家做一下对比。

不难看出,#{ }写法是通过?来进行占位的。
而${ }写法是直接把值给拼接到sql语句的。
可是这样理解还不够,让我们再发散一下,
这里给大家科普一下,我们sql语句,字段名的那个反引号可加可不加,但是我们的字段对应的值,如果说是数字的情况下,我们也是可加,可不加的单引号的,但如果说是,不是数字的情况下,是那种类似于字符串的情况下,我们就必须要加上单引号,不然sql语句会错误,如下,


面对纯数字的情况下,加不加单引号都不影响,都正确返回。


而这种情况,当不是纯数字的情况下,也就是这种类似于字符串的情况下,如果填的字段对应的值没加单引号,那就直接报错!这是我们理解后面的#{ }和${ }区别的基础!!!大家要理解透,非常重要!!!
好,我们把这些基础的给打牢了,那我们看看这个示例,
🍐第一种:#{ }
接口写法

对应的xml

测试

打印结果

返回成功,说明这个#{ } 是通过?来进行占位的!而且,最重要的一点就是,这个#{ }写法,它会自动检查要不要加上单引号。算了,我直接给大家讲吧,这种写法,还能防sql注入,它会对你赋的值里面检查,有无单引号啥的符号,有的话对它进行转义。所以对应的第二种,${ }写法,由于它时直接拼接,所以它不会对你赋的值里面检查,也就有了sql注入的风险!!!
🍐第二种: ${ }
接口写法不变,

对应的xml

测试也不变

结果

报错了,这种写法为啥会报错呢,原因在于,${ }写法是一种直接拼接的写法,关键在于这种拼接只是单单的把zhangsan给拼接上了,不会加上单引号!!所以就像我们上面介绍的sql基础单引号语法一样,类似与字符串的字段赋值时,一定要加上单引号!!!
所以我们这样改、

在xml文件里,将${ }给包裹一个单引号,由于它时直接拼接吧,那我们就在它直接拼接之前,在两侧加上单引号,然后它直接拼接到单引号里面去,就不会产生错误的sql语句了
结果

正确。
🍐sql注入
然后我们写一个${ }写法的sql注入成功的代码
测试用例写成 ' or 1='1 ,那就直接拼成了 password= ' ' or 1='1' 这样全部的数据就都能拿到了,所以就有sql注入的风险,这种写法好像不安全!



这个报错信息是因为,我们的接口返回值时一个对象,而这个数据库给我们返回的是一大堆对象,所以它报的是类型不匹配异常,但不影响我们的sql注入,获取全部的信息!!
所以讲到这里,我们就知道#{ }的转义优化,自动添加' '单引号有多香了!!!大家脑海里要有这个:哦,原来${ }写法有sql注入的风险啊!!
🍖排序功能
上面我们将了,{ }写法有sql注入的风险,那是不是我们就不用{ }了呢,不是的,在排序上至少还可以用。
因为排序的sql语法,它没有单引号,也不允许有单引号出现,而我们的#{ }虽然没有sql注入的风险,但是它会优化,加上单引号,导致sql语法错误,完成不了该功能!!
我给大家演示一下。
🍐#{ }写法
接口

对应的xml

这个会优化,添加单引号的。
测试

结果

就是sql语句错误,直接俄报错
🍐${ }写法
在上面的基础上,只改变xml写法

结果

返回正确。
🍖like查询
同样将之前,说一下sql语法,sql语法的like查询必须得加单引号,不加直接语法错误。

🍐#{ }写法
接口

对应的xml

测试

就大家有想到为啥我要这样写吗,#{ }会自动加单引号,而我们的like语句有必须要有单引号,两者一拍即合,所以这就是#{ }的完美应用场景。
结果

但是我的这种写法,不适配场景,毕竟传递的要是%值%这样,难道说用户想查一个东西,左右两边还都要加上一个单引号吗,这种体验感是不是极差,是吧,我们自己都比较懒,那么我们这样写,
concat函数写法
concat是mysql数据库提供的一种函数,
接口

对应的xml

我觉得吧,我们知道concat咋用就行,首先呢它是由三个参数吧,那它的作用很明了,就是字符的拼接,然后在最外层套一层单引号。所以你就不能在里面搞个${ }来,因为这个concat函数不防sql注入,大家get到没。嗯,就是这个逻辑。
测试

结果

那个${ }写法,我就不演示了,肯定会由sql注入的风险啊。
🍖数据库连接池
首先我们的这几篇博客呢,它背后使用了数据库连接池技术,这个大家学到这里,肯定能get到这个意思,我们用jdbc写sql语句,是不是需要连接数据库,执行完sql语句后,不用了,就销毁连接啊,这都是有资源和时间上的开销的。
所以数据库连接池技术,避免了频繁的创建连接,销毁连接。

当然数据库连接池有不少,其中Druid和我们的这个Hikari就比较有名。大家如果说不想用Hikarri的话,自己去网上查即可。
完结,又码了2700个字,麻了.