1. #{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换。
Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
Mybatis在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止SQL注入,提高系统安全性。
Statement与PreparedStatement的区别,什么是SQL注入,如何防止SQL注入
PreparedStatement支持动态设置参数,Statement不支持。
PreparedStatement可防止Sql注入,而Statement不行。
在sql语句出错时PreparedStatement不易检查,而Statement则更便于查错。
什么是SQL注入: 通过sql语句的拼接达到无参数查询数据库数据目的的方法。
如将要执行的sql语句为 select * from table where name = "appName+",利用appName参数值的输入,来生成恶意的sql语句,如将['or'1'='1'] 传入可在数据库中执行。
因此可以采用PrepareStatement来避免Sql注入,在服务器端接收参数数据后,进行验证,此时PrepareStatement会自动检测,而Statement不行,需要手工检测。
2. 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,实例化Configuration对象,读取xml中的sql语句,创建SeesionFactory,通过SessionFactory创建Session对象,通过Seesion对象完成数据库的增删改查操作。
Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存。
3. 一级、二级缓存
1)一级缓存: 缓存在session对象中发起了二次请求,第一次是去数据库查找,查完之后就会缓存在 session对象中,第二查询的时候会先去session对象中查找,看有没有这个数据,如果有的话就直接返回出去,不会再去数据库中查询。一级缓存是session维度,一个请求一个session,一个session一个事务。
2)二级缓存xml中加上cache标签就开启二级缓存,当Session对象关闭之后,缓存在Session对象的里的数据就会丢给SessionFactory对象。二级缓存是mapper维度的。
4、mybatis执行sql流程
参数解析、SQL解析、SQL执行、结果处理和映射