|
|
|
@ -1,90 +1,145 @@
|
|
|
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
|
<!-- XML声明,指定了XML的版本为1.0以及字符编码为UTF-8,这是告诉XML解析器如何正确解析该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.qu.mapper.QuMapper">
|
|
|
|
|
<!-- 定义了一个MyBatis的Mapper,namespace属性指定了该Mapper在整个项目中的唯一标识,这里对应着com.yf.exam.modules.qu.mapper.QuMapper接口,用于将XML中的SQL语句与对应的Java接口方法关联起来 -->
|
|
|
|
|
|
|
|
|
|
<!-- 通用查询映射结果 -->
|
|
|
|
|
<resultMap id="BaseResultMap" type="com.yf.exam.modules.qu.entity.Qu">
|
|
|
|
|
<!-- 开始定义一个名为BaseResultMap的结果映射,用于将数据库查询结果准确地映射到指定的Java对象(这里是Qu类型)。id属性为该结果映射的唯一标识符 -->
|
|
|
|
|
<id column="id" property="id" />
|
|
|
|
|
<!-- 定义主键的映射关系,将数据库表中的id列的值映射到Java对象的id属性上。column属性指定数据库表中的列名,property属性指定要映射到的Java对象中的属性名 -->
|
|
|
|
|
<result column="qu_type" property="quType" />
|
|
|
|
|
<!-- 把数据库表中的qu_type列的值映射到Java对象的quType属性 -->
|
|
|
|
|
<result column="level" property="level" />
|
|
|
|
|
<!-- 将数据库表中的level列的值映射到Java对象的level属性 -->
|
|
|
|
|
<result column="image" property="image" />
|
|
|
|
|
<!-- 把数据库表中的image列的值映射到Java对象的image属性 -->
|
|
|
|
|
<result column="content" property="content" />
|
|
|
|
|
<!-- 将数据库表中的content列的值映射到Java对象的content属性 -->
|
|
|
|
|
<result column="create_time" property="createTime" />
|
|
|
|
|
<!-- 把数据库表中的create_time列的值映射到Java对象的createTime属性 -->
|
|
|
|
|
<result column="update_time" property="updateTime" />
|
|
|
|
|
<!-- 将数据库表中的update_time列的值映射到Java对象的updateTime属性 -->
|
|
|
|
|
<result column="remark" property="remark" />
|
|
|
|
|
<!-- 把数据库表中的remark列的值映射到Java对象的remark属性 -->
|
|
|
|
|
<result column="analysis" property="analysis" />
|
|
|
|
|
</resultMap>
|
|
|
|
|
<!-- 将数据库表中的analysis列的值映射到Java对象的analysis属性 -->
|
|
|
|
|
</resultMap>
|
|
|
|
|
|
|
|
|
|
<!-- 通用查询结果列 -->
|
|
|
|
|
<sql id="Base_Column_List">
|
|
|
|
|
<!-- 定义了一个名为Base_Column_List的SQL片段,可在其他SQL语句中引用,这里列出了通用查询时要从数据库表中选择的列名,使用反引号(`)括起来是为了防止列名是SQL关键字时出现语法错误 -->
|
|
|
|
|
`id`,`qu_type`,`level`,`image`,`content`,`create_time`,`update_time`,`remark`,`analysis`
|
|
|
|
|
</sql>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 随机取数据 -->
|
|
|
|
|
<select id="listByRandom" resultMap="BaseResultMap">
|
|
|
|
|
<!-- 定义一个名为listByRandom的查询语句,其结果将按照BaseResultMap定义的映射关系进行映射 -->
|
|
|
|
|
SELECT a.*
|
|
|
|
|
<!-- 选择el_qu表(a)中的所有列数据 -->
|
|
|
|
|
FROM el_qu a
|
|
|
|
|
LEFT JOIN el_qu_repo b ON a.id=b.qu_id
|
|
|
|
|
<!-- 使用LEFT JOIN连接el_qu表(a)和el_qu_repo表(b),连接条件是a.id等于b.qu_id,这样可以关联题目(el_qu表)和题目资源库(el_qu_repo表)的相关信息 -->
|
|
|
|
|
WHERE b.repo_id=#{repoId} AND a.qu_type=#{quType}
|
|
|
|
|
<!-- 添加WHERE子句条件,筛选出在el_qu_repo表中repo_id等于传入的#{repoId}参数值且在el_qu表中qu_type等于传入的#{quType}参数值的记录 -->
|
|
|
|
|
<if test="excludes!=null">
|
|
|
|
|
<!-- <if>标签用于条件判断,这里判断传入的参数excludes是否不为空 -->
|
|
|
|
|
AND a.id NOT IN
|
|
|
|
|
<!-- 当excludes不为空时,添加条件使得查询结果中的a.id不在excludes所包含的列表值中 -->
|
|
|
|
|
<foreach item="item" collection="excludes" separator="," open="(" close=")" index="">'${item}'</foreach>
|
|
|
|
|
<!-- 使用<foreach>标签遍历excludes集合,将集合中的每个元素(这里用'${item}'表示,注意这里是使用$符号进行字符串拼接,可能存在SQL注入风险,要确保数据来源可靠)作为一个值放在IN子句中,open、close、separator分别指定了括号的开头、结尾和元素之间的分隔符 -->
|
|
|
|
|
</if>
|
|
|
|
|
ORDER BY RAND()
|
|
|
|
|
<!-- 按照随机顺序对查询结果进行排序,使得每次查询结果的顺序是随机的 -->
|
|
|
|
|
LIMIT ${size}
|
|
|
|
|
<!-- 限制查询结果的数量为传入的${size}参数值,同样这里使用$符号进行参数替换,要注意数据来源的安全性 -->
|
|
|
|
|
</select>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<resultMap id="ExportResultMap" type="com.yf.exam.modules.qu.dto.export.QuExportDTO">
|
|
|
|
|
<!-- 定义一个名为ExportResultMap的结果映射,它的类型是QuExportDTO,用于将数据库查询结果映射到特定的用于导出的DTO对象 -->
|
|
|
|
|
<id column="q_id" property="qId" />
|
|
|
|
|
<!-- 定义主键的映射关系,将数据库表中的q_id列的值映射到Java对象的qId属性上 -->
|
|
|
|
|
<result column="qu_type" property="quType" />
|
|
|
|
|
<!-- 把数据库表中的qu_type列的值映射到Java对象的quType属性 -->
|
|
|
|
|
<result column="q_content" property="qContent" />
|
|
|
|
|
<!-- 将数据库表中的q_content列的值映射到Java对象的qContent属性 -->
|
|
|
|
|
<result column="q_analysis" property="qAnalysis" />
|
|
|
|
|
<!-- 把数据库表中的q_analysis列的值映射到Java对象的qAnalysis属性 -->
|
|
|
|
|
<result column="a_is_right" property="aIsRight" />
|
|
|
|
|
<!-- 将数据库表中的a_is_right列的值映射到Java对象的aIsRight属性 -->
|
|
|
|
|
<result column="a_content" property="aContent" />
|
|
|
|
|
<!-- 把数据库表中的a_content列的值映射到Java对象的aContent属性 -->
|
|
|
|
|
<result column="a_analysis" property="aAnalysis" />
|
|
|
|
|
<!-- 将数据库表中的a_analysis列的值映射到Java对象的aAnalysis属性 -->
|
|
|
|
|
<collection property="repoList" column="q_id" select="selectRepos"/>
|
|
|
|
|
<!-- 使用<collection>标签来处理一对多的关系,这里表示将根据q_id列的值从selectRepos查询中获取多条记录,并将这些记录映射到Java对象的repoList属性上。column属性用于指定传递给子查询的参数,select属性指定了要调用的子查询的方法名(这里对应下面定义的selectRepos查询) -->
|
|
|
|
|
</resultMap>
|
|
|
|
|
|
|
|
|
|
<select id="selectRepos" resultType="String">
|
|
|
|
|
SELECT repo_id FROM el_qu_repo po WHERE po.qu_id=#{qId}
|
|
|
|
|
</select>
|
|
|
|
|
<!-- 定义一个名为selectRepos的查询语句,其结果类型为字符串(String),用于查询与特定题目(由qId指定)相关的资源库ID -->
|
|
|
|
|
SELECT repo_id FROM el_qu_repo po WHERE po.qu_id=#{qId}
|
|
|
|
|
<!-- 从el_qu_repo表(po)中选择repo_id列,筛选条件是po.qu_id等于传入的#{qId}参数值 -->
|
|
|
|
|
</select>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<sql id="query">
|
|
|
|
|
<!-- 定义一个名为query的SQL片段,可在其他SQL语句中引用,用于构建动态查询条件 -->
|
|
|
|
|
<where>
|
|
|
|
|
<!-- <where>标签用于动态生成WHERE子句,根据条件判断是否添加相应的条件语句 -->
|
|
|
|
|
<if test="query!=null">
|
|
|
|
|
<!-- <if>标签用于条件判断,这里判断传入的参数query是否不为空 -->
|
|
|
|
|
<if test="query.quType!=null">
|
|
|
|
|
<!-- 进一步判断query对象中的quType属性是否不为空,如果满足条件则添加以下WHERE子句条件 -->
|
|
|
|
|
AND q.qu_type = #{query.quType}
|
|
|
|
|
<!-- 将数据库表中的q.qu_type列与传入的query.quType参数值进行精确匹配 -->
|
|
|
|
|
</if>
|
|
|
|
|
<if test="query.repoIds!=null and query.repoIds.size()>0">
|
|
|
|
|
<!-- 进一步判断query对象中的repoIds属性是否不为空且集合大小大于0,如果满足条件则添加以下WHERE子句条件 -->
|
|
|
|
|
AND po.repo_id IN
|
|
|
|
|
<!-- 使用IN子句,将po.repo_id列的值与query.repoIds集合中的元素进行匹配 -->
|
|
|
|
|
<foreach collection="query.repoIds" open="(" close=")" separator="," item="repoId">#{repoId}</foreach>
|
|
|
|
|
<!-- 使用<foreach>标签遍历query.repoIds集合,将集合中的每个元素(这里用#{repoId}表示,通过#符号进行参数替换,相对安全)作为一个值放在IN子句中,open、close、separator分别指定了括号的开头、结尾和元素之间的分隔符 -->
|
|
|
|
|
</if>
|
|
|
|
|
<if test="query.content!=null and query.content!=''">
|
|
|
|
|
<!-- 进一步判断query对象中的content属性是否不为空且不为空字符串,如果满足条件则添加以下WHERE子句条件 -->
|
|
|
|
|
AND q.content LIKE CONCAT('%',#{query.content},'%')
|
|
|
|
|
<!-- 使用LIKE关键字进行模糊查询,将查询条件中的content值与数据库表中的q.content列进行模糊匹配,#{query.content}是MyBatis的参数占位符,会被实际传入的参数值替换 -->
|
|
|
|
|
</if>
|
|
|
|
|
<if test="query.excludes!=null and query.excludes.size()>0">
|
|
|
|
|
<!-- 进一步判断query对象中的excludes属性是否不为空且集合大小大于0,如果满足条件则添加以下WHERE子句条件 -->
|
|
|
|
|
AND q.id NOT IN
|
|
|
|
|
<!-- 添加条件使得查询结果中的q.id不在query.excludes所包含的列表值中 -->
|
|
|
|
|
<foreach collection="query.excludes" open="(" close=")" separator="," item="quId">
|
|
|
|
|
#{quId}
|
|
|
|
|
</foreach>
|
|
|
|
|
<!-- 使用<foreach>标签遍历query.excludes集合,将集合中的每个元素(这里用#{quId}表示,通过#符号进行参数替换,相对安全)作为一个值放在NOT IN子句中,open、close、separator分别指定了括号的开头、结尾和元素之间的分隔符 -->
|
|
|
|
|
</if>
|
|
|
|
|
</if>
|
|
|
|
|
</where>
|
|
|
|
|
</sql>
|
|
|
|
|
|
|
|
|
|
<select id="paging" resultMap="BaseResultMap">
|
|
|
|
|
<!-- 定义一个名为paging的查询语句,其结果将按照BaseResultMap定义的映射关系进行映射 -->
|
|
|
|
|
SELECT q.*
|
|
|
|
|
<!-- 选择el_qu表(q)中的所有列数据 -->
|
|
|
|
|
FROM el_qu q
|
|
|
|
|
LEFT JOIN el_qu_repo po ON q.id=po.qu_id
|
|
|
|
|
<!-- 使用LEFT JOIN连接el_qu表(q)和el_qu_repo表(po),连接条件是q.id等于po.qu_id,这样可以关联题目(el_qu表)和题目资源库(el_qu_repo表)的相关信息 -->
|
|
|
|
|
<include refid="query" />
|
|
|
|
|
<!-- 引用上面定义的query SQL片段,将其包含的动态查询条件添加到当前查询语句中 -->
|
|
|
|
|
GROUP BY q.id ORDER BY q.update_time DESC
|
|
|
|
|
<!-- 按照q.id进行分组,然后按照q.update_time列的值进行降序排序,以便获取最新更新的记录排在前面 -->
|
|
|
|
|
</select>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<select id="listForExport" resultMap="ExportResultMap">
|
|
|
|
|
<!-- 定义一个名为listForExport的查询语句,其结果将按照ExportResultMap定义的映射关系进行映射 -->
|
|
|
|
|
SELECT
|
|
|
|
|
q.id as q_id,
|
|
|
|
|
q.qu_type,
|
|
|
|
@ -93,12 +148,17 @@
|
|
|
|
|
a.content as a_content,
|
|
|
|
|
a.is_right as a_is_right,
|
|
|
|
|
a.analysis as a_analysis
|
|
|
|
|
<!-- 从el_qu表(q)和el_qu_answer表(a)中选择指定列的数据,同时对某些列进行别名设置,以便在结果映射时能准确对应到ExportResultMap中定义的属性 -->
|
|
|
|
|
FROM el_qu q
|
|
|
|
|
LEFT JOIN el_qu_answer a ON q.id=a.qu_id
|
|
|
|
|
LEFT JOIN el_qu_repo po ON q.id=po.qu_id
|
|
|
|
|
<!-- 使用LEFT JOIN连接el_qu表(q)、el_qu_answer表(a)和el_qu_repo表(po),连接条件分别是q.id等于a.qu_id和q.id等于po.qu_id,这样可以关联题目、题目答案以及题目资源库的相关信息 -->
|
|
|
|
|
<include refid="query" />
|
|
|
|
|
<!-- 引用上面定义的query SQL片段,将其包含的动态查询条件添加到当前查询语句中 -->
|
|
|
|
|
GROUP BY a.id ORDER BY q.id
|
|
|
|
|
<!-- 按照a.id进行分组,然后按照q.id列的值进行排序,以便以特定顺序展示查询结果 -->
|
|
|
|
|
LIMIT 10000
|
|
|
|
|
<!-- 限制查询结果的数量为10000条 -->
|
|
|
|
|
</select>
|
|
|
|
|
|
|
|
|
|
</mapper>
|
|
|
|
|
</mapper>
|