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>

  

 

posted @ 2020-03-09 16:42  Scorpicat  阅读(180)  评论(0编辑  收藏  举报