Mybatis常见面试题

导读:本篇文章讲解 Mybatis常见面试题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Java常见面试题_2022最新版

序号 内容 链接
1 Java基础面试题 https://blog.csdn.net/weixin_46030002/article/details/126399353
2 Java集合容器面试题 https://blog.csdn.net/weixin_46030002/article/details/126425298
3 Java线程面试题 https://blog.csdn.net/weixin_46030002/article/details/126518395
4 Java异常面试题 https://blog.csdn.net/weixin_46030002/article/details/126482778
5 Spring常见面试题 https://blog.csdn.net/weixin_46030002/article/details/127281194
6 SpringMVC常见面试题 https://blog.csdn.net/weixin_46030002/article/details/127057785
7 Mybatis常见面试题 https://blog.csdn.net/weixin_46030002/article/details/126026561
8 MySQL常见面试题 https://blog.csdn.net/weixin_46030002/article/details/126557564
9 Redis常见面试题 https://blog.csdn.net/weixin_46030002/article/details/126435834
  • Java常见面试题_2022最新版持续更新中…


Mybatis官网

Mybatis官网


一、基本概念了解

什么是动态SQL

动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句

什么是ORM映射

ORM(Object/Relational Mapping)即对象关系映射,是一种数据持久化技术。它在对象模型和关系型数据库直接建立起对应关系,并且提供一种机制,通过JavaBean对象去操作数据库表的数据。 MyBatis通过简单的XML或者注解的方式进行配置和原始映射,将实体类和SQL语句之间建立映射关系,是一种半自动(之所以说是半自动,因为我们要自己写SQL)的ORM实现。

什么是数据持久化?

数据持久化是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。例如,文件的存储、数据的读取等都是数据持久化操作。数据模型可以是任何数据结构或对象的模型、XML、二进制流等。 当我们编写应用程序操作数据库,对表数据进行增删改查的操作的时候就是数据持久化的操作。


二、常见面试题

什么是Mybatis框架 / 说说对于Mybatis框架的了解

官方是这么给我们解释的:
在这里插入图片描述

  • Mybatis是一个半自动的ORM(对象关系型映射)框架,它内部封装了JDBC,开发者开发时只需要关注如何编写SQL语句,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程,可以严格控制 sql 执行性能,灵活度高。
  • MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了
    几乎所有的 JDBC 代码和手动设置参数以及获取结果集。

Mybaits的优缺点:

  • 优点
    • 与原生的JDBC相比,较少了大量的冗余代码,不需要手动的创建并销毁连接
    • SQL语句相当灵活,不会对现有的应用程序和数据库表的现有设计造成影响,SQL写在xml映射文件中,实现了与程序代码间的解耦,便于统一管理;支持动态SQL,并且可以重用
    • 对于很多数据库都兼容
    • 与Spring框架能很好的集成
    • 提供了映射标签,支持对象与数据库字段的映射(ORM)
  • 缺点
    • SQL语句编写工作量大,尤其对于多字段、多表的情况下,对于开发人员SQL语句功底有要求
    • SQL语句语法依赖于数据库,导致数据库移植性差,不能随意更换数据库

常用的动态SQL标签有哪些

  • <if>
  • <choose>,<when>,<otherwise>
  • <where>
  • <set>
  • <foreach>
  • <trim>
  • <bind>

#{} 和 ${} 的区别

  • ${} 采用的是值的拼接,就是字符串替换,在使用时需要使用 '' 单引号,如:
    select * from user where username= '${username}'
    
  • #{} 采用的是预编译的方式,将参数设置到 sql 语句中,就是将 sql 中的 #{} 替换成 ? 号,然后调用 PreparedStatement 的 set 方法来赋值.
    select * from user where username= #{username}
    

    使用 #{} 可以有效的防止 SQL 注入,提高系统安全性

使用场景

  • #{} 参数传递
  • ${} 如果要对表名、列名进行动态设置,只能使用 ${} 进行SQL拼接

resultMap 和 resultType 的区别

关于 resultType 和 resultMap 官方给我们的是如下解释:
在这里插入图片描述
无论是 resultType 还是 resultMap 都是 <select> 节点/元素/标签 的一个属性,且这个 <select> 节点两个属性不能同时存在,它们两个属性都是用来设置 Mybatis 查询结果集的数据类型,并且此属性的值必须和持久层接口中对应抽象方法的返回值类型一致或者为集合包含的类型。

  • 如果返回值为基本数据类型,使用 resultType(如:int)
  • 如果返回值为引用类型
    • 返回的为简单的引用类型,使用 resultType(如:String,或者某一个具体的实体类型【一般为对单表的查询】),当然需要注意的一点是,返回值为引用类型,这里需要写全限定名。
    • 返回的为复杂的引用类型,使用 resultMap,属性值为外部 resultMap节点的命名的引用(即id的值),一般用于多表关联查询的结果集

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

顶级元素:

  • <resultMap> 封装/描述复杂的结果集映射对象
  • <sql> 可被其它语句引用的可重用语句块。
  • <cache> 该命名空间的缓存配置,用于开启二级缓存。
  • <cache-ref> 引用其它命名空间的缓存配置。
  • <parameterMap> 参数映射,已过时,基本不会被使用,以后可能被移除

当实体类中的属性名和表中的字段名不一致,怎么办

  • 第1种: 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
  • 第2种: 通过来映射字段名和实体类属性名的一一对应的关系。

如何获取自动生成的(主)键值?

首先,如果你的数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),那么你可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置为目标属性就 OK 了。

Mybatis的一级、二级缓存:

在这里插入图片描述

  • 一级缓存:SqlSession级别
    • 在操作数据库时,SqlSessionFactory会创建一个SqlSession对象,这个对象中有一个数据结构(HashMap)用于存储缓存数据。不同的SqlSession之间的缓存数据不共享。
      在这里插入图片描述
      public class PerpetualCache implements Cache {
      	private final String id;
      	// 由此可见缓存底层实际封装的就是一个HashMap
          private final Map<Object, Object> cache = new HashMap();
          // ...
          public void clear() {
              this.cache.clear();
          }
      }
      
    • 一级缓存是默认开启的
    • SqlSession是Mybatis工作的最顶层的API会话接口,所有的数据库操作都是经由它来实现的,由于它是一个会话,所以SqlSession存活在一个业务请求中,对应着一次数据库会话(同一个事务),每次访问数据库都会重新创建它。
      • 如果同一个事务中有多条查询的SQL语句,这些会保存到缓存中
      • 如果同一个事务,有增(insert),删(delete),改(update)操作,那么之前的查询的所有缓存会被清空
  • 二级缓存:mapper/namespace级别
    • 二级缓存是默认关闭的
    • 二级缓存是由多个SqlSession会话对象共享,SqlSession会话结束缓存依然存在,我们在调用查询语句时,会先从二级缓存中查找是否有对应缓存,然后在从一级缓存中查找是否有对应缓存。
    • 和一级缓存一样,如果出现增(insert),删(delete),改(update)操作,那么之前的查询的所有缓存会被清空

Mybatis 持久层接口传递多个参数,如何获取 ?

  • @Param
  • arg0,arg1…
  • param1,param2

当使用 Mybatis 时,持久层mapper接口中传递多个参数,Mybatis 会将这些参数放在一个Map集合中,这里以 arg0arg1,…,param1params,… 为默认的键,对应的参数为值;当然这里我们也可以使用 @param 注解自定义键,参数为值

一对一、一对多的关联查询 ?


– [x] 持续更新中…

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/107661.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!