zoukankan      html  css  js  c++  java
  • mybatis操作mysql的奇淫技巧总结(代码库)

    1、添加公共sql代码段

    使用<sql> <include> 标签

    <sql id="userSubassemblyRecordParam">
        id, user_id, lesson_id, subassembly_id, record_id, course_id, teacher_id, status, create_time, update_time
    </sql>
    
    <select id="listUserSubassemblyRecordByParam" resultMap="userSubassemblyRecordMap">
        SELECT
          <include refid="userSubassemblyRecordParam"/>
        FROM
          rel_user_subassembly_record
    </select>

    2、动态更新

    选择更新,为空则不更新,在<set> 标签里添加 <if> 标签,不需要考虑<if> 标签里的逗号 

    <update id="updateSchoolLevel" parameterType="com.ajz.course.entity.School">
        UPDATE
          school
        <set>
            <if test="gaokao != null">
                gaokao = #{gaokao},
            </if>
            <if test="contest != null">
                contest = #{contest},
            </if>
            <if test="independent != null &amp;&amp; independent != 0">
                independent = #{independent},
            </if>
        </set>
        WHERE
          id = #{id}
    </update>

      

    3、批量动态更新

    在2 的基础上添加<trim> 和<foreach>标签 

    <update id="updateCourseRateStateByCourseList">
        UPDATE
            course
        <trim prefix="set" suffixOverrides=",">
            <trim prefix="rate_state =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.rateState!=null">
                        when id=#{item.id} then #{item.rateState}
                    </if>
                </foreach>
            </trim>
            <trim prefix="name =case" suffix="end,">
                <foreach collection="list" item="item" index="index">
                    <if test="item.name!=null">
                        when id=#{item.id} then #{item.name}
                    </if>
                </foreach>
            </trim>
        </trim>
        WHERE
        <foreach collection="list" separator="or" item="item" index="index" >
            id=#{item.id}
        </foreach>
    </update>

      

    4、动态插入

    选择插入,为空则不插入,在key 和value 两个部分都需要判断

    <insert id="insertSyllabus" useGeneratedKeys="true" keyProperty="syllabusId"
            parameterType="com.ajz.course.entity.Syllabus">
        INSERT INTO
          syllabus
        <trim prefix="(" suffix=")" suffixOverrides=",">
            course_id,
            <if test="startTime != null">
                start_time,
            </if>
            <if test="endTime != null">
                end_time,
            </if>
        </trim>
        <trim prefix="values (" suffix=")" suffixOverrides=",">
            #{courseId},
            <if test="startTime != null">
                #{startTime},
            </if>
            <if test="endTime != null">
                #{endTime}
            </if>
        </trim>
    </insert>

    5、批量插入

    只在VALUES 部分循环

    <insert id="insertTimetableList" parameterType="java.util.List">
        INSERT INTO
            timetable (user_id, user_type, lesson_id, lesson_time, watch_state, status)
        VALUES
        <foreach collection="list" item="item" index="index" separator=",">
            (#{item.userId},
            #{item.userType},
            #{item.lessonId},
            #{item.lessonTime},
            #{item.watchState},
            #{item.status})
        </foreach>
    </insert>

    6、数据库根据主键自己选择插入还是更新,insertOrUpdate 

    相当于 jpa的 merge,关键在于唯一索引,也可以是主键,关键字:ON DUPLICATE KEY UPDATE

    <!--user_id, user_type, lesson_id 三个字段建立了联合唯一索引-->
    <insert id="insertOrUpdateTimetable" useGeneratedKeys="true" keyProperty="id" parameterType="com.ajz.course.entity.Timetable">
        INSERT INTO
            timetable (user_id, user_type, lesson_id, lesson_time, watch_state, status)
        VALUES (#{userId},
            #{userType},
            #{lessonId},
            #{lessonTime},
            #{watchState},
            #{status})
            ON DUPLICATE KEY UPDATE
                lesson_time = #{lessonTime}, watch_state = #{watchState}, status = #{status}
    </insert>

    7、批量insertOrUpdate 

    在5和6的基础上实现,注意 ON DUPLICATE KEY UPDATE 后面的 VALUES,是数据库的字段,而不是实体的字段, admin_name = VALUES(admin_name)

    <insert id="insertOrUpdateStatSchoolHome" useGeneratedKeys="true" keyProperty="id" parameterType="com.ajz.course.entity.StatSchoolHome">
        INSERT INTO
            stat_school_home (sid,
            name,
            admin_name,
            type_key,
            status)
        VALUES
        <foreach collection="list" item="item" index="index" open="" close="" separator=",">
            (#{item.sid},
            #{item.name},
            #{item.adminName},
            #{item.typeKey},
            #{item.status})
        </foreach>
        ON DUPLICATE KEY UPDATE
            name = VALUES(name),
            admin_name = VALUES(admin_name),
            type_key = VALUES(type_key),
            status = VALUES(status)
    </insert>

    原创文章,欢迎转载,转载请注明出处!

  • 相关阅读:
    动态规划算法介绍——概念、意义及应用、例题
    两个大数相减
    删除apache的签名的shell脚本
    C++中智能指针的设计和使用
    eclipse save action不起作用
    [leetcode]51. N-QueensN皇后
    [leetcode]33. Search in Rotated Sorted Array旋转过有序数组里找目标值
    [leetcode]88. Merge Sorted Array归并有序数组
    [leetcode]636. Exclusive Time of Functions函数独占时间
    [leetcode]257. Binary Tree Paths二叉树路径
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/mybatis_skill.html
Copyright © 2011-2022 走看看