zoukankan      html  css  js  c++  java
  • 动态sql

    通过mybatis提供的各种标签方法实现动态拼接sql语句。

    常用有<if>、<where>、<foreach>

    基于不同需求来进行使用

    需求:根据性别和名字查询用户

    按原始方法在mapper.xml中写sql语句:

    <select>
    select * from user where sex = #{sex} and username = #{username}
    </select>

    但如果在查询时没有给username给值,则可能导致默认username = null 而致使查询 出错。

    所以解决方案,是使用动态sql的if标签

    <select>
    select * from user 
    where 
    <if test="sex != null and sex != ' ' ">
    sex = #{sex} 
    </if>
    <if test="username != null and username != ' ' ">
    and username = #{username}
    </if>
    </select>

    如果没有给username给值,那么语句将变成

    select * from user where sex = #{sex}

    但这依然存在隐患,如果sex为空,运行是就会语法报错,多了一个and

    这时候就引入了where标签

    <!-- 根据条件查询用户 -->
    <select>
      select * from user
    <!-- where标签可以自动添加where,同时处理sql语句中第一个前and关键字 -->
        <where>
            <if test="sex != null">
                AND sex = #{sex}
            </if>
            <if test="username != null and username != ''">
                AND username = #{username}
            </if>
        </where>
    </select>

    Sql片段:

    当sql语句部分重复太多时,可以抽取出来放在sql标签中,

    <sql id="selector">
          select * from user
    </sql>
    
    
    <!-- 根据条件查询用户 -->
    <select>
        <include refid="selector"/>
    <!-- where标签可以自动添加where,同时处理sql语句中第一个前and关键字 -->
        <where>
            <if test="sex != null">
                AND sex = #{sex}
            </if>
            <if test="username != null and username != ''">
                AND username = #{username}
            </if>
        </where>
    </select>

     

    foreach标签

    向sql传递数组或List,mybatis使用foreach解析,如下:

    根据多个id查询用户信息

    查询sql:

    SELECT * FROM user WHERE id IN (1,10,24)

    在UserMapper.xml添加sql,如下:

    <!-- 根据ids查询用户 -->
    <select id="queryUserByIds" parameterType="queryVo" resultType="user">
        SELECT * FROM `user`
        <where>
            <!-- foreach标签,进行遍历 -->
            <!-- collection:遍历的集合,这里是QueryVo的ids属性 -->
            <!-- item:遍历的项目,可以随便写,,但是和后面的#{}里面要一致 -->
            <!-- open:在前面添加的sql片段 -->
            <!-- close:在结尾处添加的sql片段 -->
            <!-- separator:指定遍历的元素之间使用的分隔符 -->
            <foreach collection="ids" item="item" open="id IN (" close=")" separator=",">
                #{item}
            </foreach>
        </where>
    </select>              
  • 相关阅读:
    OC学习笔记
    feed43+ifttt
    让Hyper-V和VMware虚拟机软件共存
    ios问题集
    vs2012问题集
    第二个win8应用制作笔记
    隐私策略
    《龙泉青瓷》隐私策略
    win8开发-Xaml学习笔记四
    梦想成为“老板”的第N天
  • 原文地址:https://www.cnblogs.com/xk920/p/9816359.html
Copyright © 2011-2022 走看看