您的位置:首页 > 财经 > 产业 > MyBatis常见面试题

MyBatis常见面试题

2024/10/6 14:28:40 来源:https://blog.csdn.net/weixin_65978343/article/details/141002454  浏览:    关键词:MyBatis常见面试题

目录

 1.JDBC概念

2.JDBC的实质

3.什么是sql注入?

4.什么方法可以解决sql注入?

5.ORM框架是什么

6.常见的ORM模型:Mybatis和HIBERNATE

7.为什么要有ORM模型?

8.ORM映射哪些内容?

9.Mybatis和hibernate 区别(面试)

10.JDBC的弊端 

11.MyBatis 解决了jdbc 的问题(重要)

12.什么是MyBatis

13.为什么选择MyBatis(优点)

14.JDBC和MyBatis哪个好?(重要)

15.和其它持久化层技术对比

16.MyBaties生命周期(重要)

17.动态代理

18.MyBatis的增删改查

19.MyBatis获取参数值的方式

20.${} 和#{} 区别?

21.主键回填:

22.使用ResultMap原因?

23.ResultMap映射关键词

24.resultMap 结果集映射的方式

25.级联(cascade),是指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率

26.一对一映射

27.一对多

28.Mybatis 是如何进行分页的?分页插件的原理是什么?

29.动态SQL

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

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

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

33.一次性插入多条数据(面试)

34.模糊查询

35.什么是缓存

36.Mybatis 的一级、二级缓存?

优秀MyBatis总结: 


 1.JDBC概念

JDBC(Java Database Connectivity):是Java访问数据库的解决方案。

2.JDBC的实质

 JDBC 的实质是一种 Java API,为 Java 程序提供连接不同关系型数据库和执行数据库操作的标准统一接口。

3.什么是sql注入?

SQL注入(SQL Injection)是一种网络安全漏洞,允许攻击者在应用程序没有正确验证或清理用户输入数据的情况下,导致攻击者能够操纵数据库查询、获取、修改和删除敏感信息。

4.什么方法可以解决sql注入?

(1)使用预编译语句(prepared Statements):如使用?占位符,并通过编程语言的库绑定参数。

(2)使用存储过程(Stored Procedures):将SQL代码预先存储在数据库中,并通过参数调用

(3)验证和清理用户输入确保用户输入不包含恶意字符或SQL关键字

(4)使用ORM工具许多ORM工具会自动处理SQL构建,减少注入风险。

5.ORM框架是什么

1.ORM模型是数据库的表和简单Java对象(简称POJO)的映射关系模型。

2.主要解决数据库数据和POJO对象的相互映射

6.常见的ORM模型:Mybatis和HIBERNATE

7.为什么要有ORM模型?

  • 因为它能提高开发效率,降低数据库操作的复杂性,增强代码的可维护性和可读性,实现跨数据库平台的兼容性,减少代码错误,便于团队协作。
  • 可以实现类和表的映射、字段和属性的映射、Java数据类型和数据库数据类型映射、对象关系映射、继承关系映射、对象生命周期管理的映射

8.ORM映射哪些内容?

1.类和表的映射在 Java 中定义的类会对应到关系型数据库中的表。例如,定义一个名为 User 的类,它可能会映射到数据库中的 user 表。

2.字段和属性的映射类中的属性会对应到表中的字段。比如,User 类中的 id、name、age 等属性,会分别映射到 user 表中的 id、name、age 字段。

3.Java 数据类型和数据库中的数据类型 Java 中的基本数据类型(如 int、String、double 等)以及引用数据类型(如自定义的类)需要与数据库中的相应数据类型(如 INT、VARCHAR、DOUBLE 等)进行映射。例如,Java 中的 int 类型通常会映射到数据库中的 INT 类型,String 类型可能映射到 VARCHAR 或 TEXT 类型。

4.对象关系的映射:处理对象之间的关联关系,如一对一、一对多、多对多等。比如,一个 Order 类与 OrderItem 类可能存在一对多的关系,在数据库中通过外键来实现这种关联,ORM 框架会负责处理这种关系的映射和数据的同步。

5.继承关系的映射 如果在 Java 中存在类的继承关系,ORM 框架需要确定如何将这种继承关系映射到数据库中。常见的策略有单表继承、每个具体类一张表、类层次表等。

6.对象的生命周期管理:包括对象的创建、读取、更新和删除操作与数据库中的插入、查询、修改和删除操作的映射。通过这些映射,ORM 框架使得开发人员能够以面向对象的方式来操作数据库,而无需直接处理底层的 SQL 语句和数据库细节。

9.Mybatis和hibernate 区别(面试)

1. Hibernate是全自动化ORM; Mybatis是半自动化ORM。

2. Hibernate简化dao层,不用考虑SQL语句的编写和结果映射,重点放在业务逻辑上; Mybatis需要手写SQL语句以及结果映射。

3. Hibernate是一个重量级的框架,内部生成SQL语句,反射操作太多,导致性能下降;            Mybatis是一个轻量级的框架,需要自己写sql语句,有较少的反射操作。

4. Hibernate 不方便做SQL优化,遇到较复杂的SQL语句需要绕过框架实现复杂, 对多字段的结构进行部分映射困难;

  Mybatis 不仅可以做SQL优化还可以SQL与Java分离,还可以自行编写映射关系, 复杂的SQL语句Mybatis效率更高

Mybatis优势: 可以进行更细致的SQL优化;容易掌握

Hibernate优势:dao层开发比mybatis简单,mybatis需要维护SQL和结果映射

        hibernate数据库移植性好

10.JDBC的弊端 

1.代码繁琐需重复编写连接、语句执行、结果集处理等代码。如每次查询都要重复一系列操作流程。

2.存在 SQL 语句硬编码降低代码可读性和可维护性,数据库结构变化时修改困难。

3.类型转换复杂从结果集获取数据时手动类型转换易出错。

4.缺乏对象映射,不能直接将数据映射为对象,手动赋值易导致数据不一致。

5.有数据库特定代码,不同数据库差异可能导致大量特定处理逻辑。

6.错误处理复杂,要捕获处理各种异常。

总之,由于这些弊端,实际开发中常使用 ORM 框架替代

11.MyBatis 解决了jdbc 的问题(重要)

1.数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。

解决:在SqlMapConfig.xml中配置数据连接池,使用连接池管理数据库链接。

2.Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

解决:将Sql语句配置在XXXXmapper.xml文件中与java代码分离。

3.向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

解决:Mybatis自动将java对象映射至sql语句,通过statement中的parameterType定义输入参数的类型。

4.对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象 解析比较方便。

解决:Mybatis自动将sql执行结果映射至java对象,通过statement中的resultType定义输出结果的类型

12.什么是MyBatis

    MyBatis是一款半自动化ORM模型,支持定制化 SQL、存储过程以及高级映射。可以使用简单的 XML 或注解来配置和映射 原生信息,将接口和 Java 的 POJOS(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录

13.为什么选择MyBatis(优点)

1.灵活性高:允许开发者编写自定义的 SQL 语句,能够精确控制数据的查询和操作逻辑。

2.轻量级:相较于一些全功能的 ORM 框架,MyBatis 的架构较为简单,资源消耗相对较少。

3.性能优化方便:由于可以手动编写 SQL ,能够针对特定的业务场景进行性能优化。

比如通过合理使用索引、分页等技术提高查询效率。

4.映射配置简单:通过简单的配置文件,就能实现 Java 对象与数据库表的映射。

5.易于与其他框架集成:可以很容易地与 Spring 等流行的框架整合,共同构建企业级应用。

6.可读性好:自定义的 SQL 语句更直观,易于理解和维护。

14.JDBC和MyBatis哪个好?(重要)

答:JDBC 和 MyBatis 哪个更好不能一概而论,取决于具体情况。

(1)JDBC 是标准接口,直接使用 SQL 操作,适用于简单小型项目或需精细优化的场景。

(2)MyBatis 简化数据库操作代码,通过配置或注解实现对象关系映射,支持动态 SQL 灵活构建语句。例如复杂条件查询时更方便。

        综上所述:项目规模小、操作简单且追求极致性能和灵活性,JDBC 可能更好。项目复杂、需定制查询并提高效率,MyBatis 可能更合适。选择要根据项目具体情况和团队技术偏好。

15.和其它持久化层技术对比

JDBC

  • SQL 夹杂在Java代码中耦合度高,导致硬编码内伤
  • 维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见
  • 代码冗长,开发效率低

Hibernate 和 JPA

  • 操作简便,开发效率高
  • 程序中的长难复杂 SQL 需要绕过框架
  • 内部自动生产的 SQL,不容易做特殊优化
  • 基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。
  • 反射操作太多,导致数据库性能下降

MyBatis

  • 轻量级,性能出色
  • 开发效率稍逊于HIbernate,但是完全能够接受
  • SQL 和 Java 编码分开,功能边界清晰。Java代码专注业务、SQL语句专注数据

16.MyBaties生命周期(重要)

(1)读取 MyBatis 配置文件:mybatis-config.xml 为 MyBatis 的全局配置文件,配置了 MyBatis 的运行环境等信息,例如数据库连接信息。

(2)加载映射文件。映射文件即 SQL 映射文件,该文件中配置了操作数据库的 SQL 语句, 需要在 MyBatis 配置文件 mybatis-config.xml 中加载。mybatis-config.xml 文件可以 加载多个映射文件,每个文件对应数据库中的一张表。

(3)构造会话工厂:通过 MyBatis 的环境等配置信息构建会话工厂 SqlSessionFactory。

(4)创建会话对象:由会话工厂创建 SqlSession 对象,该对象中包含了执行 SQL 语句的 所有方法。

(5)Executor 执行器:MyBatis 底层定义了一个 Executor 接口来操作数据库,它将根据 SqlSession 传递的参数动态地生成需要执行的 SQL 语句,同时负责查询缓存的维护。

(6)MappedStatement 对象:在 Executor 接口的执行方法中有一个 MappedStatement 类型的参数,该参数是对映射信息的封装,用于存储要映射的 SQL 语句的 id、参数等信息。

(7)输入参数映射:输入参数类型可以是 Map、List 等集合类型,也可以是基本数据类型 和 POJO 类型。输入参数映射过程类似于 JDBC 对 preparedStatement 对象设置参数 的过程。

(8)输出结果映射:输出结果类型可以是 Map、 List 等集合类型,也可以是基本数据类 型和 POJO 类型。输出结果映射过程类似于 JDBC 对结果集的解析过程。

17.动态代理

在接口中有方法的返回值定义,参数的定义,方法名,在sqlMapper.xml 中也对应这接口给予了赋值, 这时候dao的实现类就显得多余,这是Mybatis可以帮助我们自动产生实现类,并可以调取方法得到结 果,这就是Mybatis的mapper动态代理

//动态代理原则       Id和方法名相同,id是不允许重载的

//1.动态代理的返回值要和sqlMapper中的resultType一致

//2.接口中的入参要和sqlMapper中的parmameterType一致

//3.接口中的方法名要和sqlMapper中的id一致(dao层不允许写方法的重载)

//4.sqlMapper中的namespace指向接口的类路径

//5.接口要和sqlMapper同包

//6.接口要和sqlMapper同名

1.SqlSession代表Java程序和数据库之间的会话。(HttpSession是Java程序和浏览器之间的会话)

2.SqlSessionFactory是“生产”SqlSession的“工厂”。

18.MyBatis的增删改查

1、查询的标签select必须设置属性resultType或resultMap,用于设置实体类和数据库表的映射关系

    resultType:自动映射,用于属性名和表中字段名一致的情况

    resultMap:自定义映射,用于一对多或多对一或字段名和属性名不一致的情况

19.MyBatis获取参数值的方式

1.Javabean

2.Map

3.Param数(Param1开始)

4.arg数(arg0开始)

5.@Param

20.${} 和#{} 区别?

${}  字符串的替换  不能防止SQL注入。方式直接将参数值拼接到 SQL 语句中,容易导致 SQL 注入问题,除非确定参数值是完全安全的,否则应尽量避免使用。

#{}  预处理sql语句 ? 占位符 ,preparedStatement进行防止SQL注入。方式使用占位符,由 MyBatis 进行处理和赋值,能有效防止 SQL 注入,是更安全和推荐的方式。

21.主键回填

当主键在数据库中为自增字段时,新增成功后,回填主键。

(新增MyBaties会获取到当前的主键的值,他会回填到逐渐的参数里面去)

自定义映射resultMap

22.使用ResultMap原因?

  1. 处理复杂的数据库结果映射
  2. 处理多表关联查询结果
  3. 处理数据库字段类型和 Java 类型的不匹配
  4. 支持嵌套对象和集合映射
  5. 提高代码的可读性和可维护性

23.ResultMap映射关键词

  resultMap:设置自定义映射属性:

    id:表示自定义映射的唯一标识

    type:查询的数据要映射的实体类的类型子标签:

    id:设置主键的映射关系

    result:设置普通字段的映射关系

    association:设置多对一的映射关系

    collection:设置一对多的映射关系属性:

    property:设置映射关系中实体类中的属性名

    column:设置映射关系中表中的字段名

24.resultMap 结果集映射的方式

 • map 映射方式和 POJO 映射方式

25.级联(cascade),是指多个对象之间的映射关系,建立数据之间的级联关系提高管理效率

26.一对一映射

association

27.一对多

Collection

使用ofType指定集合中的元素的类型

28.Mybatis 是如何进行分页的?分页插件的原理是什么?

    Mybatis 使用 RowBounds 对象进行分页,它是针对 ResultSet 结果集执行的内存分页,而非物理分页。可以在 sql 内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

    分页插件的基本原理是使用 Mybatis 提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的 sql,然后重写 sql,根据 dialect 方言,添加对应的物理分页语句和物理分页参数。

    所有分页的原理都相似,借助mybatis的分页拦截器,拦截查询语句的执行

29.动态SQL

    Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决 拼接SQL语句字符串时的痛点问题。

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

    Mybatis 动态 sql 可以在 Xml 映射文件内,以标签的形式编写动态 sql,执行原理是:根据表达式的值来完成逻辑判断 + 动态拼接 sql 的功能。

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

<!-- Where标签1.当没有任何条件的时候 不会添加where关键词 有条件的时候 会添加一个where关键词2.去掉 where 关键词后面的第一个and-->

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

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

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

    不同的 Xml 映射文件,如果配置了 namespace,那么 id 可以重复;如果没有配 置 namespace,那么 id 不能重复;

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

33.一次性插入多条数据(面试)

//一次性插入多条数据(面试)

        public int addStudentList(List<Student> slist);

<insert id = "addStudentList">

        insert into student(sname,birthday,ssex,classid)

        values

        <foreach collection="list" item="stu" separator=",">

            (#{stu.sname},#{stu.birthday},#{stu.ssex},#{stu.classid})

        </foreach>

    </insert>

34.模糊查询

//模糊查询

public List<Student> findStudentLike(String keyname);

<!-- 模糊查询 -->

    <select id="findStudentLike" resultType="Student" parameterType="String">

        <!-- 方案一 concat 推荐 -->

        <!-- select * from student where sname like concat('%',#{v},'%') -->

        <!-- 方案二 业务层解决模糊符号 不推荐 -->

        <!-- select *from student where sname like #{v} -->

        <!-- 方案三 sql语法  -->

        <!-- elect *from student where sname like "%"#{v}"%" -->

        <!--

        方案四 ${}  不推荐

        #{} 预处理sql语句 ? 占位 preparedstatment 进行防止sql注入

        ${} 字符串的替换 不能防止sql注入

         -->

        <!-- select * from student where sname like '%${v}%' -->

        <!-- 方案五  bind强烈推荐 -->

        <bind name="keyn" value="'%'+_parameter+'%'"/>

        select * from student where sname like#{keyn}

    </select>

 

       

35.什么是缓存

 数据交换的缓冲区,当应用程序需要读取数据时,先从数据库中将数据取出,放置在缓冲 区中,应用程序从缓冲区读取数据;

36.Mybatis 的一级、二级缓存?

    一级缓存是指MyBatis在同一个SqlSession中执行相同SQL时,会把查询到的结果缓存到内存中。当下次查询相同SQL时,会直接从缓存中获取数据,避免了重复查询数据库,提高了查询效率。一级缓存是默认开启的,也不需要进行额外配置。

    二级缓存是指MyBatis在多个SqlSession之间共享缓存。它可以避免多个SqlSession重复查询同一条数据,提高了应用的性能。但是,使用二级缓存需要进行额外的配置,包括在mapper.xml文件中配置<cache>标签以及在MyBatis的配置文件中开启二级缓存。需要注意的是,二级缓存仅仅是对查询结果进行缓存,对于insert、update、delete等操作,并不会清空缓存。

    需要注意的是,虽然缓存可以提高应用的性能,但是缓存也有可能带来一些问题,如数据不一致等。因此,在使用缓存时需要根据具体情况进行合理的配置

优秀MyBatis总结: 

MyBatis全知识点梳理_mybatis 知识点-CSDN博客

Mybatis知识总结(超详细、超全面)-CSDN博客

MyBatis常见面试题汇总(超详细回答)_mybatis面试题-CSDN博客

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com