<?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="org.xnat.BaseDao">
    <!-- 新增v1(以v开头的是版本的意思)-->
    <insert id="insert">
        insert into ${tableName}
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
            ${item.key}
        </foreach>
        values
        <foreach item="item" index="index" collection="list" open="(" separator="," close=")">
            #{item.value}
        </foreach>
    </insert>
    <!-- 新增v1_2
         useGeneratedKeys="true" keyProperty="id"
    -->
    <insert id="insert_v1_2" parameterType="map">
        insert into ${tableName}
        <foreach item="item" index="index" collection="autoMaps" open="(" separator="," close=")">
            ${item.key}
        </foreach>
        values
        <foreach item="item" index="index" collection="autoMaps" open="(" separator="," close=")">
            #{item.value}
        </foreach>
        <selectKey resultType="int" keyProperty="autoKey" order="AFTER">
            select LAST_INSERT_ID() as autoKey
        </selectKey>
        <!--
         -->
    </insert>
    
    
    <!-- 查询select_v4-->
    <select id="select_v4" resultType="hashmap">
        select
        <!-- 选择的字段 -->
        <foreach collection="selectFields" item="item" separator=",">`${item}`</foreach>
        from ${tableName}
        <!-- 条件 -->
        <where>
            <if test="conditions != null">
                <foreach collection="conditions" item="condition" separator=" and ">
                <!--
                ${condition.key} ${condition.denotation} #{condition.value}
                这种不能适应 denotation 为 "in" value 为 "(v1, v2)"
                ${condition.key} ${condition.denotation} ${condition.value}
                这种不能适应  ${condition.value} 为字符串
                -->
                    `${condition.key}` ${condition.denotation} #{condition.value}
                </foreach>
            </if>
        </where>
        <!-- 分组 list<String>-->
        <if test="group != null">
            group by
            <foreach collection="group" item="item" separator=", ">
                ${item}
            </foreach>
        </if>
        <!-- group 后的having 条件 -->
        <if test="havingSql != null and group != null">
            ${havingSql}
        </if>
        <!-- 排序 -->
        <if test="sort != null">
            order by
            <foreach collection="sort" item="item" separator=", ">
                ${item.key} ${item.value}
            </foreach>
        </if>
        <!-- 分页 -->
        <if test="page != null">
            LIMIT #{page.start}, #{page.limit}
        </if>
    </select>
    <!-- 查询select_v4_2-->
    <select id="select_v4_2" resultType="hashmap">
        select
        <!-- 选择的字段 -->
        <foreach collection="selectFields" item="item" separator=",">`${item}`</foreach>
        from ${tableName}
        <!-- 条件 -->
        <if test="conditionSql != null">
        ${conditionSql}
        </if>
        <!-- 分组 list<String>-->
        <if test="group != null">
            group by
            <foreach collection="group" item="item" separator=", ">
                ${item}
            </foreach>
        </if>
        <!-- group 后的having 条件 -->
        <if test="havingSql != null and group != null">
            ${havingSql}
        </if>
        <!-- 排序 -->
        <if test="sort != null">
            order by
            <foreach collection="sort" item="item" separator=", ">
                ${item.key} ${item.value}
            </foreach>
        </if>
        <!-- 分页 -->
        <if test="page != null">
            LIMIT #{page.start}, #{page.limit}
        </if>
    </select>
    <!-- 删除_v3-->
    <delete id="delete_v3">
        delete from ${tableName}
        <where>
            <if test="conditions != null">
                <foreach item="item" index="index" collection="conditions" separator=" and ">
                    ${item.key}${item.denotation}#{item.value}
                </foreach>
            </if>
        </where>
    </delete>
    <!-- 删除_v3-->
    <delete id="delete_v3_2">
        delete from ${tableName}
        <if test="conditionSql != null">${conditionSql}</if>
    </delete>
    
    
    <!-- 更新_v2-->
    <update id="update_v2">
        update ${tableName}
        <set>
        <foreach item="item" index="index" collection="list" separator=",">
            ${item.key}=#{item.value}
        </foreach>
        </set>
        <where>
            <if test="conditions != null">
                <foreach item="item" index="index" collection="conditions" separator=" and ">
                    ${item.key} ${item.denotation} #{item.value}
                </foreach>
            </if>
        </where>
    </update>
    <!-- 更新_v2-->
    <update id="update_v2_2">
        update ${tableName}
        <set>
        <foreach item="item" index="index" collection="list" separator=",">
            ${item.key}=#{item.value}
        </foreach>
        </set>
        <if test="conditionSql != null">${conditionSql}</if>
    </update>
    
    <!-- 查询实体存在的数量-->
    <select id="getTotal" resultType="int">
        select count(*) from ${tableName}
        <where>
            <if test="conditions != null">
                <foreach item="item" index="index" collection="conditions" separator=" and ">
                    <!--
                    ${item.key} ${item.denotation} #{item.value}
                    不能用于 key != ''
                     -->
                    `${item.key}` ${item.denotation} #{item.value}
                </foreach>
            </if>
        </where>
    </select>
    <!-- 查询实体存在的数量-->
    <select id="getTotal_v1_2" resultType="int">
        select count(*) from ${tableName}
        <if test="conditionSql != null">${conditionSql}</if>
    </select>
    
    <!-- 统计一个字段所有值的和-->
    <select id="countField" resultType="long">
        select sum(${fieldName}) from ${tableName}
        <where>
            <if test="conditions != null">
                <foreach item="item" index="index" collection="conditions" separator=" and ">
                    `${item.key}` ${item.denotation} #{item.value}
                </foreach>
            </if>
        </where>
    </select>
    
    <!-- 自定义sql查询-->
    <select id="selectSql" resultType="hashmap">
        ${sql}
    </select>
    
    
</mapper>