职场面试题总结(23)---MyBatis的接口绑定、接口绑定实现方式、MyBatis实现一对一、MyBatis里面的动态Sql、Mybatis的Xml映射文件

113 阅读4分钟

1、MyBatis的接口绑定

接口映射就是在MyBatis中任意定义接口,然后把接口里面的方法和SQL语句绑定,使用时直接调用接口方法就可以,这样比原来的SqlSession提供的方法可以有更加灵活的选择和设置。

2、接口绑定实现方式

接口绑定有两种实现方式, (1)通过注解绑定,就是在接口的方法上面加上@Select@Update 等注解里面包含Sql 语句来绑定。

(2)通过xml里面写SQL来绑定,在这种情况下,要指定xml映射文件里面的namespace必须为接口的全路径名。

3、注解绑定与xml绑定使用情况

当Sql 语句相对简单时,用注解绑定; 当SQL语句相对复杂时,用xml绑定,一般用xml绑定的比较多。

4、MyBatis实现一对一有几种方式?具体怎么操作的?

联合查询是几个表联合查询,只查询一次,通过在resultMap里面配置 association节点配置一对一的类就可以完成; 嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过association配置,但另外一个表的查询通过select属性配置。

5、Mybatis可以执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?

可以,Mybatis不仅可以执行一对一、一对多的关联查询,还可以执行多对一,多对多的关联查询,多对一查询,其实就是一对一查询,只需要把 selectOne()修改为selectList()即可;多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectlist()即可。 关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回主对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的属性值,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以把主对象和其关联对象查出来。

6、MyBatis里面的动态Sql是怎么设定的?用什么语法?

MyBatis 里面的动态Sql一般是通过if节点来实现,通过OGNL语法来实现,但是如果要写的完整,必须配合where,trim节点,where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and 或or开始,那么会自动把这个and或者or取掉。

7、Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

(1)使用标签,逐一定义列名和对象属性名之间的映射关系。

(2)使用sql列的别名功能,将列别名书写为对象属性名,比如TNAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

8、通常一个Xml映射文件,都会写一个Dao接口与之对应,Dao的工作原理,是否可以重载?

不能重载,因为通过Dao寻找Xml对应的sql的时候全限名+方法名的保存和寻找策略。接口工作原理为jdk动态代理原理,运行时会为dao生成proxy,代理对象会拦截接口方法,去执行对应的sql返回数据。

9、Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?

不同的Xml映射文件,如果配置了namespace,那么id可以重复;如果没有配置namespace,那么id不能重复; namespace不是必须的,只是最佳实践而已。原因就是namespace+id是作为Map<String,MappedStatement>的key使用的,如果没有namespace,就剩下id,那么,id 重复会导致数据互相覆盖。有了namespace, id就可以重复,namespace不同,namespace+id自然也就不同。

10、Mybatis中如何执行批处理?

使用BatchExecutor完成批处理。