Mybatis

目录

1.mybatis的优缺点

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

3.分页插件的原理是什么?

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

5.Mybatis 动态 SQL 有什么用? 执行原理?有哪些动态sql?

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

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

8.MyBatis 实现一对多有几种方式,怎么操作的?

9.Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

10.Mybatis 的一级和二级缓存

11.什么是 MyBatis 的接口绑定?有哪些实现方式?

12.使用 MyBatis 的 mapper 接口调用时有哪些要求


1.mybatis的优缺点

1.基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在
2.XML 里,解除 sql 与程序代码的耦合,便于统一管理;提供 XML 标签, 支持编写动态 SQL 语句, 并可重用。
3.与 JDBC 相比,减少了 50%以上的代码量,消除了 JDBC 大量冗余的代码,不需要手动开关连接;
4.能够与 Spring 很好的集成;

缺点:

1.SQL 语句的编写工作量较大, 尤其当字段多、关联表多时, 对开发人员编写SQL 语句的功底有一
定要求。
 2、SQL 语句依赖于数据库, 导致数据库移植性差, 不能随意更换数据库。

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

mybatis处理#{}会将#{}替换成?的形式,会先进行预编译处理,然后再调用PreparedStatement 的 set 方法来赋值;
处理${}的时候会把${}替换成变量的值。然后进行字符串拼接。它其实用的是Statement这个对象,这种会有sql注入的风险。

3.分页插件的原理是什么?

使用的是aop的思想,就是当我们执行sql之前给我们进行拦截一下,根据我们传入的当前页和每一页的长度。给我们拼接上limit

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

第一种是使用<resultMap>标签,自定义数据库列名和对象属性名之间 的映射关系。 
第二种是使用<resultType>标签和 SQL 列的别名功能,将列的别名书写为对象属性名。 有了列名与属性名的映射关系后,
Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的

5.Mybatis 动态 SQL 有什么用? 执行原理?有哪些动态sql?

根据我们传入的值,完成逻辑判断并动态拼接 sql 的功能。
Mybatis 提供了 9 种动态 sql 标签:trim | where | set | foreach | if | choose | when | otherwise | bind

Xml 映射文件中,除了常见的 select|insert|update|delete 标签之外,还有哪些标签?
<resultMap>.<parameterMap>.<sql>.<include>.<selectKey>,加上 动态 sql 的 9 个标签,其中<sql>为 sql 片段标签,
通过<include>标签引入 sql 片段,<selectKey>为不支持自增的主键生成策略标签。

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

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

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

有联合查询和嵌套查询,联合查询是几个表联合查询,只查询一次, 通过在 resultMap 里 面配置 association 节点配置一对一的类就可以完成; 

嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过 association 配置,
但另外一个表的查询通过 select 属性配置。

8.MyBatis 实现一对多有几种方式,怎么操作的?

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

9.Mybatis 是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持 association 关联对象和 collection 关联集合对象的延迟加载,
association 指的就是一对一,collection 指的就是一对多查询。
在 Mybatis 配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false。
它的原理是,使用 CGLIB 创建目标对象的代理对象,当调用目标方法时, 进入拦截器方法。执行事先准备好的sql

10.Mybatis 的一级和二级缓存

一级缓存是sqlSession级别的 它默认是开启的 保存的是一次回话的数据,如果这次回话的通道关闭,缓存就会清空。

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的

11.什么是 MyBatis 的接口绑定?有哪些实现方式?

第一种是通过注解绑定,就是在接口的方法上面加 上 @Select.@Update 等注解,里面包含 Sql 语句来绑定
另外一种就是通过 xml 里面写 SQL 来绑定, 在这种情况下,要指定xml 映射文件里面的 namespace 必须为接口的全路径名

12.使用 MyBatis 的 mapper 接口调用时有哪些要求

Mapper.xml 文件中的 namespace 即是 mapper 接口的全限定类名。
Mapper 接口方法名和 mapper.xml 中定义的每个sql的id相同;
Mapper 接口方法的输入参数类型和 mapper.xml 中定义的每个 sql 的 parameterType 的类型相同;
Mapper 接口方法的输出参数类型和 mapper.xml 中定义的每个 sql 的 resultType 的类型相同;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值