Mybatis的面试题

1. 什么是一级缓存什么是二级缓存?

MyBatis是一款优秀的持久层框架,它提供了一级缓存和二级缓存来提高数据库访问性能。

一级缓存

一级缓存是指在同一个SqlSession中进行的缓存。当MyBatis执行查询时,查询结果会被缓存在SqlSession的内存中,如果再次执行相同的查询,MyBatis会先检查一级缓存中是否有相同的查询结果,如果有就直接返回缓存的结果,而不再去数据库中执行查询。一级缓存的有效范围是同一个SqlSession,当SqlSession关闭时,一级缓存也会被清空。

二级缓存

二级缓存是指多个SqlSession共享的缓存。当MyBatis执行查询并将结果缓存到二级缓存中时,其他SqlSession也可以从这个二级缓存中获取相同的查询结果。因此,当有多个SqlSession对同一个数据进行操作时,可以通过二级缓存避免多次查询数据库。需要注意的是,二级缓存是跨SqlSession的,但是默认情况下是关闭的,需要手动配置开启。

总的来说,一级缓存是SqlSession级别的缓存,生命周期较短,而二级缓存是多个SqlSession共享的缓存,生命周期较长。使用缓存可以减少数据库的访问次数,提高系统性能,但同时也需要注意缓存的更新策略和缓存带来的数据一致性问题。

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

  1. #{}语法:

    • #{}语法表示使用预编译的SQL语句,使用占位符将参数值安全地替换到SQL语句中。这种方式可以有效防止SQL注入攻击,并且会自动进行参数类型转换。
    • 例如:SELECT * FROM user WHERE id = #{id}。在执行SQL语句时,#{id}会被实际的参数值替换,类似于预编译语句中的占位符。
  2. ${}语法:

    • ${}语法表示使用文本替换的方式将参数值直接嵌入到SQL语句中,不进行预编译处理。这种方式更加灵活,但也存在一些风险,如SQL注入攻击。
    • 例如:SELECT * FROM user WHERE id = ${id}。在执行SQL语句时,${id}会被实际的参数值直接替换,相当于简单的文本替换。

区别总结:

  • #{}是预编译的占位符语法,更安全,能够防止SQL注入,会自动进行参数类型转换。
  • ${}是文本替换的方式,更灵活,但潜在地存在SQL注入风险,不进行参数类型转换。

因此,为了安全起见,推荐在构建动态SQL时多使用#{}占位符语法,并避免直接使用${}语法。

3.resultMap,resultType的区别,怎么实现的?

在MyBatis中,resultMapresultType都是用于映射查询结果的元素,但它们有一些区别。

  1. resultMap

    • resultMap是用于定义复杂的结果集映射关系的元素。通过resultMap可以指定如何将查询结果映射到对象的属性,可以处理多表联合查询、嵌套查询等复杂的映射情况。
    • 通常情况下,当需要进行复杂的结果映射时,会使用resultMap来定义映射规则,然后在SQL语句中引用这个resultMap
    • resultMap的定义包括了对每个查询字段与对象属性之间的映射关系,可以灵活地处理各种复杂的查询结果映射情况。
  2. resultType

    • resultType是用于简单的结果映射的元素,用于指定查询结果应该被映射到的对象类型。通常用于简单的查询,只需要将结果映射到一个简单的JavaBean对象时使用。
    • 当查询结果只有一张表的字段,且这些字段可以直接映射到一个JavaBean对象的属性时,可以使用resultType来指定结果映射的目标类型。

实现方式:

  • resultMap的实现方式是通过在MyBatis的映射文件中使用<resultMap>元素来定义映射规则,其中可以指定字段到属性的映射关系、嵌套结果映射等。
  • resultType的实现方式是通过在SQL语句的SELECT语句中使用resultType属性来指定结果映射的目标类型,通常是一个简单的JavaBean类型。

总结:

  • resultMap适用于复杂的结果集映射,能够处理多表联合查询、嵌套查询等复杂情况。
  • resultType适用于简单的结果集映射,适用于将查询结果映射到单个JavaBean对象的情况。

在实际使用中,根据查询的复杂度和结果映射的需求,选择使用resultMapresultType来定义查询结果的映射关系。

代码示例:

  1. 使用resultMap进行结果映射:
<!-- 在映射文件中定义resultMap -->
<resultMap id="userResultMap" type="User">
    <id property="id" column="user_id"/>
    <result property="username" column="username"/>
    <result property="age" column="age"/>
</resultMap>

<!-- 在SQL语句中引用resultMap -->
<select id="selectUserById" resultMap="userResultMap">
    SELECT user_id, username, age FROM user WHERE user_id = #{userId}
</select>
  1. 使用resultType进行结果映射:
<!-- 直接在SQL语句中指定resultType -->
<select id="selectUserById" resultType="User">
    SELECT user_id, username, age FROM user WHERE user_id = #{userId}
</select>

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MyBatis是一个开源的持久层框架,它可以数据库操作与Java对象之间的映射关系进行配置,简化了数据库操作的编写过程。下面是一些常见的MyBatis面试题及其答案: 1. 什么是MyBatisMyBatis是一个持久层框架,它可以将数据库操作与Java对象之间的映射关系进行配置,简化了数据库操作的编写过程。 2. MyBatis的优点有哪些? - 简化了数据库操作的编写过程,提高了开发效率。 - 提供了灵活的SQL映射配置,可以满足各种复杂的查询需求。 - 支持动态SQL,可以根据不同的条件生成不同的SQL语句。 - 提供了缓存机制,可以提高查询性能。 - 与Spring等框架集成较为方便。 3. MyBatis的核心组件有哪些? MyBatis的核心组件包括: - SqlSessionFactory:用于创建SqlSession对象的工厂。 - SqlSession:用于执行SQL语句和管理事务。 - Mapper接口:定义了数据库操作的方法。 - Mapper XML文件:配置了SQL语句和结果映射关系。 4. MyBatis中的动态SQL是什么? 动态SQL是指根据不同的条件生成不同的SQL语句。MyBatis提供了一些标签(如if、choose、foreach等)来实现动态SQL的编写,可以根据条件判断、循环等来动态生成SQL语句。 5. MyBatis的一级缓存和二级缓存有什么区别? - 一级缓存是SqlSession级别的缓存,它默认开启且不可关闭。在同一个SqlSession中,如果执行了相同的查询语句,那么第二次以后的查询会直接从缓存中获取结果,而不会再去数据库查询。 - 二级缓存是Mapper级别的缓存,它可以跨SqlSession共享。当多个SqlSession执行相同的查询语句时,如果开启了二级缓存,那么第二次以后的查询会直接从缓存中获取结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风止￴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值