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/repo/RepoMapper.xml

79 lines
6.5 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.repo.mapper.RepoMapper">
<!-- 定义了一个MyBatis的Mappernamespace属性指定了该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>