首页 > 其他分享 >MyBatis 核心知识点详解:题目与解析

MyBatis 核心知识点详解:题目与解析

时间:2025-01-04 13:13:21浏览次数:1  
标签:选项 知识点 正确 标签 详解 参数 MyBatis 主键

MyBatis 核心知识点详解:题目与解析

MyBatis 是一个强大的持久层框架,广泛应用于 Java 开发中。本文将结合具体的题目,详细解析 MyBatis 的核心知识点,包括事务控制、自增主键回填、参数获取、结果映射以及动态 SQL,帮助大家更好地掌握这些内容。


题目1:MyBatis 控制事务

关于 MyBatis 控制事务,下列描述正确的是( )

选项:

  • A. MyBatis 控制事务默认是自动提交事务
  • B. MyBatis 控制事务默认是手动提交事务
  • C. 如果执行增删改语句,MyBatis 中需要执行:会话工厂对象.openSession(true);
  • D. 如果执行增删改语句,MyBatis 中需要执行:会话对象.commit();

解析:

1. MyBatis 的默认事务行为

  • MyBatis 的 SqlSession 默认是手动提交事务的,即需要显式调用 commit() 方法才能提交事务。
  • 如果希望自动提交事务,可以在创建 SqlSession 时传入参数 true,例如:sqlSessionFactory.openSession(true)
  • 因此,选项 A 错误,选项 B 正确。

2. 增删改操作的事务控制

  • 对于增删改操作,MyBatis 默认不会自动提交事务,必须显式调用 commit() 方法。
  • 如果希望自动提交事务,可以在创建 SqlSession 时使用 openSession(true)
  • 因此,选项 C 和 D 都是正确的。

正确答案:B、C、D


示例代码:

// 手动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
    sqlSession.insert("insertUser", user);
    sqlSession.commit(); // 显式提交事务
} finally {
    sqlSession.close();
}

// 自动提交事务
SqlSession sqlSession = sqlSessionFactory.openSession(true);
sqlSession.insert("insertUser", user); // 不需要显式调用 commit()

题目2:MyBatis 实现自增主键回填

关于 MyBatis 实现自增主键回填,下列描述正确的是( )

选项:

  • A. 自增主键回填表示新增一条数据成功后,将这条数据的主键封装到实体类中,并查看主键的值。
  • B. 想实现自增主键回填 insert 标签的属性 useGeneratedKeys 的属性值为 false
  • C. 想实现自增主键回填 insert 标签的属性 keyColumn 的属性值书写主键字段名
  • D. 想实现自增主键回填 insert 标签的属性 keyProperty 的属性值书写主键的成员变量名

解析:

1. 自增主键回填的作用

  • 自增主键回填是指在插入数据后,将数据库生成的主键值回填到实体类中,方便后续操作使用。
  • 因此,选项 A 正确。

2. useGeneratedKeys 属性

  • useGeneratedKeys 属性用于指示是否使用数据库生成的主键。其值应为 true,表示启用自增主键回填。
  • 因此,选项 B 错误。

3. keyColumn 属性

  • keyColumn 属性用于指定数据库表中主键字段的名称。
  • 因此,选项 C 正确。

4. keyProperty 属性

  • keyProperty 属性用于指定实体类中主键字段的属性名。
  • 因此,选项 D 正确。

正确答案:A、C、D


示例代码:

<insert id="insertUser" useGeneratedKeys="true" keyColumn="id" keyProperty="id">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>
  • useGeneratedKeys="true":启用自增主键回填。
  • keyColumn="id":指定数据库表中的主键字段名。
  • keyProperty="id":指定实体类中的主键属性名。

题目3:#{} 获取数据

关于 #{参数名} 获取数据,下列描述正确的是( )

选项:

  • A. 如果接口方法形参只有一个简单类型的数据,那么 #{参数名},参数名随便书写
  • B. 如果接口方法形参只有一个简单类型的数据,并且在方法上使用 @Param("参数名") 修饰形参,那么 #{参数名},参数名随便书写
  • C. 如果接口方法形参有多个简单类型的数据,那么可以使用 #{arg0}, #{arg1}... 等来获取数据
  • D. 如果接口方法形参是 POJO 类型的数据,那么可以使用 #{参数名} 来获取数据,参数名需要和 POJO 类的成员变量名或者 getXxxx() 方法去掉 get, X 变为 x 即 xxxx 一致

解析:

1. 单个简单类型参数

  • 如果方法只有一个简单类型参数(如 intString 等),#{} 中的参数名可以随意书写。
  • 因此,选项 A 正确。

2. 使用 @Param 注解

  • 如果方法参数使用了 @Param 注解,#{} 中的参数名必须与注解中指定的名称一致。
  • 因此,选项 B 错误。

3. 多个简单类型参数

  • 如果方法有多个简单类型参数,可以通过 #{arg0}#{arg1} 等方式获取参数。
  • 因此,选项 C 正确。

4. POJO 类型参数

  • 如果参数是 POJO 类型,#{} 中的参数名必须与 POJO 类的成员变量名或对应的 getter 方法名一致。
  • 因此,选项 D 正确。

正确答案:A、C、D


示例代码:

// 单个简单类型参数
User selectUserById(int id);

// 多个简单类型参数
User selectUserByNameAndAge(String name, int age);

// POJO 类型参数
int insertUser(User user);
<select id="selectUserById" resultType="User">
    SELECT * FROM user WHERE id = #{id}
</select>

<select id="selectUserByNameAndAge" resultType="User">
    SELECT * FROM user WHERE name = #{arg0} AND age = #{arg1}
</select>

<insert id="insertUser">
    INSERT INTO user (name, age) VALUES (#{name}, #{age})
</insert>

题目4:#{} 和 ${} 取值

关于 #{} 和 ${} 取值,下列描述错误的是( )

选项:

  • A. #{} 可以防止 SQL 注入问题
  • B. ${} 不能防止 SQL 注入问题
  • C. ${} 不会添加引号
  • D. #{} 可以完成拼接 SQL

解析:

1. #{} 的作用

  • #{} 是预编译的,会将参数值安全地绑定到 SQL 中,防止 SQL 注入。
  • 因此,选项 A 正确。

2. ${} 的作用

  • ${} 是直接拼接 SQL,存在 SQL 注入风险。
  • 因此,选项 B 正确。

3. ${} 的特性

  • ${} 不会自动添加引号,适合用于表名、列名等非字符串类型的拼接。
  • 因此,选项 C 正确。

4. #{} 的特性

  • #{} 是预编译的,不能用于拼接 SQL,拼接 SQL 应使用 ${}
  • 因此,选项 D 错误。

正确答案:D


示例代码:

<select id="selectUserByTableName" resultType="User">
    SELECT * FROM ${tableName} WHERE id = #{id}
</select>
  • ${tableName}:直接拼接表名。
  • #{id}:预编译绑定参数值。

题目5:结果映射

关于结果映射,下列描述错误的是( )

选项:

  • A. 如果接口中的方法返回值是单列集合,那么 resultType 中书写集合类型
  • B. resultMap 可以完成多表查询
  • C. 如果接口中的方法返回值是 POJO 类型,那么 resultType 中书写 POJO 类名
  • D. resultMap 可以解决 POJO 属性名和表结构字段名不一致的问题

解析:

1. 单列集合的返回值

  • 如果方法返回值是单列集合(如 List<User>),resultType 应写集合中元素的类型(如 User),而不是集合类型本身。
  • 因此,选项 A 错误。

2. resultMap 的作用

  • resultMap 可以处理复杂的多表查询结果映射。
  • 因此,选项 B 正确。

3. POJO 类型的返回值

  • 如果方法返回值是 POJO 类型,resultType 应写 POJO 类的全限定名。
  • 因此,选项 C 正确。

4. 属性名与字段名不一致

  • resultMap 可以解决 POJO 属性名和数据库字段名不一致的问题。
  • 因此,选项 D 正确。

正确答案:A


示例代码:

<resultMap id="userResultMap" type="User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
</resultMap>

<select id="selectUser" resultMap="userResultMap">
    SELECT user_id, user_name FROM user
</select>

题目6:动态 SQL

关于动态 SQL,下列描述错误的是( )

选项:

  • A. if 标签表示判断的,如果 test 属性值中的 OGNL 表达式的值为 true,则执行标签文本
  • B. 多分支标签使用 choose, when, otherwise,只会执行满足一个条件的标签
  • C. where 标签作用能够添加 where 关键字同时能够去除多余的 and 或者 or 关键字
  • D. set 标签作用只能添加 set 关键字

解析:

1. if 标签

  • if 标签用于条件判断,当 test 属性中的 OGNL 表达式为 true 时,执行标签内的 SQL。
  • 因此,选项 A 正确。

2. choose 标签

  • choosewhenotherwise 标签用于多分支条件判断,只会执行第一个满足条件的 when 标签。
  • 因此,选项 B 正确。

3. where 标签

  • where 标签会自动添加 WHERE 关键字,并去除多余的 ANDOR
  • 因此,选项 C 正确。

4. set 标签

  • set 标签不仅会添加 SET 关键字,还会去除多余的逗号。
  • 因此,选项 D 错误。

正确答案:D


示例代码:

<update id="updateUser">
    UPDATE user
    <set>
        <if test="name != null">name = #{name},</if>
        <if test="age != null">age = #{age},</if>
    </set>
    WHERE id = #{id}
</update>

总结

通过以上题目的详细解析,我们对 MyBatis 的核心知识点有了更深入的理解。掌握这些内容,能够帮助我们在实际开发中更加高效地使用 MyBatis,编写出安全、灵活的 SQL 语句。如果还有任何疑问,欢迎留言讨论!

标签:选项,知识点,正确,标签,详解,参数,MyBatis,主键
From: https://www.cnblogs.com/itcq1024/p/18651785

相关文章

  • 软件设计师考试知识点
    https://www.cnblogs.com/mh20131118/p/11334612.html https://www.cnblogs.com/blog-cjz/p/16005106.html本人已将笔记、历年真题与解析、备考方法整理压缩至【百度网盘】,需要资源的同学可以通过点击下面云盘链接进行保存下载。链接失效的话请在文章下面评论或私信我,我看到的......
  • Stable Diffusion的加噪和去噪详解
    本文详细介绍StableDiffusion的加噪和去噪过程中的调度算法和采样算法,包括部分公式的讲解。目录调度和采样加噪过程调度算法采样算法加噪过程概述加噪过程的主要组成部分加噪过程的步骤去噪过程调度算法采样算法去噪过程概述去噪过程的主要组成部分去噪过程......
  • JAVA开发中 MyBatis XML 映射文件 的作用
    MyBatisXML映射文件(通常是以.xml结尾的文件,例如UserMapper.xml)是MyBatis框架的重要组成部分,主要用于定义SQL语句、结果映射关系以及参数绑定。它的作用是将Java方法与SQL语句关联起来,实现持久化操作(如查询、插入、更新和删除)。以下是关于MyBatisXML映射文......
  • JavaScript 中最难理解的三个知识点,面试命中率 99% !
    原型与原型链说到原型,就不得不提一下构造函数,首先我们看下面一个简单的例子:functionDog(name,age){this.name=name;this.age=age;}letdog1=newDog("哈士奇",3);letdog2=newDog("泰迪",2);首先创造空的对象,再让this指向这个对象,通过this.n......
  • Arthas IDE 插件最全教程:服务器端安装、IntelliJ 配置、方法变量调试与常用命令详解
    言简意赅的讲解ArthasIDE插件解决的痛点之前给大家讲解了使用Arthas与EclipseMemoryAnalyzer的完整指南,但是很多同学觉得Arthas部分还不够细。以下内容将详细讲解ArthasIDE插件的使用方法,包括服务器端安装Arthas、IntelliJIDEA插件安装与配置、如何观察方法变......
  • Web安全基础:反序列化漏洞详解(含PHP,Python示例)
    当系统接收和处理外部输入的数据时,可能会通过反序列化过程执行恶意代码或操作。这个漏洞的根本原因在于,系统对反序列化数据的处理不够严格,导致攻击者能够将精心构造的数据注入到反序列化流程中,进而达到远程代码执行、数据篡改、权限提升等目的。序列化与反序列化序列化:将......
  • Python多分类Logistic回归详解与实践
    在机器学习中,Logistic回归是一种基本但非常有效的分类算法。它不仅可以用于二分类问题,还可以扩展应用于多分类问题。本文将详细介绍如何使用Python实现一个多分类的Logistic回归模型,并给出详细的代码示例。一、Logistic回归简介Logistic回归是一种线性模型,用于二分类问题。它通......
  • 【金融安全】境外投资ODI备案详解
    一、基本概念ODI(OverseasDirectInvestment)是指中国境内企业通过新设、并购等方式在境外拥有非金融企业所有权、控制权等权益的投资行为。ODI备案,即境外直接投资备案,是指中国企业在进行境外投资前,根据中国政府的相关规定,向国家发展和改革委员会(发改委)、商务部以及外汇管理局等......
  • 数据库进阶教程之存储过程(万字详解)
    文章目录一、存储过程概述1.1、什么是存储过程1.2、存储过程特点1.3、存储过程优缺点二、存储过程创建2.1、创建格式2.2、变量2.3、变量作用域三、存储过程参数3.1、in3.2、out3.3、inout四、存储过程条件4.1、if…else…endif4.2、if…elseif…else…endif4.3、cas......
  • Python-二分法的进阶与Bisect库详解
    1.1前言:在进阶之前可能很多学过二分法的人都认为二分查找十分简单,但事实不完全如此。比如你是否熟练的知道while的条件有等于时返回究竟是mid还是left,还是right,还是随便返回一个没有等于时又是返回什么……本文将给大家讲解二分法的进阶和bisect库函数的运用,并且再讲解之后......