关于mybatis:25道mybatis面试题一次性打包给你

40次阅读

共计 6041 个字符,预计需要花费 16 分钟才能阅读完成。

关注“Java 后端技术全栈”

回复“面试”获取全套面试材料

1.JDBC 有几个步骤?

JDBC 大抵能够分为六个步骤:

  1. 加载驱动程序
  2. 取得数据库连贯
  3. 创立一个 Statement 对象
  4. 操作数据库,实现增删改查
  5. 获取后果集
  6. 敞开资源

2. 什么是 Mybatis?

如果在面试的时候被问到,只有你说出上面三种即可:

MyBatis 是一款优良的长久层框架,它反对自定义 SQL、存储过程以及高级映射。

MyBatis 罢黜了简直所有的 JDBC 代码以及设置参数和获取后果集的工作。

MyBatis 能够通过简略的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,一般老式 Java 对象)为数据库中的记录。

——来自官网。举荐大家依照官网的来答复。

3. 什么是 ORM?

全称为 Object Relational Mapping。对象 - 映射 - 关系型数据库。对象关系映射(简称 ORM,或 O /RM,或 O /R mapping),用于实现面向对象编程语言里不同类型零碎的数据之间的转换。简略的说,ORM 是通过应用形容对象和数据库之间映射的元数据,将程序中的对象与关系数据库互相映射。

ORM 提供了实现长久化层的另一种模式,它采纳映射元数据来形容对象关系的映射,使得 ORM 中间件能在任何一个利用的业务逻辑层和数据库层之间充当桥梁。

4. 说说 ORM 的优缺点

「长处」1. 进步了开发效率。因为 ORM 能够主动对 Entity 对象与数据库中的 Table 进行字段与属性的映射,所以咱们理论可能曾经不须要一个专用的、宏大的数据拜访层。2.ORM 提供了对数据库的映射,不必 sql 间接编码,可能像操作对象一样从数据库获取数据。

「毛病」就义程序的执行效率和会固定思维模式,升高了开发的灵活性。

从系统结构上来看,采纳 ORM 的零碎个别都是多层零碎,零碎的档次多了,效率就会升高。ORM 是一种齐全的面向对象的做法,而面向对象的做法也会对性能产生肯定的影响。

在咱们开发零碎时,个别都有性能问题。性能问题次要产生在算法不正确和与数据库不正确的应用上。

ORM 所生成的代码个别不太可能写出很高效的算法,在数据库利用上更有可能会被误用,次要体现在对长久对象的提取和和数据的加工解决上,如果用上了 ORM, 程序员很有可能将全副的数据提取到内存对象中,而后再进行过滤和加工解决,这样就容易产生性能问题。

在对对象做长久化时,ORM 个别会长久化所有的属性,有时,这是不心愿的。但 ORM 是一种工具,工具的确能解决一些反复,简略的劳动。这是不可否认的。但咱们不能指望工具能一劳永逸的解决所有问题,有些问题还是须要非凡解决的,但须要非凡解决的局部对绝大多数的零碎,应该是很少的。

5. 说说 Mybaits 的优缺点

长处

① 基于 SQL 语句编程,相当灵便,不会对应用程序或者数据库的现有设计造成任何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于对立治理;提供 XML 标签,反对编写动静 SQL 语句,并可重用。

② 与 JDBC 相比,缩小了 50% 以上的代码量,打消了 JDBC 大量冗余的代码,不须要手动开关连贯;

③ 很好的与各种数据库兼容(因为 MyBatis 应用 JDBC 来连贯数据库,所以只有 JDBC 反对的数据库 MyBatis 都反对)。

④ 可能与 Spring 很好的集成;

⑤ 提供映射标签,反对对象与数据库的 ORM 字段关系映射;提供对象关系映射标签,反对对象关系组件保护。

毛病

① SQL 语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写 SQL 语句的功底有肯定要求。

② SQL 语句依赖于数据库,导致数据库移植性差,不能随便更换数据库。

MyBatis 框架实用场合:

(1)MyBatis 专一于 SQL 自身,是一个足够灵便的 DAO 层解决方案。

(2)对性能的要求很高,或者需要变动较多的我的项目,如互联网我的项目,MyBatis 将是不错的抉择。

6.Mybatis 是如何进行分页的?

Mybatis 应用 RowBounds 对象进行分页,它是针对 ResultSet 后果集执行的内存分页,而非物理分页,先把数据都查出来,而后再做分页。

能够在 sql 内间接书写带有物理分页的参数来实现物理分页性能,也能够应用分页插件来实现物理分页。

7. 分页插件的基本原理是什么?

分页插件的基本原理是应用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦挡办法内拦挡待执行的 sql,而后重写 sql(SQL 拼接 limit),依据 dialect 方言,增加对应的物理分页语句和物理分页参数,用到了技术 JDK 动静代理,用到了责任链设计模式。

8. 简述 Mybatis 的插件运行原理?

Mybatis 仅能够编写针对 ParameterHandler、ResultSetHandler、StatementHandler、Executor 这 4 种接口的插件,Mybatis 应用 JDK 的动静代理,为须要拦挡的接口生成代理对象以实现接口办法拦挡性能,每当执行这 4 种接口对象的办法时,就会进入拦挡办法,具体就是 InvocationHandler 的 invoke()办法,当然,只会拦挡那些你指定须要拦挡的办法。

9. 如何编写一个插件?

编写插件:实现 Mybatis 的 Interceptor 接口并复写 intercept()办法,而后再给插件编写注解,指定要拦挡哪一个接口的哪些办法即可,最初在配置文件中配置你编写的插件。举荐:倡议珍藏,mybatis 插件原理详解

10.Mybatis 动静 sql 有什么用?

Mybatis 动静 sql 能够在 Xml 映射文件内,以标签的模式编写动静 sql,执行原理是依据表达式的值实现逻辑判断 并动静调整 sql 的性能。

Mybatis 提供了 9 种动静 sql 标签:trim | where | set | foreach | if | choose | when | otherwise | bind

11.Xml 映射文件中有哪些标签?

除了常见的 select|insert|updae|delete 标签之外,还有:

<resultMap><parameterMap><sql><include><selectKey>,加上动静 sql 的 9 个标签,其中 <sql> 为 sql 片段标签,通过 <include> 标签引入 sql 片段,<selectKey>为不反对自增的主键生成策略标签。

12.Mybatis 是否反对提早加载?

Mybatis 仅反对 association 关联对象和 collection 关联汇合对象的提早加载,association 指的就是一对一,collection 指的就是一对多查问。在 Mybatis 配置文件中,能够配置是否启用提早加载lazyLoadingEnabled=true|false

13. 提早加载的基本原理是什么?

提早加载的基本原理是,应用 CGLIB 创立指标对象的代理对象,当调用指标办法时,进入拦截器办法。

比方调用 a.getB().getName(),拦截器 invoke() 办法发现 a.getB()是 null 值,那么就会独自发送当时保留好的查问关联 B 对象的 sql,把 B 查问上来,而后调用 a.setB(b),于是 a 的对象 b 属性就有值了,接着实现a.getB().getName() 办法的调用。

当然了,不光是 Mybatis,简直所有的包含 Hibernate,反对提早加载的原理都是一样的。

14.mapper.xml 文件对应的 Dao 接口原理是?

简略说:应用了 JDK 动静代理和反射,把接口和 xml 绑定在一起而搞定的。

15.Dao 接口里的办法,参数不同时能重载吗?

不能重载。

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

${}是字符串替换,#{}是预处理;

Mybatis 在解决时,就是把 {} 间接替换成变量的值。而 Mybatis 在解决 #{}时,会对 sql 语句进行预处理,将 sql 中的#{}替换为? 号,调用 PreparedStatement 的 set 办法来赋值;

应用 #{}能够无效的避免 SQL 注入,进步零碎安全性。

17.Mybatis 执行批量插入,能返回数据库主键列表吗?

1、对于反对生成自增主键的数据库:减少 useGenerateKeys 和 keyProperty,<insert>标签属性。

2、不反对生成自增主键的数据库:应用<selectKey>

形式:

<insert id="insertAuthor" useGeneratedKeys="true"
    keyProperty="id">
  insert into Author (username, password, email, bio) values
  <foreach item="item" collection="list" separator=",">
    (#{item.username}, #{item.password}, #{item.email}, #{item.bio})
  </foreach>
</insert>

留神 Mybatis 的版本,官网在这个 3.3.1 版本中退出了批量新增返回主键 id 的性能。

18. 不同的 Xml 映射文件,id 是否能够反复?

不同的 Xml 映射文件,如果配置了 namespace,那么 id 能够反复;如果没有配置 namespace,那么 id 不能反复;毕竟 namespace 不是必须的,只是最佳实际而已。

起因就是 namespace+id 是作为 Map<String, MappedStatement> 的 key 应用的,如果没有 namespace,就剩下 id,那么,id 反复会导致数据相互笼罩。有了 namespace,天然 id 就能够反复,namespace 不同,namespace+id 天然也就不同。

19.Mybatis 中 Executor 执行器的区别是?

Mybatis 有三种根本的 Executor 执行器,「SimpleExecutor、ReuseExecutor、BatchExecutor。」

SimpleExecutor:每执行一次 update 或 select,就开启一个 Statement 对象,用完立即敞开 Statement 对象。

ReuseExecutor:执行 update 或 select,以 sql 作为 key 查找 Statement 对象,存在就应用,不存在就创立,用完后,不敞开 Statement 对象,而是搁置于 Map<String, Statement> 内,供下一次应用。简言之,就是重复使用 Statement 对象。

BatchExecutor:执行 update(没有 select,JDBC 批处理不反对 select),将所有 sql 都增加到批处理中(addBatch()),期待对立执行(executeBatch()),它缓存了多个 Statement 对象,每个 Statement 对象都是 addBatch()结束后,期待逐个执行 executeBatch()批处理。与 JDBC 批处理雷同。

作用范畴:Executor 的这些特点,都严格限度在 SqlSession 生命周期范畴内。

20. 为什么说 Mybatis 是半自动 ORM 映射工具?

Hibernate 属于全自动 ORM 映射工具,应用 Hibernate 查问关联对象或者关联汇合对象时,能够依据对象关系模型间接获取,所以它是全自动的。

而 Mybatis 在查问关联对象或关联汇合对象时,须要手动编写 sql 来实现,所以,称之为半自动 ORM 映射工具。

(2)Mybatis 间接编写原生态 sql,能够严格控制 sql 执行性能,灵便度高,非常适合对关系数据模型要求不高的软件开发,因为这类软件需要变动频繁,一但需要变动要求迅速输入成绩。然而灵便的前提是 mybatis 无奈做到数据库无关性,如果须要实现反对多种数据库的软件,则须要自定义多套 sql 映射文件,工作量大。

(3)Hibernate 对象 / 关系映射能力强,数据库无关性好,对于关系模型要求高的软件,如果用 hibernate 开发能够节俭很多代码,提高效率。

其实对于常见 ORM 框架还设有 Spring 的 JPA,前期的面试可能会更偏向于问 JPA 和 Mybatis 的区别了。心愿大家注意点。

21.Mybatis 全局配置文件中有哪些标签?

configuration 配置

properties 属性: 能够加载

properties 配置文件的信息

settings 设置:能够设置 mybatis 的全局属性

typeAliases 类型命名

typeHandlers 类型处理器

objectFactory 对象工厂

plugins 插件

environments 环境

environment 环境变量

transactionManager 事务管理器

dataSource 数据源

mappers 映射器

22. 当实体类中的属性名和表中的字段名不一样时怎么办?

第 1 种:通过在查问的 sql 语句中定义字段名的别名,让字段名的别名和实体类的属性名统一。

<select id="selectById" resultMap="User">
        select id, name as userName, pwd as password from m_user
        <where>
            <if test="id != null">
                id = #{id}
            </if>
        </where>
    </select>

第 2 种:通过 <resultMap> 来映射字段名和实体类属性名的一一对应的关系。

第 3 种:应用注解时候,应用 Result,和第二种相似。

23. 含糊查问 like 语句该怎么写?

第 1 种:在 Java 代码中增加 sql 通配符。

String wildcardname =“%smi%”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like #{value}
</select>

第 2 种:在 sql 语句中拼接通配符,会引起 sql 注入

String wildcardname =“smi”;
list<name> names = mapper.selectlike(wildcardname);
<select id=”selectlike”>
select * from foo where bar like "%"#{value}"%"
</select>

24.Mybatis 构建步骤?

整体步骤:

25. 简述一下 Mybatis 的手动编程步骤?

  1. 创立 SqlSessionFactory
  2. 通过 SqlSessionFactory 创立 SqlSession
  3. 通过 sqlsession 执行数据库操作
  4. 调用 session.commit()提交事务
  5. 调用 session.close()敞开会话

25.Mybatis 工作的流程是?

Mybatis 工作流程能够大抵分为四个步骤:

正文完
 0