MyBatis 面试题(六)

这篇具有很好参考价值的文章主要介绍了MyBatis 面试题(六)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. MyBatis 有几种分页方式?

MyBatis 的分页方式主要可以分为两大类:逻辑分页和物理分页。

逻辑分页是一次性把全部数据查询加载进内存,然后再进行分页。这种方式减少了IO次数,适合频繁访问、数据量少的情况,但不适合大数据量,容易造成内存溢出。

物理分页则是利用数据库的特性进行分页,例如使用 LIMIT 语法。这种方式适合分页大数据量数据。

具体来说,MyBatis 的分页方式包括:

  1. 借助数组进行分页:首先查询出全部数据,然后在内存中通过数组或List进行截取,获取需要的部分。这种方式属于逻辑分页。
  2. 借助SQL语句进行分页:在SQL语句后面添加LIMIT分页语句,利用数据库的特性进行物理分页。这种方式直接在数据库层面进行操作,效率和性能都相对较高。
  3. 利用拦截器分页:通过拦截器给SQL语句末尾加上LIMIT语句来分页查询,实现物理分页。
  4. 利用RowBounds实现分页:需要一次获取所有符合条件的数据,然后在内存中对大数据进行操作即可实现分页效果。这种方式也属于逻辑分页,对于大数据量可能不太适用。
  5. 使用分页插件:例如PageHelper等分页插件,它们通过拦截MyBatis的SQL语句,自动添加分页相关的SQL片段,从而实现对查询结果的分页。这种方式既方便又灵活,是目前比较常用的分页方式。

在选择分页方式时,应根据具体的业务场景和需求来决定。对于数据量小、频繁访问的场景,可以选择逻辑分页;对于大数据量、需要高效分页的场景,则建议选择物理分页或使用分页插件。

2. MyBatis 逻辑分页和物理分页的区别是什么?

MyBatis的逻辑分页和物理分页在分页的实现方式和数据库负担方面存在显著的区别。

逻辑分页主要依赖于代码,如MyBatis自带的RowBounds插件就是逻辑分页的一个例子。逻辑分页首先会一次性查询出所有的数据,然后再根据代码块的需要(例如需要获取第几页的数据,每页包含多少条数据)来筛选出合适的数据进行分页。这种方式在内存中操作数据,对数据库的访问次数相对较少,但由于需要一次性加载所有数据,如果数据量很大,可能会对内存造成较大的压力。

相比之下,物理分页则更侧重于数据库操作,依赖于数据库提供的分页功能。例如,MySQL数据库提供了“limit”关键字来实现分页,程序员只需要编写带有这些关键字的SQL语句,数据库返回的数据就是分页结果。物理分页每次分页都需要访问数据库,因此它对数据库的负担较大,但由于每次只处理一部分数据,对内存的压力相对较小。

总结来说,逻辑分页和物理分页的主要区别在于:逻辑分页在内存中操作数据,对数据库访问次数少但可能消耗大量内存;而物理分页直接在数据库层面实现分页,每次分页都需要访问数据库但对内存压力较小。在实际应用中,应根据具体需求和场景选择合适的分页方式。

3. MyBatis 流式查询有什么用?

MyBatis 流式查询是一种优化查询的方法,主要用于处理大量数据,以降低内存占用和提高查询速度。在流式查询模式下,查询结果不是一次性加载到内存中,而是逐条从数据库服务器传输到客户端。这意味着应用可以从迭代器中每次取一条查询结果,而不是一次性处理整个结果集。这种方式的优点在于,它允许在内存不足以容纳全部结果集的情况下,仍然能够处理大量数据。

具体来说,流式查询的好处主要体现在以下几个方面:

  1. 降低内存使用:通过流式查询,应用程序不需要一次性加载整个结果集到内存中,从而减少了内存的使用。这在处理海量数据时尤为重要,可以有效避免内存溢出等问题。
  2. 提高查询效率:对于大数据量的查询,一次性加载整个结果集可能会消耗大量的时间和资源。而流式查询允许应用程序逐步处理查询结果,从而提高了查询效率。
  3. 适用于特定场景:流式查询特别适用于需要处理大量数据但不需要同时访问所有数据的情况,例如数据导出、日志分析等。

需要注意的是,在使用流式查询时,数据库连接通常保持打开状态,因此应用需要在取完数据后自己关闭数据库连接,因为数据库访问框架不再负责关闭连接。此外,使用流式查询时,ResultSet对象的一些方法可能会失效,比如absolute()、last()、previous()、beforeFirst()等方法。

总的来说,MyBatis 流式查询是一个数据库访问框架必须具备的功能,它能够在处理大量数据时提供高效的解决方案,降低内存使用并提高查询速度。

4. MyBatis 模糊查询 like 语该怎么写?

在 MyBatis 中进行模糊查询时,通常使用 SQL 的 LIKE 语句配合通配符 % 来实现。通配符 %LIKE 语句中表示任意长度的字符序列(包括零个字符)。

下面是一个在 MyBatis 中使用 LIKE 进行模糊查询的示例:

首先,假设你有一个名为 User 的实体类,它有一个属性 name。你希望根据 name 的部分值来查询用户。

  1. Mapper XML 文件

在 MyBatis 的 Mapper XML 文件中,你可以这样写 SQL 语句:

<select id="findUsersByName" resultType="User">
    SELECT * FROM user
    WHERE name LIKE CONCAT('%', #{name}, '%')
</select>

这里使用了 CONCAT 函数来拼接 % 和传入的参数 #{name}。这样,无论传入的 name 是什么,它都会被包裹在 % 之间,从而实现模糊查询。

  1. Mapper 接口

对应的 Mapper 接口方法可能如下:

public interface UserMapper {
    List<User> findUsersByName(String name);
}
  1. 在 Service 或 Controller 中调用

然后,在你的 Service 或 Controller 中,你可以调用这个 Mapper 方法来进行查询:

@Autowired
private UserMapper userMapper;

public List<User> searchUsers(String searchTerm) {
    return userMapper.findUsersByName(searchTerm);
}

注意:在实际应用中,为了防止 SQL 注入攻击,你应该始终使用预编译的 SQL 语句(即使用 #{} 来绑定参数),而不是直接将参数拼接到 SQL 语句中(即使用 ${})。在上面的示例中,我们使用了 #{} 来绑定 name 参数,这是安全的做法。

5. MyBatis 如何防止 SQL 注入?

MyBatis 通过预编译(PreparedStatement)的方式来防止 SQL 注入。预编译的 SQL 语句在执行时会将参数值作为数据而不是 SQL 的一部分来处理,从而避免了 SQL 注入的风险。

具体来说,MyBatis 在处理 SQL 语句时,会将 SQL 语句中的参数用占位符(通常是 #{})替代,然后在执行 SQL 语句之前,通过 PreparedStatement 对象设置参数值。由于 PreparedStatement 对象会对参数值进行转义和处理,因此即使参数值中包含 SQL 注入攻击的代码,也不会被解析为 SQL 语句的一部分,从而避免了 SQL 注入。

例如,在 MyBatis 的 Mapper XML 文件中,我们可以这样写 SQL 语句:

<select id="selectUserById" resultType="User">
  SELECT * FROM user WHERE id = #{id}
</select>

在这个例子中,#{id} 是一个占位符,MyBatis 会将它替换为实际的参数值,并使用 PreparedStatement 来设置这个参数。这样,即使 id 的值是一个恶意构造的 SQL 语句片段,它也不会被解析为 SQL 的一部分,因此无法执行 SQL 注入攻击。

需要注意的是,虽然 MyBatis 本身已经提供了防止 SQL 注入的机制,但是在编写 SQL 语句时仍然需要谨慎。特别是当使用 ${} 来直接插入字符串时,需要特别小心,因为这种方式不会进行预编译,如果插入的字符串中包含恶意 SQL 代码,就可能导致 SQL 注入。因此,除非有特别的需求,否则一般推荐使用 #{} 来插入参数。

6. MyBatis 如何获取自动生成的主键id?

在 MyBatis 中,当你插入一条记录到数据库,并且这条记录有一个自动生成的主键(例如,使用 MySQL 的 AUTO_INCREMENT 或者其他数据库的类似机制),你可以通过几种不同的方式来获取这个自动生成的主键 ID。

以下是几种常见的方法:

1. 使用 useGeneratedKeyskeyProperty

你可以在 MyBatis 的 <insert> 标签中使用 useGeneratedKeyskeyProperty 属性来告诉 MyBatis 你想要获取自动生成的主键。

<insert id="insertUser" parameterType="com.example.User" useGeneratedKeys="true" keyProperty="id">
    INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>

在这个例子中,useGeneratedKeys="true" 告诉 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来获取自动生成的主键。keyProperty="id" 指定了哪个属性应该被用来接收这个主键值。在这个例子中,idUser 类的一个属性。

执行插入操作后,你可以直接从传入的 User 对象中获取这个 ID:

User user = new User();
user.setName("John Doe");
user.setEmail("johndoe@example.com");
userMapper.insertUser(user);
Long generatedId = user.getId(); // 这里就是自动生成的主键 ID
2. 使用 selectKey

另一种方法是使用 <selectKey> 标签。这通常在你需要执行一个额外的查询来获取主键时使用,例如在非自增主键的场景中。

<insert id="insertUser" parameterType="com.example.User">
    <selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER">
        SELECT LAST_INSERT_ID()
    </selectKey>
    INSERT INTO user (name, email) VALUES (#{name}, #{email})
</insert>

在这个例子中,<selectKey> 标签执行了一个查询来获取最后一个插入的 ID(这里假设你使用的是 MySQL)。order="AFTER" 表示在插入操作之后执行这个查询。查询的结果将被设置到 User 对象的 id 属性中。

注意事项:
  • 确保你的数据库驱动和 JDBC 版本支持获取自动生成的主键。大多数现代驱动和 JDBC 版本都支持这个功能。
  • 如果你的数据库表使用了复合主键或者没有使用自动生成的主键机制,那么你可能需要采用其他策略来获取主键。
  • 在某些情况下,你可能需要根据你的数据库和 JDBC 驱动的具体行为来调整这些设置。

7. MyBatis 中jdbcType 和javaType 的区别?

在 MyBatis 中,jdbcTypejavaType 是两个重要的属性,用于指定参数或结果集中字段的数据库类型和 Java 类型。它们的主要区别体现在它们所代表的类型层面和用途上。

jdbcType

jdbcType 是 JDBC 的类型,它表示数据库中的数据类型。当执行 SQL 语句时,MyBatis 会使用 jdbcType 来告诉 JDBC 驱动如何正确地设置或获取参数值或结果集字段的值。jdbcType 是数据库层面上的数据类型,例如 VARCHARINTEGERDATE 等。

在 MyBatis 的映射文件或注解中,你可能会在 <parameterMap><resultMap><insert><update><select> 等标签中看到 jdbcType 属性。它确保 MyBatis 能够正确地将 Java 对象转换为对应的数据库类型,或者将数据库字段的值转换为 Java 对象。

javaType

javaType 是 Java 的类型,它表示 Java 程序中使用的数据类型。在 MyBatis 中,javaType 用于指定 Java 对象的类型,以便 MyBatis 能够正确地将数据库字段的值映射到 Java 对象的属性上,或者将 Java 对象的属性值映射到 SQL 语句的参数中。

javaType 通常用于指定 Java 的基本类型(如 intString)或自定义的 Java 类型(如自定义的实体类)。在 MyBatis 的映射文件或注解中,javaType 常常与 resultMapparameterType 一起使用,以确保数据在 Java 和数据库之间能够正确地转换。

示例

假设你有一个 Java 实体类 User,其中有一个 id 属性,该属性在数据库中是一个整数类型。在 MyBatis 的映射文件中,你可能会这样指定 jdbcTypejavaType

<resultMap id="UserResult" type="com.example.User">
  <result property="id" column="user_id" jdbcType="INTEGER" javaType="java.lang.Integer"/>
</resultMap>

在这个示例中,jdbcType="INTEGER" 告诉 MyBatis 数据库中的 user_id 字段是一个整数类型,而 javaType="java.lang.Integer" 则告诉 MyBatis 在 Java 中应该将这个字段的值映射到 Integer 类型的属性上。

总结

jdbcTypejavaType 的主要区别在于它们分别代表了数据库层面和 Java 层面的数据类型。在 MyBatis 中,正确设置这两个属性对于确保数据能够正确地在 Java 程序和数据库之间转换是非常重要的。文章来源地址https://www.toymoban.com/news/detail-858235.html

到了这里,关于MyBatis 面试题(六)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot+mybatis实现mysql和oracle多数据源

    在实际项目中很多时候会涉及到多个数据库的访问,或者数据库读写分离的形式。 下面通过使用 Aspect+注解来实现mysql+oracle的多数据源配置(注意:事务一致性未提供) 首先要去oracle官网下载ojdbc的jar包,根据oracle的版本去下载,或者在下载的oracle的jdbc包下的lib里面有,然后

    2024年02月07日
    浏览(60)
  • Mybatis面试题(四)

    MyBatis 面试题 26、Mapper 编写有哪几种方式? 第一种:接口实现类继承 SqlSessionDaoSupport:使用此种方法需要编写mapper 接口,mapper 接口实现类、mapper.xml 文件。 1、在 sqlMapConfig.xml 中配置 mapper.xml 的位置 2、定义 mapper 接口 3、实现类集成 SqlSessionDaoSupportmapper 方法中可以 this.getS

    2024年01月22日
    浏览(41)
  • 精选MyBatis面试题

    什么是MyBatis? MyBatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。 作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信

    2024年02月10日
    浏览(88)
  • MyBatis 面试题(六)

    1. MyBatis 有几种分页方式? MyBatis 的分页方式主要可以分为两大类:逻辑分页和物理分页。 逻辑分页是一次性把全部数据查询加载进内存,然后再进行分页。这种方式减少了IO次数,适合频繁访问、数据量少的情况,但不适合大数据量,容易造成内存溢出。 物理分页则是利用

    2024年04月26日
    浏览(28)
  • JavaWeb编程面试题——MyBatis

    面试题==知识点,这里所记录的面试题并不针对于面试者,而是将这些面试题作为技能知识点来看待。不以刷题进大厂为目的,而是以学习为目的。这里的知识点会持续更新,目录也会随时进行调整。 关注公众号:编程火箭车 。在【粉丝福利】中点击【面题大全】,其中的

    2024年02月06日
    浏览(48)
  • MyBatis面试题及高级用法

    答案1: MyBatis是一个Java持久层框架,通过将SQL语句映射到对象,简化了数据库访问。它的主要特点包括动态SQL生成、自动参数映射和复杂映射支持。 答案2: MyBatis与大多数对象关系映射(ORM)框架的区别在于,它不需要使用面向对象的查询语言编写数据库查询。相反,MyBatis允

    2024年02月02日
    浏览(37)
  • 70多道MyBatis面试题,让面试官无言以对

    以下是MyBatis面试题目,答案一个个整理出来很麻烦,所以直接答案可以查看这里即可: http://www.yayihouse.com/yayishuwu/book/158 1、 MyBatis的嵌套查询是什么? 2、 MyBatis的resultType和javaType的区别是什么? 3、 MyBatis和Hibernate的相同点和不同点以及各自的优缺点 4、 Mybatis中的多表查询如

    2024年02月16日
    浏览(33)
  • Mybatis缓存相关面试题有多卷

    MyBatis 是一个流行的持久层框架,它提供了一个灵活且高效的方式来访问关系型数据库。其中一个重要的特性是缓存机制,它可以帮助提升数据库查询的性能。 MyBatis 的缓存分为一级缓存和二级缓存两种: 一级缓存:默认情况下,MyBatis 开启了一级缓存。一级缓存是指在同一

    2024年01月25日
    浏览(32)
  • 分析ORACLE批量更新中的ORA-00911错误:MyBatis <foreach> 场景与解决方案

            在日常的Java开发过程中,尤其是当我们在使用MyBatis作为持久层框架进行Oracle数据库操作时,批量更新数据是非常常见的需求。然而,在利用MyBatis的 foreach 标签遍历集合参数动态构造SQL更新语句时,有时会遭遇ORA-00911: invalid character错误。这种错误表明在提交给O

    2024年04月23日
    浏览(48)
  • MyBatis进阶:掌握MyBatis动态SQL与模糊查询、结果映射,让你在面试中脱颖而出!!

    目录 一、引言 二、MyBatis动态SQL 2.1.if元素使用 2.2.foreach元素使用 三、MyBatis模糊查询 ①使用#{字段名} ②使用${字段名} ③使用concat{\\\'%\\\',#{字段名},\\\'%\\\'} 总结 四、MyBatis结果映射 4.1.案例演示 4.1.1.resultType进行结果映射 4.1.2.resultMap进行结果映射 在当今的软件开发环境中,数据库的使

    2024年02月11日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包