• MyBatis总结七:动态sql和sql片段


    开发中,sql拼接很常见,所以说一下动态sql:

    1 if
    2 chose,when,otherwise
    3 where,set
    4 foreach

    用法解析(现有一张users表 内有id username age 三个字段):

        <!--查询所有用户,传递参数type,如果值为0,按照年龄升序排序,如果为1则按照年龄降序排序,否则按照ID排序-->
        <!--choose when otherwise的用法  大致相当于case when default-->
        <select id="getUserListByType" resultType="User">
            select * from users
            <choose>
                <when test="type==0">order by age asc</when>
                <when test="type==1">order by age desc</when>
                <otherwise>order by id asc</otherwise>
            </choose>
        </select>
    
        <!--根据多个id查询用户  if where foreach的用法-->
        <select id="getUserListByIds" resultMap="User">
            select * from users
            <where>
                -- if判断 如果传进去的参数ids不为空
                <if test="ids!=null and ids==''">
                    and id in
                    -- foreach循环ids 以逗号为分隔符 以ids这个字符串中的'('为开始 ')'为结果
                    <foreach collection="ids" item="id" open="(" close=")" separator=",">
                        #{id}
                    </foreach>
                </if>
            </where>
        </select>
    
        <!--修改用户信息,如果某字段为null,则不修改这个字段   set的用法-->
        <select id="updateUser">
            update users
            <set>
                <if test="username!=null and username!=''">
                    username = #{username}
                </if>
                <if test="age!=null">
                    age = #{age}
                </if>
            </set>
        </select>

    我们还可以把重复的sql抽取出来,作为公用的sql片段:

    定义sql片段:

        <!-- sql片段 
            建议:对单表进行sql片段的抽取,方便重用
            抽取时不包含where
        -->
        <sql id="findUserSql">
            <if test="userCustomer!=null">
                <if test="userCustomer.age!=null">
                    and user.age=#{userCustomer.age}
                </if>
                <if test="userCustomer.username!=null and userCustomer.username!=''">
                    and user.username like '$%{userCustomer.username}%'
                </if>
            </if>
        </sql>

    使用sql片段:

        <!-- 动态sql -->
        <select id="findUserCount" parameterType="com.zy.domain.User" resultType="int">
            select count(*) from users
            -- where 可自动去除条件中的第一个and
            <where>
                <include refid="findUserSql"></include>
            </where>
        </select>
  • 相关阅读:
    Tomcat server.xml中配置的connectionTimeout参数无效?客户端等待超时时间
    org.joda.time.datetime.plusMonths 添加月数,缺少天数。
    微信小程序苹果手机请求地址 报错404,安卓可以正常请求
    在Ubuntu 18.04 Desktop图形中配置静态和动态IP
    Ubuntu16.04设置静态IP或动态ip(DHCP)
    linux监控命令
    lsof命令详解
    通过程序名称kill掉所有的进程
    linux目录和Windows目录对比
    Linux系统下查找安装包所在目录
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9296718.html
Copyright © 2020-2023  润新知