• MyBatis
    • #{}和${}的区别是什么?
    • Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?
    • 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
    • Mybatis是如何进行分页的?分页插件的原理是什么?
    • 简述Mybatis的插件运行原理,以及如何编写一个插件。
    • Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
    • Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别。
    • Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
    • Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
    • Mybatis都有哪些Executor执行器?它们之间的区别是什么?
    • Mybatis中如何指定使用哪一种Executor执行器?
    • Mybatis是否可以映射Enum枚举类?
    • Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
    • 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
    • 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
    • 简单的说一下MyBatis的一级缓存和二级缓存?

    MyBatis

    #{}和${}的区别是什么?

    ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc.Driver。#{}是sql的参数占位符,Mybatis会将sql中的#{}替换为?号,在sql执行前会使用PreparedStatement的参数设置方法,按序给sql的?号占位符设置参数值,比如ps.setInt(0, parameterValue),#{item.name}的取值方式为使用反射从参数对象中获取item对象的name属性值,相当于param.getItem().getName()。

    Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

    还有很多其他的标签,\、\、\、\、\,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中\为sql片段标签,通过\标签引入sql片段,\为不支持自增的主键生成策略标签。

    最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

    Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。

    Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个\、\、\、\标签均会被解析为MappedStatement对象,标签内的sql会被解析为BoundSql对象。

    为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

    Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系模型直接获取,所以它是全自动的。而Mybatis在查询关联对象或关联集合对象时,需要手动编写sql来完成,所以,称之为半自动ORM映射工具。

    简单的说一下MyBatis的一级缓存和二级缓存?

    Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

    Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。