You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
exam/mapper/user/UserExamMapper.xml

102 lines
5.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!-- 声明 XML 文档的版本为 1.0,并指定字符编码为 UTF-8确保文档能正确处理各种字符 -->
<?xml version="1.0" encoding="UTF-8"?>
<!-- 定义文档类型,引用 MyBatis Mapper 3.0 的 DTD用于验证当前 XML 文档是否符合 MyBatis Mapper 规范 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 定义 Mapper 命名空间,将此 XML 映射文件与对应的 Java Mapper 接口关联起来,方便 MyBatis 找到对应的操作方法 -->
<mapper namespace="com.yf.exam.modules.user.exam.mapper.UserExamMapper">
<!-- 通用查询映射结果
定义一个基础结果映射,将数据库查询结果映射到 Java 实体类 com.yf.exam.modules.user.exam.entity.UserExam
id: 结果映射的唯一标识,可在其他 SQL 语句中引用
type: 指定映射的 Java 实体类的全限定名
-->
<resultMap id="BaseResultMap" type="com.yf.exam.modules.user.exam.entity.UserExam">
<!-- 映射数据库表的主键列到 Java 实体类的属性
column: 数据库表的列名
property: Java 实体类的属性名
-->
<id column="id" property="id" />
<!-- 映射用户 ID 列到 Java 实体类的 userId 属性 -->
<result column="user_id" property="userId" />
<!-- 映射考试 ID 列到 Java 实体类的 examId 属性 -->
<result column="exam_id" property="examId" />
<!-- 映射尝试次数列到 Java 实体类的 tryCount 属性 -->
<result column="try_count" property="tryCount" />
<!-- 映射最高分数列到 Java 实体类的 maxScore 属性 -->
<result column="max_score" property="maxScore" />
<!-- 映射是否通过列到 Java 实体类的 passed 属性 -->
<result column="passed" property="passed" />
<!-- 映射创建时间列到 Java 实体类的 createTime 属性 -->
<result column="create_time" property="createTime" />
<!-- 映射更新时间列到 Java 实体类的 updateTime 属性 -->
<result column="update_time" property="updateTime" />
</resultMap>
<!-- 通用查询结果列
定义一段可复用的 SQL 片段,包含常用的查询列
id: SQL 片段的唯一标识,可在其他 SQL 语句中通过 <include> 标签引用
-->
<sql id="Base_Column_List">
`id`,`user_id`,`exam_id`,`try_count`,`max_score`,`passed`,`create_time`,`update_time`
</sql>
<!-- 列表查询结果映射
定义一个结果映射,继承自 BaseResultMap将数据库查询结果映射到 Java DTO 类 com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO
id: 结果映射的唯一标识,可在其他 SQL 语句中引用
type: 指定映射的 Java DTO 类的全限定名
extends: 继承的基础结果映射
-->
<resultMap id="ListResultMap"
type="com.yf.exam.modules.user.exam.dto.response.UserExamRespDTO"
extends="BaseResultMap">
<!-- 映射考试标题列到 Java DTO 类的 title 属性 -->
<result column="title" property="title" />
<!-- 映射用户真实姓名列到 Java DTO 类的 realName 属性 -->
<result column="real_name" property="realName" />
</resultMap>
<!-- 分页查询方法
定义一个查询方法,根据条件进行分页查询,使用 ListResultMap 进行结果映射
id: 查询方法的唯一标识,对应 Java Mapper 接口中的方法名
resultMap: 指定使用的结果映射
-->
<select id="paging" resultMap="ListResultMap">
<!-- 从 el_user_exam 表中选取所有列,同时选取 el_exam 表的 title 列和 sys_user 表的 real_name 列 -->
SELECT ue.*,ee.title,uc.real_name FROM el_user_exam ue
<!-- 左连接 el_exam 表,通过 exam_id 和 id 关联 -->
LEFT JOIN el_exam ee ON ue.exam_id=ee.id
<!-- 左连接 sys_user 表,通过 user_id 和 id 关联 -->
LEFT JOIN sys_user uc ON ue.user_id=uc.id
<!-- 筛选条件:确保 el_exam 表和 sys_user 表的关联记录存在 -->
WHERE ee.id IS NOT NULL AND uc.id IS NOT NULL
<!-- 判断查询参数 query 是否不为空 -->
<if test="query!=null">
<!-- 判断查询参数中的 userId 属性是否不为空且不为空字符串 -->
<if test="query.userId!=null and query.userId!=''">
<!-- 注意:此处存在错误,应使用 #{query.userId} 进行参数绑定,避免 SQL 注入
正确写法AND ue.user_id = #{query.userId}
-->
AND ue.user_id='{{userId}}'
</if>
<!-- 判断查询参数中的 examId 属性是否不为空且不为空字符串 -->
<if test="query.examId!=null and query.examId!=''">
<!-- 添加筛选条件,根据考试 ID 过滤 -->
AND ue.exam_id = #{query.examId}
</if>
<!-- 判断查询参数中的 title 属性是否不为空且不为空字符串 -->
<if test="query.title!=null and query.title!=''">
<!-- 添加模糊查询条件,根据考试标题过滤 -->
AND ee.title LIKE CONCAT('%',#{query.title},'%')
</if>
<!-- 判断查询参数中的 realName 属性是否不为空且不为空字符串 -->
<if test="query.realName!=null and query.realName!=''">
<!-- 添加模糊查询条件,根据用户真实姓名过滤 -->
AND uc.real_name LIKE CONCAT('%',#{query.realName},'%')
</if>
</if>
</select>
</mapper>