1、#{}和${}的区别
#{} 是MyBatis下sql的参数占位符,实际执行过程中,MyBatis会将#{}的参数转换成JDBC中prepareStatement的 ?
${}是项目配置文件中的变量占位符
2、xml文件除了常见的select、insert、update、delete还有其他的标签吗
常见的还有resultMap,用来标记bean的属性与数据库表字段的对应关系
parameterMap,代表的是查询的条件XXXExample
sql标签,代表sql片段
还有动态sql的if、where、when、foreach
3、Dao的工作原理是什么?方法的参数不同时能重载吗
Dao的工作原理是MyBatis执行接口方法时,生成接口的代理对象,通过代理对象进行sql语句的转换,invoke执行具体的sql,将method的返回值返回
方法参数不同时可以进行重载,重载的要求是:只能有一个无参和一个有参的,有参的重载时需要参数个数都一样
4、MyBatis是如何进行分页的,分页插件的原理?
使用RowBounds对象进行分页,实现方式是将查询结果在内存中进行分页;
使用xml中语句添加limit start,rowSize
5、MyBatis的插件运行原理?如何编写一个插件?
这个还不清楚具体的插件原理?
6、MyBatis批量插入时能返回数据库主键列表吗?
能。在方法的标签上标注<useGeneratedKeys = true>,那么执行完之后id就会映射到实体类对象的id属性上
7、MyBatis的动态sql做什么?动态sql有哪些标签
可以在xml中用标签的形式写sql,完成动态sql的拼接
实现原理:从sql参数对象中计算出表达式的值,使用值拼接
<if>
<where>
<choose> <when> <foreach> <bind>
8、MyBatis如何将sql执行结果封装为目标对象并返回的?
拿到sql执行的返回值后,使用反射生成method的返回值类型的对象,根据sql中的字段与bean属性的映射关系,并取到对应的setXXX()方法,执行set方法将column一一赋值到bean的属性中并返回
怎么映射sql表字段到bean的属性上?
使用<resultMap>
标签;利用sql的返回值中元数据的categoryName(实际就是sql的列)与entity的getXXX()解析出XXX之后的对应关系
9、MyBatis能执行一对一,一对多的关联查询吗?
自己也有过疑问,没有找到对应的答案
10、MyBatis是否支持延迟加载?
MyBatis中有lazyLoadingEnabled配置来设置是否懒加载,默认是false
懒加载:只有使用到某个查询结果的B的方法时才进行实际的sql执行
原理是:cglib的代理对象
11、MyBatis的Executor执行器是什么?原理是?
!!!需要学习
12、MyBatis是否映射枚举类?
MyBatis映射普通类的原理:存在一个TypeHandler ,里面包含两个方法:setParameter()和getResult()方法
setParameter:将普通类的属性值set到sql语句中的?占位符中
getResult:返回sql执行完之后的指定column的value值
重写的话可以将枚举的值作为参数传递进去就可以了,get的时候接收的值映射为枚举
14、MyBatis是半自动ORM映射工具?半自动是指?
13、MyBatis和Hibernate的区别?