Mtbatis系列常见面试问题(二)

MyBatis 实现一对一有几种方式?具体怎么操作的?
:有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次,通过在resultMap里面,配置association借点配置一对一的类就可以完成。嵌套查询是先查一个表,根据这个表里面的结果的外键id,去在另外一个表里面查询数据,也是通过association配置,单另外一个表的查询通过select熟悉配置。

Mybatis 能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
:能,Mybatis不仅可以知晓一对一,一对多的关联查询,还可以知晓多对一,多对多的关联查询,多对一查询,其实就是一对一查询,值需要把selectOne()修改为selectList()即可:

多对多查询,其实就是一对多查询,只需要把selectOne()修改为selectList即可。

关联对象查询,有两种实现方式,一种是单独发送一个sql去查询关联对象,赋给主对象,然后返回朱对象。另一种是使用嵌套查询,嵌套查询的含义为使用join查询,一部分列是A对象的熟悉只,另外一部分列是关联对象B的属性值,好处是只发一个sql查询,就可以吧主对象和其他关联对象查出来。

MyBatis 里面的动态 Sql 是怎么设定的?用什么语法?
Mtbatis里面的动态sql,一般是通过id节点来实现,通过OGNL与否来实现,但是如果要写得完整,必须配合where,trim节点,

where节点是判断包含节点有内容就插入where,否则不插入,trim节点是用来判断如果动态语句是以and或or开始,那么会自动把这个and或者or

去掉。

Mybatis 是如何将 sql 执行结果封装为目标对象并返回的?都有哪些映射形式?
:第一种,是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。

第二种,是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写

但是列名是不区分大小写,Mybatis会忽略列名大小写,智能找到预支对应对象属性名,你甚至可以写成T_NAME AS NaMe ,

Mybatis一样可以正常工作,

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

完成赋值的。

Xml 映射文件中,除了常见的 select|insert|updae|delete 标签之外,还有哪些标签?
还有很多其他的标签, <resultMap><parameterMap><sql><include>
<selectKey>,加上动态 sql 9 个标签,
trim|where|set|foreach|if|choose|when|otherwise|bind 等,其中<sql>sql 片段标签,通
<include>标签引入 sql 片段, <selectKey>为不支持自增的主键生成策略标签。
当实体类中的属性名和表中的字段名不一样,如果将查询的结果封装到指定 pojo
1)通过在查询的 sql 语句中定义字段名的别名。
2)通过<resultMap>来映射字段名和实体类属性名的一一对应的关系。
通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应, Dao 的工作原理,是否可以重
载?
不能重载,因为通过 Dao 寻找 Xml 对应的 sql 的时候全限名+方法名的保存和寻找策
略。接口工作原理为 jdk 动态代理原理,运行时会为 dao 生成 proxy,代理对象会拦截接口
方法,去执行对应的 sql 返回数据。

持续更新ing-----23






猜你喜欢

转载自www.cnblogs.com/dayandday/p/10832696.html