<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xmomen.module.resource.entity.mapper.ResourceMapper">
  <!--
      定义结果映射，将数据库查询结果映射到 Java 对象。
      id: 结果映射的唯一标识。
      type: 要映射的 Java 实体类的全限定名。
  -->
  <resultMap id="BaseResultMap" type="com.xmomen.module.resource.entity.Resource">
    <!-- 映射数据库表中的主键列到实体类的属性 -->
    <id column="ID" property="id" jdbcType="VARCHAR" />
    <result column="ENTITY_TYPE" property="entityType" jdbcType="VARCHAR" />
    <result column="ENTITY_ID" property="entityId" jdbcType="VARCHAR" />
    <result column="PATH" property="path" jdbcType="VARCHAR" />
    <result column="RESOURCE_TYPE" property="resourceType" jdbcType="VARCHAR" />
    <result column="IS_DEFAULT" property="isDefault" jdbcType="INTEGER" />
  </resultMap>

  <!--
      定义 SQL 片段，用于生成 WHERE 子句。
      此片段根据传入的查询条件动态生成 WHERE 子句，支持多种条件类型（无值、单值、范围值、列表值）。
  -->
  <sql id="Example_Where_Clause">
    <where>
      <!-- 遍历所有的查询条件组 -->
      <foreach collection="oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <!-- 去除开头多余的 "and" -->
          <trim prefix="(" suffix=")" prefixOverrides="and">
            <!-- 遍历每个查询条件组中的具体条件 -->
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <!-- 处理无值条件 -->
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <!-- 处理单值条件 -->
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <!-- 处理范围值条件 -->
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <!-- 处理列表值条件 -->
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

  <!--
      定义 SQL 片段，用于生成 UPDATE 语句的 WHERE 子句。
      逻辑与 Example_Where_Clause 类似，用于根据条件更新数据。
  -->
  <sql id="Update_By_Example_Where_Clause">
    <where>
      <foreach collection="example.oredCriteria" item="criteria" separator="or">
        <if test="criteria.valid">
          <trim prefix="(" suffix=")" prefixOverrides="and">
            <foreach collection="criteria.criteria" item="criterion">
              <choose>
                <when test="criterion.noValue">
                  and ${criterion.condition}
                </when>
                <when test="criterion.singleValue">
                  and ${criterion.condition} #{criterion.value}
                </when>
                <when test="criterion.betweenValue">
                  and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                </when>
                <when test="criterion.listValue">
                  and ${criterion.condition}
                  <foreach collection="criterion.value" item="listItem" open="(" close=")" separator=",">
                    #{listItem}
                  </foreach>
                </when>
              </choose>
            </foreach>
          </trim>
        </if>
      </foreach>
    </where>
  </sql>

  <!-- 定义 SQL 片段，列出表中的基本列名 -->
  <sql id="Base_Column_List">
    ID, ENTITY_TYPE, ENTITY_ID, PATH, RESOURCE_TYPE, IS_DEFAULT
  </sql>

  <!--
      定义查询语句，根据条件查询资源数据。
      id: 语句的唯一标识。
      resultMap: 引用前面定义的结果映射，用于将查询结果映射到实体类。
      parameterType: 传入的参数类型，这里是查询条件对象。
  -->
  <select id="selectByExample" resultMap="BaseResultMap" parameterType="com.xmomen.module.resource.entity.ResourceExample">
    select
    <!-- 如果需要去重，添加 distinct 关键字 -->
    <if test="distinct">
      distinct
    </if>
    <!-- 引入基本列名片段 -->
    <include refid="Base_Column_List" />
    from cd_resource
    <!-- 如果传入了查询参数，引入 WHERE 子句片段 -->
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
    <!-- 如果有排序条件，添加排序子句 -->
    <if test="orderByClause != null">
      order by ${orderByClause}
    </if>
  </select>

  <!--
      定义删除语句，根据条件删除资源数据。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是查询条件对象。
  -->
  <delete id="deleteByExample" parameterType="com.xmomen.module.resource.entity.ResourceExample">
    delete from cd_resource
    <!-- 如果传入了查询参数，引入 WHERE 子句片段 -->
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </delete>

  <!--
      定义插入语句，选择性插入资源数据（只插入非空字段）。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是要插入的实体类对象。
      useGeneratedKeys: 是否使用数据库生成的主键。
      keyProperty: 实体类中表示主键的属性名。
      keyColumn: 数据库表中主键列的名称。
  -->
  <insert id="insertSelective" parameterType="com.xmomen.module.resource.entity.Resource" useGeneratedKeys="true" keyProperty="id" keyColumn="ID">
    <!-- 在插入前生成主键值，这里使用 UUID 并去除连字符 -->
    <selectKey resultType="java.lang.String" keyProperty="id" order="BEFORE">
      SELECT replace(UUID(),'-','')
    </selectKey>
    insert into cd_resource
    <!-- 动态生成插入的列名，只包含非空字段 -->
    <trim prefix="(" suffix=")" suffixOverrides=",">
      ID,
      <if test="entityType != null">
        ENTITY_TYPE,
      </if>
      <if test="entityId != null">
        ENTITY_ID,
      </if>
      <if test="path != null">
        PATH,
      </if>
      <if test="resourceType != null">
        RESOURCE_TYPE,
      </if>
      <if test="isDefault != null">
        IS_DEFAULT,
      </if>
    </trim>
    <!-- 动态生成插入的值，只包含非空字段 -->
    <trim prefix="values (" suffix=")" suffixOverrides=",">
      #{id,jdbcType=VARCHAR},
      <if test="entityType != null">
        #{entityType,jdbcType=VARCHAR},
      </if>
      <if test="entityId != null">
        #{entityId,jdbcType=VARCHAR},
      </if>
      <if test="path != null">
        #{path,jdbcType=VARCHAR},
      </if>
      <if test="resourceType != null">
        #{resourceType,jdbcType=VARCHAR},
      </if>
      <if test="isDefault != null">
        #{isDefault,jdbcType=INTEGER},
      </if>
    </trim>
  </insert>

  <!--
      定义统计语句，根据条件统计资源数据的数量。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是查询条件对象。
      resultType: 返回的结果类型，这里是整数类型。
  -->
  <select id="countByExample" parameterType="com.xmomen.module.resource.entity.ResourceExample" resultType="java.lang.Integer">
    select count(*) from cd_resource
    <!-- 如果传入了查询参数，引入 WHERE 子句片段 -->
    <if test="_parameter != null">
      <include refid="Example_Where_Clause" />
    </if>
  </select>

  <!--
      定义更新语句，根据条件选择性更新资源数据（只更新非空字段）。
      id: 语句的唯一标识。
      parameterType: 传入的参数类型，这里是一个包含实体类对象和查询条件的 Map。
  -->
  <update id="updateByExampleSelective" parameterType="map">
    update cd_resource
    <!-- 动态生成 SET 子句，只包含非空字段 -->
    <set>
      <if test="record.id != null">
        ID = #{record.id,jdbcType=VARCHAR},
      </if>
      <if test="record.entityType != null">
        ENTITY_TYPE = #{record.entityType,jdbcType=VARCHAR},
      </if>
      <if test="record.entityId != null">
        ENTITY_ID = #{record.entityId,jdbcType=VARCHAR},
      </if>
      <if test="record.path != null">
        PATH = #{record.path,jdbcType=VARCHAR},
      </if>
      <if test="record.resourceType != null">
        RESOURCE_TYPE = #{record.resourceType,jdbcType=VARCHAR},
      </if>
      <if test="record.isDefault != null">
        IS_DEFAULT = #{record.isDefault,jdbcType=INTEGER},
      </if>
    </set>
    <!-- 如果传入了查询参数，引入 UPDATE 的 WHERE 子句片段 -->
    <if test="_parameter != null">
      <include refid="Update_By_Example_Where_Clause" />
    </if>
  </update>
</mapper>