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/qu/QuMapper.xml

164 lines
12 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解析器如何正确解析该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的Mappernamespace属性指定了该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" />
<!-- 将数据库表中的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">
<!-- 定义一个名为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,
q.content AS q_content,
q.analysis as q_analysis,
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>