#{}和${}的区别是什么?

一般如果可以使用#就不要使用$符号。
1)使用#入参,myBatis会生成PrepareStatement并且可以安全地设置参数(=?)的值。因为sql语句已经预编译好了,传入参数的时候,不会重新生产sql语句。安全性高。
2)用$可以会有sql注入的问题:
例如,select * from emp where ename = ‘用户名’,如果使用$入参,用户名被传入例如‘smith or 1 = 1’,那无论ename是否匹配都能查到结果。
3)在特定场景下,例如如果在使用诸如order by ‘{param}’,这时候就可以使用$.

mybaties原理(二级缓存装饰模式的运用)

image.png
image.png

image.png

image.png

image.png
image.png
https://www.bilibili.com/video/BV1Tp4y1X7FM?p=2 b站 鲁班大叔

Mybatis一级缓存和二级缓存的区别

区别
1.一级缓存 Mybatis的一级缓存是指SQLSession,一级缓存的作用域是SQlSession, Mabits默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SQLSession的缓存会被清空。 每次查询会先去缓存中找,如果找不到,再去数据库查询,然后把结果写到缓存中。 Mybatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 SqlSession执行insert、update、delete等操作commit后会清空该SQLSession缓存。
2.二级缓存 二级缓存是mapper级别的,是跨进程的,是一级缓存的补充,毕竟一级缓存的只是sqlsession级别的。Mybatis默认是没有开启二级缓存的。 第一次调用mapper下的SQL去查询用户的信息,查询到的信息会存放代该mapper对应的二级缓存区域。 第二次调用namespace下的mapper映射文件中,相同的sql去查询用户信息,会去对应的二级缓存内取结果。
mybaties - 图7

image.png