|
|
<?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的Mapper,namespace属性指定了该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 <= #{query.endTime}
|
|
|
<!-- 将数据库表中的end_time列与传入的query.endTime参数值进行比较,筛选出小于等于该值的数据,注意这里的<是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> |