mybatis
1、#{}和${}的区别是什么?
#{}是预编译处理,${}是字符串替换,mybatis在处理#时,会将sql语句中的#替换成问号,调用preparedStatement的set方法来赋值;在处理$时就是把$替换成变量的值,使用#可以有效的防治sql注入,提高系统安全性。
2、当实体类中的属性名和表中的字段名不一样怎么办?
第一种:通过查询sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致
<select id=”selectorder” parametertype=”int” resulttype=”order”>
Select order_id id,order_no roderno from orders where order_id=#{id};
</select>
第二种:通过<resultMap>来映射字段名和实体类属性
3、模糊查询like语句怎么写?
第一种:在java代码中添加sql通配符
String wildcardname=”%smi%”;
List<name> names=mapper.selectlike(wildcardname);
<select id=””>
Select* from foo where bar like #{value}
</select>
第二种在sql语句中拼接通配符,会引起sql注入
String wildcardname=”smi”;
List<name> names=mapper.selectlike(wildcardname);
<select id=””>
Select* from foo where bar like “%”#{value}”%”
</select>
4、通常一个xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Dao接口,就是人们常说的Mapper接口,接口的全限名就是映射文件中namespace的值,接口的方法名,就是映射文件MapperStatement的ID值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现Dao接口里的方法,是不能重载的,因为是全限名+方法名的保存和寻找策略。Dao接口的工作原理是JDK动态代理,MyBatis运行时会使用JDK动态代理为Dao接口生成代理Proxy对象,代理对象会拦截接口方法,转而执行MappedStatement所代表的sql,然后将结果返回。
5、MyBatis是如何进行分页的?分页插件的原理是什么?
MyBatis使用RowBounds对象分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成,也可以使用插件来完成物理分页。分页插件的基本原理是使用MaBtis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截执行的sql语句,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。
6、MyBatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系,第二种是使用sql列的别名功能,将列别名书写为对象属性名,有了列名与属性名的映射关系后,MyBatis通过反射创建对象,同时使用反射给对象的属性赋值并返回。