zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    [struts2学习笔记] 第一节 关于struts2的简单认知
    OpenCV——RGB三通道分离
    [shiro学习笔记]第三节 使用myeclipse导入apache shiro中的QuikStart example例子
    [maven学习笔记]第一节,认识maven,搭建maven开发环境,写第一个HelloWorld
    [shiro学习笔记]第二节 shiro与web融合实现一个简单的授权认证
    PS 滤镜——运动模糊
    PS 滤镜——素描算法(二)
    [ExtJS5学习笔记]第二十四节 Extjs5中表格gridpanel或者表单数据后台传输remoteFilter设置
    BZOJ_1798_[AHOI2009]维护序列_线段树
    BZOJ_2001_[BeiJing2006]狼抓兔子_最小割转对偶图
  • 原文地址:https://www.cnblogs.com/Coder-Pig/p/7427978.html
Copyright © 2011-2022 走看看