5.2.1#{}和${}的区别是什么?
答:${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换
#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,取值方式为使用反射从参数对象中获取属性值
5.2.2Xml映射文件中,除了常见的select,insert,update,delete标签,还有哪些标签?
答:<resultMap>,<parameterMap>,<sql>,<include>,<selectKey>,加上动态sql的9个标签,trim,where,set,foreach,if,choose,when,otherwise,bind等,通过<include>标签引入sql,<selectKey>为不支持自增的主键生成策略标签
5.2.3最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
答:Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名就是映射文件中的MappeedStatement的id值,接口方法内的参数,就是传给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可委一定位一个MapperStatement
在Mybatis中,每一个<select>,<insert>,<update>,<delete>标签,都会被解析为一个MappedStatement。
- Mapper层方法语法上可以重载,但是重载之后的多个方法对应Xml中的一个Id,Xml中id不可重复;所以要求每个方法的参数都可以和xml中的传参数对应。(但实际使用中目前未使用过Mapper层方法重载)
- 底层:在Mybaits初始化解析所有Xml时,会维护一个Map(Configuration#mappedStatements),key是Xml中的【命名空间+id】(命名空间namespace就是对应Mapper类的全限定名),在进行Mapper层方法调用时,会以所在类的【全限定名+方法名】(和方法的参数无关)为key从mappedStatements中获取对应的MappedStatement,然后执行对应的Sql。
5.2.4Mybatis是如何进行分页的?