经典Mybati面试题


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

注:这道题是面试官面试我同事的。

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

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

注:这道题是京东面试官面试我时问的。

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

3、最佳实践中,通常一个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对象。

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

注:我出的

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

面试题看似都很简单,但是想要能正确回答上来,必定是研究过源码且深入的人,而不是仅会使用的人或者用的很熟的人,以上所有面试题及其答案所涉及的内容,在我的Mybatis系列博客中都有详细讲解和原理分析。


1.Mybatis比IBatis比较大的几个改进是什么

a.有接口绑定,包括注解绑定sql和xml绑定Sql ,

b.动态sql由原来的节点配置变成OGNL表达式,

c. 在一对一,一对多的时候引进了association,在一对多的时候引入了collection

节点,不过都是在resultMap里面配置2.什么是MyBatis的接口绑定,有什么好处

接口映射就是在IBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,

我们直接调用接口方法就可以,这样比起原来了SqlSession提供的方法我们可以有更加灵活的选择和设置.

3.接口绑定有几种实现方式,分别是怎么实现的?

接口绑定有两种实现方式,一种是通过注解绑定,就是在接口的方法上面加上

@Select@Update等注解里面包含Sql语句来绑定,另外一种就是通过xml里面写SQL来绑定,

在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名

4.什么情况下用注解绑定,什么情况下用xml绑定

Sql语句比较简单时候,用注解绑定,

SQL语句比较复杂时候,用xml绑定,一般用xml绑定的比较多5.MyBatis实现一对一有几种方式?具体怎么操作的

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,

通过在resultMap里面配置association节点配置一对一的类就可以完成;

嵌套查询是先查一个表,根据这个表里面

的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表

的查询通过select属性配置6.MyBatis实现一对多有几种方式,怎么操作的

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面配

置collection节点配置一对多的类就可以完成;

嵌套查询是先查一个表,根据这个表里面的

结果的外键id,去再另外一个表里面查询数据,也是通过配置collection,但另外一个表的

查询通过select节点配置7.MyBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完

整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插

入,trim节点是用来判断如果动态语句是以andor开始,那么会自动把这个and或者or

8.IBatis和MyBatis在核心处理类分别叫什么 IBatis里面的核心处理类交SqlMapClient,

MyBatis里面的核心处理类叫做SqlSession 9.IBatis和MyBatis在细节上的不同有哪些

sql里面变量命名有原来的#变量# 变成了#{变量} 原来的$变量$变成了${变量},

原来在sql节点里面的class都换名字交type 原来的queryForObject queryForList 变成了selectOne selectList

原来的别名设置在映射文件里面放在了核心配置文件里10.讲下MyBatis的缓存

MyBatis的缓存分为一级缓存和二级缓存, 一级缓存放在session里面,默认就有,二级缓存放在它的命名空间里,默认是打开的,

使用二级缓存属性类需要实现Serializable序列化接

口(可用来保存对象的状态),可在它的映射文件中配置11.MyBatis(IBatis)的好处是什么

ibatis把sql语句从Java源程序中独立出来, 放在单独的XML文件中编写,给程序的维护带来了很大便利。

ibatis封装了底层JDBC API的调用细节,并能自动将结果集转换成Java Bean对象,

大大简化了Java数据库编程的重复工作。 因为Ibatis需要程序员自己去编写sql语句,

程序员可以结合数据库自身的特点灵活控制sql语句,

因此能够实现比hibernate等全自动orm框架更高的查询效率,能够完成复杂查询。.




你可能感兴趣的:(java,Java)