MyBatis的重点和面试常问的问题

MyBatis

  1. ${}和#{}的区别

    使用#{}时,mybatis会生成preparedStatment,并将#{}内容赋给对应的?,实际上是通过setXXX()来赋值。
    使用 时 , 会 将 {}时,会将 {}中的内容注入到sql语句中,例如在使用order by ${} 中可以指定一个排序的列名。

  2. Xml映射文件中,处理增删改查的标签之外,还有哪些标签
    《resultMap》,《parameterMap》,《sql》,《include》,《selectKey》
    加上9个动态sql的标签《trim》,《if》,《choose》,《when》,《otherwise》,《set》,《where》,《foreach》,《bind》

  3. 最佳实践中,通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
    Dao接口和XML的连接是通过XML中的namespace中的指定接口的路径(注意路径一定要具体到在哪儿包下的哪个接口),Dao中的方法名作为XML中的id,方法中的参数作为xml中的sql语句中所需的参数。在mybatis中一般用来创建dao的方式是接口+XML,因为接口没有实现类,所以在调用接口方法时,会根据相应的映射,方法名来找到对应的sql语句来执行。
    Dao中的方法当参数不同时,是不能重载的,因为在调用xml中的哪个标签是通过方法名和ID来进行的,和参数无关,所以不能进行重载。
    Dao接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口方法,转而执行MappedStatement所代表的sql,然后将sql执行结果返回。

  4. 简述Mybatis的插件运行原理,以及如何编写一个插件。
    MyBatis简可以写parameterHandler,resultSethandler,statementHandler,executor这四个接口的插件。MyBatis使用JdK的动态代理,为需要拦截的接口生成代理对象来实现接口方法的拦截功能,一旦执行这四个接口时就会进入拦截方法,也就是InvocationHandler中的invoke方法,只拦截你指定的方法。
    如何编写插件:
    实现MyBatis的Interceptor接口病重写intercept()方法,指定要拦截的哪个方法即可。

  5. Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
    主要的作用就是使我们在xml中以标签的形式编写动态的sql,完成逻辑判断和sql的拼接的过程
    MyBatis提供9中动态的sql标签。
    《trim》,《if》,《choose》,《when》,《otherwise》,《set》,《where》,《foreach》,《bind》
    执行原理:
    使用ognl从sql参数对象中计算表达式的值,根据表达式的值动态的拼接sql,从而完成动态sql的功能。

  6. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
    第一种是使用《resultMap》标签,然后将列名和属性名进行映射
    第二种是使用sql列的别名功能
    有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

  7. Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
    不同的Xml映射文件中,如果配置了namespace,那么id是可以重复的,如果没有配置namespace的话id是不可以重复。
    因为在Xml中的key是通过namespace+id来决定的,如果没有重写namespace时,id重复的话就会导致key不是唯一的了,所以id能不能重复最关键是否配置namespace.

  8. Mybatis都有哪些Executor执行器?它们之间的区别是什么?
    MyBatis有三种基本的Executor执行器,simpleExecutor,reuseExecutor,batchExecutor
    simpleExecutor:每执行一次update或select,就开启一个statement对象,用完立刻关闭statement.
    reuseExecutor:执行update和select,以sql作为key查找statement对象,存在就使用,不存在就创建,用完后,不关闭statement对象,而是放置在map,这样就可以重复使用了。
    batchExecutor:执行update(没有select,JDBC批处理不支持select),将所有的sql都添加到批处理中(addBatch),等待统一执行。

  9. 简述Mybatis的Xml映射文件和Mybatis内部数据结构之间的映射关系?
    MyBatis将所有xml的配置信息都封装在configuration的内部。在xml映射文件中,《parameterMap》标签会被解析为ParameterMao对象,其每个子元素会被解析为parameterMapping对象。《resultMap》同理,每一个《select》,《delete》,《insert》,《update》 标签会被解析成mappedStatement对象,标签内的sql会被解析为boundsql对象。

  10. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
    Hibernate属于全自动ORM映射工具,使用Hibernate查询关联对象或者关联集合对象时,可以根据对象关系迷行直接获取,所以是全自动的,而MyBatis在查询关联对象或关联集合对象时,需要手动编写的sql来完成,所以,称之为半自动化的ORM映射。

你可能感兴趣的:(MyBatis的重点和面试常问的问题)