文章目录
1.经典面试题(#{}和${}的区别)
1.1关于#
预编译SQL:这个其实是我们使用的比较多的,而且这个的性能和下面的这个$相比较,他的这个性能会更高一些;
我们的这个预编译SQL相当于就是提前占据位置:因为我们可以在运行起来的时候查看这个控制台里面的日志,发现我们在这个#{}里面的这个内容在我们的这个程序看来就是?
然后就是根据我们传递的参数把这个参数放到那个?的位置上面去几个,这个就是提前占座的功能,有参数了直接传递过去,仅此而已;

1.2关于$
即时SQL:这个相当于说的就是我们的这个SQL是拼接得到的,这个就很容易出现问题,而且我们在使用的时候需要加上这个单引号,写起来也是相对而言比较麻烦的;
存在SQL注入的风险+即时SQL相当于是进行字符串的拼接的效果;
1.3情况下需要使用$
这个$存在这个SQL注入的问题需要我们去处理和解决,而且好像写起来也不是很方便,为什么这个方式依然存在呢,这个是因为他肯定是有自己不可替代的这个地方的,不然的话#{}也不会允许他存在,他必然可以做出来#{}做不成的事情;
排序功能,asc和desc(升序和降序),这个场景就是我们的#{}无法实现的,因为这个时候如果我们使用#{}就会在这个关键字的外面去添加这个引号,这个时候就会报错,因此在这个场景下面,必须要使用${}这样的写法,这个情况下字符串的拼接正好是符合要求的;
2.数据库连接池
2.1池化技术图解
就是这个的这个mybatis是下面的第二个情况,也就是说这个事引入了链接吃的,好处就是我们的这个connection全部都在池子里面,用户直接从这个池子里面取出来就行了,使用完了再放进去即可;
但是没有连接池的时候,我们的用户需要直接和这个数据库打交道,这个也算是我们的池子的特点,类似于之前学习的这个生产者消费者模型;

3.动态SQL
3.1if标签的使用
动态SQL主要是处理这个xml里面的数据库内容查询的时候使用的:
下面的是两个if双标签,第一个标签判断我们的这个性别是不是空的,另外一个双标签负责判断我们的这个values里面的这个内容,相当于就是把我们的这个插入语句里面使用到gender的地方全部使用if标签进行处理一下;

3.2where标签的使用
下面的这个就是select语句,我们对于查询的相关属性使用这个if标签进行判断这个age,hender,deleteFlag是不是空的,其他的都是一样的;

除了使用上面的这个if标签,我们还可以使用下面的这个where标签,where标签可以生成这个where关键字,并且去掉这个and:下面的这个就是两个之间的对比;
下面的这个prefix表示的就是去电这个前缀,因为你会发现上面的这个里面出现的and gender=#{} and deleteFlag=#{}都有这个and单词,因此我们可以使用prefix进行说明,这样我们的标签里面就不用写了;

3.3set标签的使用
set标签主要是处理我们的这个修改的SQL相关语句,suffix主要是去去掉我们的代码块的后缀(下面的两个图片左边的是trim标签,右边的是set标签);
因为我们的SQL语句里面是不应该有这个逗号的,但是我们下面的这个属性使用预编译SQL的时候需要使用逗号,因此我们添加这个suffix进行过滤去除掉;
该有这个逗号的,但是我们下面的这个属性使用预编译SQL的时候需要使用逗号,因此我们添加这个suffix进行过滤去除掉;
