Mybatis汇总

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执行、结果处理和映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值