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.
test/src-源文件/main/resources/mapper/exam/ExamMapper.xml

144 lines
10 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 version="1.0" encoding="UTF-8"?>
<!-- XML声明指定了XML的版本为1.0字符编码采用UTF-8这是告诉解析器如何正确解析该XML文件的基本信息 -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 文档类型定义DOCTYPE声明表明此XML文档遵循MyBatis的Mapper 3.0的文档类型定义DTD规范同时给出了DTD文件的网络地址以便解析器能依据该DTD验证XML文档结构的正确性 -->
<mapper namespace="com.yf.exam.modules.exam.mapper.ExamMapper">
<!-- 定义了一个MyBatis的Mappernamespace属性指定了该Mapper在整个项目中的唯一标识这里对应着com.yf.exam.modules.exam.mapper.ExamMapper接口用于将XML中的SQL语句与对应的Java接口方法关联起来 -->
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.yf.exam.modules.exam.entity.Exam">
<!-- 开始定义一个名为BaseResultMap的结果映射用于将数据库查询结果准确地映射到指定的Java对象这里是Exam类型。id属性为该结果映射的唯一标识符 -->
<id column="id" property="id" />
<!-- 定义主键的映射关系将数据库表中的id列的值映射到Java对象的id属性上。column属性指定数据库表中的列名property属性指定要映射到的Java对象中的属性名 -->
<result column="title" property="title" />
<!-- 把数据库表中的title列的值映射到Java对象的title属性 -->
<result column="content" property="content" />
<!-- 将数据库表中的content列的值映射到Java对象的content属性 -->
<result column="open_type" property="openType" />
<!-- 映射数据库表中的open_type列到Java对象的openType属性注意这里在Java对象中属性名采用了驼峰命名法与数据库列名可能存在格式差异 -->
<result column="state" property="state" />
<!-- 把数据库表中的state列的值映射到Java对象的state属性 -->
<result column="time_limit" property="timeLimit" />
<!-- 映射数据库表中的time_limit列到Java对象的timeLimit属性 -->
<result column="start_time" property="startTime" />
<!-- 将数据库表中的start_time列的值映射到Java对象的startTime属性 -->
<result column="end_time" property="endTime" />
<!-- 把数据库表中的end_time列的值映射到Java对象的endTime属性 -->
<result column="create_time" property="createTime" />
<!-- 映射数据库表中的create_time列到Java对象的createTime属性 -->
<result column="update_time" property="updateTime" />
<!-- 将数据库表中的update_time列的值映射到Java对象的updateTime属性 -->
<result column="total_score" property="totalScore" />
<!-- 把数据库表中的total_score列的值映射到Java对象的totalScore属性 -->
<result column="total_time" property="totalTime" />
<!-- 映射数据库表中的total_time列到Java对象的totalTime属性 -->
<result column="qualify_score" property="qualifyScore" />
<!-- 将数据库表中的qualify_score列的值映射到Java对象的qualifyScore属性 -->
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
<!-- 定义了一个名为Base_Column_List的SQL片段可在其他SQL语句中引用这里列出了通用查询时要从数据库表中选择的列名使用反引号`括起来是为了防止列名是SQL关键字时出现语法错误 -->
`id`,`title`,`content`,`open_type`,`join_type`,`level`,`state`,`time_limit`,`start_time`,`end_time`,`create_time`,`update_time`,`total_score`,`total_time`,`qualify_score`
</sql>
<resultMap id="ReviewResultMap"
type="com.yf.exam.modules.exam.dto.response.ExamReviewRespDTO"
extends="BaseResultMap">
<!-- 定义一个名为ReviewResultMap的结果映射它的类型是ExamReviewRespDTO并且通过extends属性继承了BaseResultMap意味着它会包含BaseResultMap中定义的所有映射关系在此基础上还可以添加新的映射关系 -->
<result column="examUser" property="examUser" />
<!-- 新增的映射关系将数据库表中的examUser列的值映射到Java对象的examUser属性 -->
<result column="unreadPaper" property="unreadPaper" />
<!-- 将数据库表中的unreadPaper列的值映射到Java对象的unreadPaper属性 -->
</resultMap>
<resultMap id="ListResultMap"
type="com.yf.exam.modules.exam.dto.ExamDTO"
extends="BaseResultMap">
<!-- 定义名为ListResultMap的结果映射类型为ExamDTO同样继承了BaseResultMap可在其基础上进行扩展但这里暂时没有添加新的映射关系 -->
</resultMap>
<select id="paging" resultMap="ListResultMap">
<!-- 定义一个名为paging的查询语句其结果将按照ListResultMap定义的映射关系进行映射 -->
SELECT * FROM el_exam
<where>
<!-- <where>标签用于动态生成WHERE子句根据条件判断是否添加相应的条件语句 -->
<if test="query!=null">
<!-- <if>标签用于条件判断这里判断传入的参数query是否不为空 -->
<if test="query.title!=null and query.title!=''">
<!-- 进一步判断query对象中的title属性是否不为空且不为空字符串如果满足条件则添加以下WHERE子句条件 -->
AND title LIKE CONCAT('%',#{query.title},'%')
<!-- 使用LIKE关键字进行模糊查询将查询条件中的title值与数据库表中的title列进行模糊匹配#{query.title}是MyBatis的参数占位符会被实际传入的参数值替换 -->
</if>
<if test="query.openType!=null">
<!-- 判断query对象中的openType属性是否不为空如果是则添加以下WHERE子句条件 -->
AND open_type = #{query.openType}
<!-- 将数据库表中的open_type列与传入的query.openType参数值进行精确匹配 -->
</if>
<if test="query.startTime!=null">
<!-- 判断query对象中的startTime属性是否不为空如果是则添加以下WHERE子句条件 -->
AND start_time >= #{query.startTime}
<!-- 将数据库表中的start_time列与传入的query.startTime参数值进行比较筛选出大于等于该值的数据 -->
</if>
<if test="query.endTime!=null">
<!-- 判断query对象中的endTime属性是否不为空如果是则添加以下WHERE子句条件 -->
AND end_time &lt;= #{query.endTime}
<!-- 将数据库表中的end_time列与传入的query.endTime参数值进行比较筛选出小于等于该值的数据注意这里的&lt;是XML中表示小于号<的转义字符因为在XML中<有特殊含义,需要转义 -->
</if>
</if>
</where>
</select>
<select id="reviewPaging" resultMap="ReviewResultMap">
<!-- 定义一个名为reviewPaging的查询语句其结果将按照ReviewResultMap定义的映射关系进行映射 -->
SELECT ex.*,
(SELECT COUNT(DISTINCT user_id) FROM el_paper WHERE exam_id=ex.id) as examUser,
<!-- 通过子查询计算出与当前考试ex.id相关的不同用户ID的数量并将其命名为examUser这个值将根据ReviewResultMap的映射关系映射到对应的Java对象属性上 -->
(SELECT COUNT(0) FROM el_paper WHERE exam_id=ex.id AND state=1) as unreadPaper
<!-- 通过子查询计算出与当前考试ex.id相关且状态为1的记录数量并将其命名为unreadPaper同样会根据映射关系映射到Java对象属性上 -->
FROM el_exam ex
WHERE ex.has_saq=1
<!-- 添加WHERE子句条件筛选出el_exam表中has_saq列值为1的记录 -->
</select>
<resultMap id="OnlineResultMap"
type="com.yf.exam.modules.exam.dto.response.ExamOnlineRespDTO"
extends="BaseResultMap">
<!-- 定义名为OnlineResultMap的结果映射类型为ExamOnlineRespDTO继承了BaseResultMap可在此基础上扩展但这里暂未添加新映射关系 -->
</resultMap>
<select id="online" resultMap="OnlineResultMap">
<!-- 定义一个名为online的查询语句其结果将按照OnlineResultMap定义的映射关系进行映射 -->
SELECT ex.*
FROM el_exam ex
LEFT JOIN el_exam_depart dept ON ex.id=dept.exam_id AND ex.open_type=2
<!-- 使用LEFT JOIN连接el_exam表和el_exam_depart表连接条件是ex.id等于dept.exam_id且ex.open_type等于2 -->
LEFT JOIN sys_user uc ON uc.depart_id=dept.depart_id
<!-- 再使用LEFT JOIN连接上一步的结果和sys_user表连接条件是uc.depart_id等于dept.depart_id -->
WHERE ex.state=0 AND (ex.open_type=1 OR ex.open_type=3 OR uc.id='{{userId}}')
<!-- 添加WHERE子句条件筛选出el_exam表中state列值为0且满足open_type等于1或open_type等于3或uc.id等于传入的{{userId}}参数值)的记录 -->
<if test="query!=null">
<!-- 判断传入的参数query是否不为空 -->
<if test="query.title!=null and query.title!=''">
<!-- 进一步判断query对象中的title属性是否不为空且不为空字符串如果满足条件则添加以下WHERE子句条件 -->
AND ex.title LIKE CONCAT('%',#{query.title},'%')
<!-- 使用LIKE关键字进行模糊查询将查询条件中的title值与数据库表中的ex.title列进行模糊匹配#{query.title}是MyBatis的参数占位符会被实际传入的参数值替换 -->
</if>
<if test="query.openType!=null">
<!-- 判断query对象中的openType属性是否不为空如果是则添加以下WHERE子句条件 -->
AND ex.open_type=#{query.openType}
<!-- 将数据库表中的ex.open_type列与传入的query.openType参数值进行精确匹配 -->
</if>
</if>
</select>
</mapper>