关于MyBatis的动态SQL语句

你是否还在为复杂的SQL条件判断烦恼?

String sql = "SELECT * FROM game where 1=1 ";
            if (name != null && name != "") {
                sql += " and game_name = ?";
                params.add(name);
            }
            if (type != null && type != "") {
                sql += " and game_type = ?";
                params.add(type);
            }
            if (com != null && com != "") {
                sql += " and game_company = ?";
                params.add(com);
            }
            if (year != null && year != "") {
                sql += " and game_year = ?";
                params.add(year);
            }

甚至有时你还需要更多的判断才能使你的代码尽量完善。让我们来了解一波MyBatis的动态SQL语句
当你需要进行判断时,我们有if元素

    <if test="name != '' and name != null">
            and name like CONCAT("%",#{name },"%")
    </if>`

多个需求就多个if,是不是很方便?但这里我们需要注意的是函数尽量大写(具体视数据库而定)如此处的:CONCAT();同时我们还可以使用where元素与if元素一起完成SQL语句的定义

<select id="getLoginUser" resultType="User">
        select * from smbms_user
        <where>
            <if test="userRole != null">
                and userRole = #{userRole}
            </if>
        </where>
    </select>
    看,代码是不是瞬间感觉简洁了很多?下面我们‘升级’一下--------使用trim元素
<select id="getLoginUser" resultType="User">
        select * from smbms_user
        <trim prefix="where" prefixOverrides="and | or">
            <if test="userRole != null">
                and userRole = #{userRole}
            </if>
        </trim>
    </select>

对于trim元素我们需要掌握几个属性prefix‘前缀’,prefixOverrides‘指定去除多余的前缀内容’,suffix‘后缀’,suffixOverrides‘指定去除多余的后缀内容’。举个小栗子,可能你不得不通过多个参数来对你的结果进行筛选

<select id="getUserList" resultType="User">
        select * from smbms_user where userRole in ('1','2','3')
</select>

但有时你因为各种原因不得不对你的SQL语句的传值进行修改,来自某些经理的压迫 我们可以来一个foreach简答的解决值的问题

<select id="getUserList" resultType="User">
    select * from smbms_user where userRole in
    <foreach collection="list" item="roleList" open="(" separator=","
        close=")">
        #{roleList}
    </foreach>
</select>

需要注意的是collection属性值有三个:array,list,Map集合的名字。array很显然传进来的就是一个数组,list则是一个集合对象,Map集合在这里以键来获取值

        List<User> userList = new ArrayList<User>();
        List<Integer> roleList = new ArrayList<Integer>();
        roleList.add(2);
        roleList.add(3);
        Map<String, Object>roleMap = new HashMap<String, Object>();
        roleMap.put("rKey", roleList);

<foreach collection="rKey" item="roleMap" open="(" separator="," close=")">
    #{roleMap}
</foreach>

确保item迭代部分与#{}这里相同就好了。
还有和update一起使用的set元素,这里就不赘述了直接上代码

<update id="updatePwd">
    UPDATE `smbms_user`
    <set>
        `userPassword`=#{userPassword}
    </set>
    WHERE (`id`=#{id})
</update>

个人感觉这个真心没意义。。。

猜你喜欢

转载自blog.csdn.net/qq_41210534/article/details/81449102