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>