MyBatis-2

目录

🍖多表查询

🍖左连接-查询两张表

[🍖#{ }和{ }的区别](#{ }和{ }的区别)

[🍐第一种:#{ }](#{ })

[🍐第二种: { }](#🍐第二种: { })

🍐sql注入

🍖排序功能

[🍐#{ }写法](#{ }写法)

[🍐{ }写法](#🍐{ }写法)

🍖like查询

[🍐#{ }写法](#{ }写法)

🍖数据库连接池


🍖多表查询

前置数据,我们有两张表

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个字,麻了.

相关推荐
楠枬3 小时前
Redis 哨兵
数据库·redis
arronKler3 小时前
数据库设计三大范式
数据库·oracle
敲代码的嘎仔4 小时前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
jran-4 小时前
MySQL多表操作 查询&子查询&外键约束
数据库·mysql
橙子圆1234 小时前
Redis知识6之事务
数据库·redis·缓存
不会摸鱼的小鱼4 小时前
WSL 安装 Ubuntu 22.04 到指定磁盘
数据库·postgresql·php
m0_702036534 小时前
mysql如何导出特定条件的查询数据_使用mysqldump加where参数
jvm·数据库·python
正在走向自律4 小时前
标量子查询消除:数据库优化器的一场“等价变戏法”
数据库·sql 优化·金仓数据库·数据库性能调优·标量子查询·数据库优化器
逻极4 小时前
SQLite 从入门到精通:深入理解嵌入式数据库的艺术与科学
数据库·sqlite·记忆·sqlite从入门到精通
未来之窗软件服务4 小时前
数据库优化(九)随机抽选系统数据表 ——东方仙盟
大数据·数据库·数据库优化·仙盟创梦ide·东方仙盟