|
|
<?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.repo.mapper.RepoMapper">
|
|
|
<!-- 定义了一个MyBatis的Mapper,namespace属性指定了该Mapper在整个项目中的唯一标识,这里对应着com.yf.exam.modules.repo.mapper.RepoMapper接口,用于将XML中的SQL语句与对应的Java接口方法关联起来 -->
|
|
|
|
|
|
<!-- 通用查询映射结果 -->
|
|
|
<resultMap id="BaseResultMap" type="com.yf.exam.modules.repo.entity.Repo">
|
|
|
<!-- 开始定义一个名为BaseResultMap的结果映射,用于将数据库查询结果准确地映射到指定的Java对象(这里是Repo类型)。id属性为该结果映射的唯一标识符 -->
|
|
|
<id column="id" property="id" />
|
|
|
<!-- 定义主键的映射关系,将数据库表中的id列的值映射到Java对象的id属性上。column属性指定数据库表中的列名,property属性指定要映射到的Java对象中的属性名 -->
|
|
|
<result column="code" property="code" />
|
|
|
<!-- 把数据库表中的code列的值映射到Java对象的code属性 -->
|
|
|
<result column="title" property="title" />
|
|
|
<!-- 将数据库表中的title列的值映射到Java对象的title属性 -->
|
|
|
<result column="remark" property="remark" />
|
|
|
<!-- 把数据库表中的remark列的值映射到Java对象的remark属性 -->
|
|
|
<result column="create_time" property="createTime" />
|
|
|
<!-- 将数据库表中的create_time列的值映射到Java对象的createTime属性 -->
|
|
|
<result column="update_time" property="updateTime" />
|
|
|
<!-- 把数据库表中的update_time列的值映射到Java对象的updateTime属性 -->
|
|
|
</resultMap>
|
|
|
|
|
|
<!-- 通用查询结果列 -->
|
|
|
<sql id="Base_Column_List">
|
|
|
<!-- 定义了一个名为Base_Column_List的SQL片段,可在其他SQL语句中引用,这里列出了通用查询时要从数据库表中选择的列名,使用反引号(`)括起来是为了防止列名是SQL关键字时出现语法错误 -->
|
|
|
`id`,`code`,`title`,`radio_count`,`multi_count`,`judge_count`,`remark`,`create_time`,`update_time`
|
|
|
</sql>
|
|
|
|
|
|
|
|
|
<resultMap id="ListResultMap"
|
|
|
type="com.yf.exam.modules.repo.dto.response.RepoRespDTO"
|
|
|
extends="BaseResultMap">
|
|
|
<!-- 定义一个名为ListResultMap的结果映射,它的类型是RepoRespDTO,并且通过extends属性继承了BaseResultMap,意味着它会包含BaseResultMap中定义的所有映射关系,在此基础上还可以添加新的映射关系 -->
|
|
|
<result column="radio_count" property="radioCount" />
|
|
|
<!-- 新增的映射关系,将数据库表中的radio_count列的值映射到Java对象的radioCount属性 -->
|
|
|
<result column="multi_count" property="multiCount" />
|
|
|
<!-- 将数据库表中的multi_count列的值映射到Java对象的multiCount属性 -->
|
|
|
<result column="judge_count" property="judgeCount" />
|
|
|
<!-- 把数据库表中的judge_count列的值映射到Java对象的judgeCount属性 -->
|
|
|
</resultMap>
|
|
|
|
|
|
<select id="paging" resultMap="ListResultMap">
|
|
|
<!-- 定义一个名为paging的查询语句,其结果将按照ListResultMap定义的映射关系进行映射 -->
|
|
|
SELECT `id`, `code`, `title`, `remark`, `create_time`, `update_time`,
|
|
|
(SELECT COUNT(0) FROM el_qu_repo WHERE repo_id=repo.id AND qu_type=1) AS radio_count,
|
|
|
<!-- 通过子查询计算出在el_qu_repo表中,repo_id等于当前查询结果中的repo.id且qu_type为1的记录数量,并将其命名为radio_count,这个值将根据ListResultMap的映射关系映射到对应的Java对象属性上 -->
|
|
|
(SELECT COUNT(0) FROM el_qu_repo WHERE repo_id=repo.id AND qu_type=2) AS multi_count,
|
|
|
<!-- 同样通过子查询计算出在el_qu_repo表中,repo_id等于当前查询结果中的repo.id且qu_type为2的记录数量,并将其命名为multi_count,会根据映射关系映射到Java对象属性上 -->
|
|
|
(SELECT COUNT(0) FROM el_qu_repo WHERE repo_id=repo.id AND qu_type=3) AS judge_count
|
|
|
<!-- 再次通过子查询计算出在el_qu_repo表中,repo_id等于当前查询结果中的repo.id且qu_type为3的记录数量,并将其命名为judge_count,也会按照映射关系映射到Java对象属性上 -->
|
|
|
FROM el_repo repo
|
|
|
<where>
|
|
|
<!-- <where>标签用于动态生成WHERE子句,根据条件判断是否添加相应的条件语句 -->
|
|
|
<if test="query!=null">
|
|
|
<!-- <if>标签用于条件判断,这里判断传入的参数query是否不为空 -->
|
|
|
<if test="query.title!=null and query.title!=''">
|
|
|
<!-- 进一步判断query对象中的title属性是否不为空且不为空字符串,如果满足条件则添加以下WHERE子句条件 -->
|
|
|
AND repo.title LIKE CONCAT('%',#{query.title}, '%')
|
|
|
<!-- 使用LIKE关键字进行模糊查询,将查询条件中的title值与数据库表中的repo.title列进行模糊匹配,#{query.title}是MyBatis的参数占位符,会被实际传入的参数值替换 -->
|
|
|
</if>
|
|
|
<if test="query.excludes!=null and query.excludes.size()>0">
|
|
|
<!-- 进一步判断query对象中的excludes属性是否不为空且集合大小大于0,如果满足条件则添加以下WHERE子句条件 -->
|
|
|
AND repo.id NOT IN
|
|
|
<!-- 添加条件使得查询结果中的repo.id不在query.excludes所包含的列表值中 -->
|
|
|
<foreach collection="query.excludes" open="(" close=")" separator="," item="id">
|
|
|
<!-- 使用<foreach>标签遍历query.excludes集合,将集合中的每个元素(这里用#{id}表示,通过#符号进行参数替换,相对安全)作为一个值放在NOT IN子句中,open、close、separator分别指定了括号的开头、结尾和元素之间的分隔符 -->
|
|
|
#{id}
|
|
|
</foreach>
|
|
|
</if>
|
|
|
</if>
|
|
|
</where>
|
|
|
</select>
|
|
|
|
|
|
|
|
|
</mapper> |