zoukankan      html  css  js  c++  java
  • 15 Mybatis——动态sql

    动态SQL

    所谓动态sql,就是加了一些逻辑判断的SQL语句。

    主要有以下:

    • where-if :where标签下写if标签。如果if判断成立,则执行if下的sql,多个if可叠加执行。如where标签下判断无内容,where标签不被执行。需要在if标签下sql语句前写and。默认执行时第一个and会被删掉。
    • set-if:set标签下写if标签。如果if判断成立,则执行if下的sql,多个if可叠加执行。如set标签下判断无内容,则set标签不执行。需在if标签下的sql语句后写逗号。默认最后一个逗号在执行时被删掉。
    • choose-when:choose标签下写when,当when中条件成立,则执行when下的sql语句。但多个when成立只执行第一个when下的sql。
    • trim:trim下面写sql,四个属性,分别表示:在sql前后添加(带空格),删除执行字符串。
    • bind:对传入的参数的前后添加字符串,例如 name="money" value="'$'+money" 当传入100,实际在sql命令中为 $100
    • foreach:该标签下写sql,一般要求传入一个集合或是数组。主要有四个参数,open(指定遍历开始时添加的字符) close(指定遍历完成后最后的添加的字符) seprator(指定每个值之间的分隔符) item(参数对应的临时变量) cellection(指定传入的集合参数名)。
    • include与sql联用:sql标签写一段sql数据,数值id要赋值。在增删改查中通过使用include标签的ref引用sql标签的内容

    示例

    mapper

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE mapper
     PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
     <mapper namespace="cn.xiaohei.mapper.UserMapper">
         <select id="selAll" resultType="user">
             select * from User
         </select>
         <!-- where和if测试 -->
         <select id="selByIf" resultType="User">
    		select * from User
    		<!-- OGNL表达式,直接写key或对象的属性 -->       
    		<where>
    			<if test="name!=null and name!=''">
    			    and name=#{name}
    			</if>
    			<if test="gender!=null and gender!=''">
    			    and gender=#{gender}
    			</if>
    		</where>
         </select>
         <!-- choose和when测试 -->
         <select id="selChooseWhen" resultType="user">
             select * from User
             <where>
                 <choose>
                     <!-- 当多个when成立,只生效第一个 -->
                     <when test="name!=null and name!=''">
                         name=#{name}
                     </when>
                     <when test="gender!=null and gender!=''">
                         gender=#{gender}
                     </when>
                 </choose>
             </where>
         </select>
         <!-- set测试 -->
         <update id="updNameGender">
             update user
             <set>
                 id=#{id}
                 <if test="gender!=null and gender!=''">
                     gender=#{gender},
                 </if>
                 <if test="name!=null and name!=''">
                     name=#{name},
                 </if>
             </set>
             where id=#{id}
         </update>
         <!-- trim -->
         <select id="selTrim" resultType="user">
             select * from user
             <trim prefix="where" prefixOverrides="and">
                 and name=#{name}
             </trim>
         </select>
         <!-- trim模拟set -->
         <update id="trimset">
             update user
             <trim prefix="set" suffixOverrides=",">
                 name=#{name},
             </trim>
             <trim prefix="," suffixOverrides=",">
                 gender=#{gender},
             </trim>
             where id =1
         </update>
         <!-- bind:前后添加数据,可用来实现模糊查询-->
         <select id="selBind" resultType="user">
             <bind name="name" value="'%'+name"/>
    		select * from user where name like #{name}         
         </select>
         <!-- foreach: 实现查询语句中配合in关键字的使用 -->
         <select id="selForeach" resultType="user" parameterType="list">
             select * from user where id in
             <foreach collection="list" item="a" open="(" close=")" separator=",">
                 #{a}
             </foreach>
         </select>
         <!-- include 与 sql标签 -->
         <select id="selIncludeSql" resultType="user">
             select * from user where id in
             <trim prefix="(" suffix=")">
                 <!-- 引用sql标签s1 -->
                 <include refid="s1"></include>
             </trim>
         </select>
         <sql id="s1">
             1,2
         </sql>
     </mapper>
    

      

  • 相关阅读:
    将log4Net记录的日志导入数据库操作指南
    算法40 leetcode 155.最小栈
    c++求以3为底的对数 遇到243 怎么也通不过
    算法36 动规初探&&斐波那契&&尾递归
    算法38 5. 最长回文子串
    算法39 leetcode22. 括号生成
    算法34 堆排序heapsort
    算法37 动规求数组和
    算法35 力扣twosum
    c++ vector size()18446744073709551615 bug
  • 原文地址:https://www.cnblogs.com/Scorpicat/p/12449550.html
Copyright © 2011-2022 走看看