全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页

存储过程与高级查询专题测试

9 题 45 分钟 难度:

考察知识点

  • 存储过程调用statementType="CALLABLE" 的正确使用、JDBC 标准 {CALL ...} 语法、注解方式调用存储过程
  • 输入输出参数mode=IN/OUT/INOUT 参数模式的区别与使用场景、jdbcType 在 OUT 参数中的必要性、参数回写机制
  • 游标结果处理:REF_CURSOR 类型在不同数据库下的差异、游标参数的 mode=OUT 配置、游标结果集与 resultMap 的配合使用
  • 复杂查询封装:数据库视图的应用场景、<sql><include> 复用查询片段、嵌套 <resultMap> 处理一对多关系、延迟加载与 N+1 问题
1
单选题

在 MyBatis 中调用 MySQL 存储过程 calc_bonus(IN emp_id INT, OUT bonus DECIMAL),以下哪种 Mapper XML 配置是错误的?

A

<select id="callBonus" statementType="CALLABLE" parameterType="map">{CALL calc_bonus(#{empId,mode=IN},#{bonus,mode=OUT})}</select>

B

<update id="callBonus" statementType="CALLABLE" parameterType="map">{CALL calc_bonus(#{empId,mode=IN},#{bonus,mode=OUT,jdbcType=DECIMAL})}</update>

C

<select id="callBonus" statementType="PREPARED">CALL calc_bonus(#{empId},#{bonus})</select>

D

<select id="callBonus" statementType="CALLABLE" parameterType="map">{call calc_bonus(#{empId,mode=IN},#{bonus,mode=OUT,jdbcType=DECIMAL})}</select>

2
多选题

在 MyBatis 中调用存储过程时,关于异常处理和事务管理,以下哪些说法是正确的?

A

存储过程内部抛出的异常会被 MyBatis 包装为 PersistenceException

B

存储过程中的 ROLLBACK 操作会与 Spring 的 @Transactional 注解冲突,导致事务管理失效

C

如果存储过程修改了数据但未提交,MyBatis 所在的事务会负责提交或回滚

D

可以使用 @Select 注解配合 statementType = StatementType.CALLABLE 来调用存储过程

3
多选题

在 MyBatis 中调用带有输入输出参数的存储过程时,关于参数配置的以下说法哪些是正确的?

A

mode=IN 是参数的默认值,可以省略不写

B

mode=OUT 的参数必须在 Java 侧传入一个初始值(如 map.put 或对象属性)

C

mode=INOUT 参数既会作为输入值传入存储过程,又会在执行后被更新为新值

D

OUT 参数必须指定 jdbcType 属性,否则在某些数据库驱动下可能无法正确获取返回值

4
填空题

在 MyBatis Mapper XML 中调用存储过程 sp_get_user_stats(IN user_id INT, OUT total_orders INT, OUT total_amount DECIMAL),补全以下配置中的空白部分:

XML
<select id="getUserStats" statementType="________" parameterType="map">
    {CALL sp_get_user_stats(
        #{userId,mode=______},
        #{totalOrders,mode=______,jdbcType=_______},
        #{totalAmount,mode=______,jdbcType=_______}
    )}
</select>
5
单选题

在 MyBatis 中调用存储过程时,mode=INOUT 参数与 mode=OUT 参数的核心区别是什么?

A

INOUT 参数需要在 Java 侧传入初始值,OUT 参数不需要

B

INOUT 参数的值在存储过程执行前不会被传入,只有返回值会传回

C

OUT 参数必须搭配 resultMap 使用,INOUT 参数不需要

D

INOUT 参数只能用于基本类型,OUT 参数可以用于对象类型

6
多选题

在 MyBatis 中处理存储过程返回的游标(REF_CURSOR)结果集时,以下哪些做法是正确的?

A

使用 jdbcType=CURSOR 配合 javaType=java.sql.ResultSetresultMap 来映射游标结果

B

游标参数必须配置为 mode=OUT,因为游标是从存储过程返回的结果

C

可以使用 @Results 注解定义游标结果的映射规则

D

游标返回的结果集可以被 MyBatis 自动映射为 Java Bean 列表

7
判断题

在 MyBatis 中,不同数据库的游标类型名称不同(如 Oracle 使用 CURSOR,PostgreSQL 使用 REF_CURSOR,MySQL 不直接支持游标输出参数),因此需要在 Mapper XML 中针对不同的数据库使用不同的 jdbcType 值,否则存储过程调用会失败。这种说法是否正确?

A

B

8
多选题

在 MyBatis 中封装复杂查询(如多表 JOIN、子查询、动态条件组合)时,以下哪些策略是推荐的?

A

将复杂查询封装为数据库视图(VIEW),MyBatis 中按普通表查询

B

使用 <sql> 标签定义可复用的查询片段,通过 <include> 引用

C

使用嵌套的 <resultMap> 处理多表 JOIN 结果的层次结构映射

D

将所有复杂查询都写在 Mapper 接口方法中,通过字符串拼接实现动态条件

9
填空题

在 MyBatis 中,以下查询返回用户及其订单信息(一对多关系),补全 resultMap 配置中的空白部分:

XML
<resultMap id="userOrderMap" type="User">
    <id property="id" column="user_id"/>
    <result property="name" column="user_name"/>
    <__________ property="orders" ofType="Order"
        column="user_id"
        select="____________________"/>
</resultMap>

<select id="selectUsers" resultMap="____________">
    SELECT u.id AS user_id, u.name AS user_name
    FROM users u
</select>

<select id="____________________" resultType="Order">
    SELECT id, amount, create_time
    FROM orders
    WHERE user_id = _________
</select>
← 上一个试卷 多租户与数据权限专题测试
下一个试卷 → 性能调优实战专题测试

📝 发现内容有误?点击此处直接编辑

想参加完整模拟考试?
小程序提供计时考试、自动评分和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库