Mybatis(5)——动态SQL

• if:判断
• choose (when, otherwise):分支选择;带了break的swtich-case
如果带了id就用id查,如果带了lastName就用lastName查;只会进入其中一个
• trim 字符串截取(where(封装查询条件), set(封装修改条件))
• foreach 遍历集合

if进行判断,其中的test::判断表达式(OGNL) 

从参数中取值进行判断 。遇见特殊符号应该去写转义字符:

<select id="getComplete1">
        SELECT * FROM student WHERE
        <where>
            <if test="id!=null">id=#{id} </if>
            <if test="addr!=null">AND id=#{addr}  </if>
            <if test="stuGender!=null">AND gender=#{stuGender}  </if>
            <if test="name!=null">AND name=#{name}</if>
        </where>
    </select>

trim

         <trim prefix="WHERE" suffixOverrides="AND">
            <if test="id!=null">id=#{id} AND </if>
            <if test="addr!=null">id=#{addr} AND </if>
            <if test="stuGender!=0">gender=#{stuGender} AND </if>
            <if test="name!=null">name='${name}' AND </if>
</trim>

prefix="":前缀:trim标签体中是整个字符串拼串 后的结果。 prefix给拼串后的整个字符串加一个前缀
prefixOverrides="": 前缀覆盖: 去掉整个字符串前面多余的字符
suffix="":后缀 suffix给拼串后的整个字符串加一个后缀
suffixOverrides="" 后缀覆盖:去掉整个字符串后面多余的字符

批量插入

 <insert id="insertmanyitem" >
         INSERT INTO student (name,id, gender,addr,c_id) VALUES
         <foreach collection="students" item="stu" separator=",">
             (#{stu.name},#{stu.id},#{stu.stuGender},#{stu.addr},#{stu.college.id})
         </foreach>
    </insert>

    <!--这个就是使用多条查询-->
    <insert id="insertmanyitem02">
        <foreach collection="students" separator=";" item="stu">
            INSERT INTO student
               <include refid="tableItem"/>
             VALUES
               (#{stu.name},#{stu.id},#{stu.stuGender},#{stu.addr},#{stu.college.id})
        </foreach>
    </insert>

内置参数

 两个内置参数:
         不只是方法传递过来的参数可以被用来判断,取值。。。
         mybatis默认还有两个内置参数:
         _parameter:代表整个参数
             单个参数:_parameter就是这个参数
             多个参数:参数会被封装为一个map;_parameter就是代表这个map

         _databaseId:如果配置了databaseIdProvider标签。
             _databaseId就是代表当前数据库的别名oracle
    <select id="testInnerPara" resultType="entity.stu">

        <if test="_databaseId=='mysql'">
            SELECT * FROM student
            <if test="_parameter!=null">
                 WHERE id=#{_parameter.id}
            </if>
        </if>
        <if test="_databaseId=='oracle'">
            SELECT * FROM student123 WHERE id=#{_parameter.id}
        </if>
    </select>

抽取可重用的sql片段。方便后面引用
1、sql抽取:经常将要查询的列名,或者插入用的列名抽取出来方便引用
2、include来引用已经抽取的sql:
3、include还可以自定义一些property,sql标签内部就能使用自定义的属性
include-property:取值的正确方式${prop},
#{不能使用这种方式}

<sql id="tableItem">
        (name,id, gender,addr,c_id)
 </sql>
原文地址:https://www.cnblogs.com/Coder-Pig/p/7427978.html