动态SQL基本语句用法
1.if语句 如果empno不为空,则在WHERE参数后加上AND empno = #{empno},这里有1=1所以即使empno为null,WHERE后面也不会报错。 映射文件 <select id="getEmpById2" resultType="emp"> SELECT * FROM emp WHERE 1=1 <if test="empno != null"> AND empno = #{empno} </if> </select> EmpMapper接口 public Emp getEmpById2(@Param("empno")Integer empno) throws IOException; 有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。而使用if标签时,只要test中的表达式为 true,就会执行 if 标签中的条件。MyBatis 提供了 choose 元素。if标签是与(and)的关系,而 choose 是或(or)的关系。 2.where语句和Choose(when,otherwise) 1.Where后面empno和ename为null,那where就不会出现在sql语句中。 2. choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。类似于Java 的 switch 语句,choose 为 switch,when 为 case,otherwise 则为 default。 映射文件 <select id="getEmpById3" resultType="emp" parameterType="emp"> SELECT * FROM EMP <where> <choose> <when test="empno != null"> AND empno like #{empno} </when> <when test="ename != null"> AND ename like #{ename} </when> <otherwise> AND job = "zz" </otherwise> </choose> </where> </select> EmpMapper接口 public Emp getEmpById3(Emp emp) throws IOException; 3.set语句 set主要也是用来解决更新问题的。 映射文件 <update id="updateEmprById2" parameterType="emp"> UPDATE emp <set> <if test="ename!=null"> ename=#{ename},</if> <if test="job!=null"> job=#{job},</if> </set> <where> <if test="empno!=null"> empno=#{empno}; </if> </where> </update> EmpMapper接口 public Integer updateEmprById2(Emp emp) throws IOException; 4.trim trim标记是一个格式化的标记,可以完成set或者是where标记的功能。 相关属性: Prefix:前缀。 prefixOverrides:去掉第一个指定内容。 suffix:后缀。 suffixoverride:去掉最后一个指定内容。 映射文件 <!-- 代替where --> <select id="getEmpById4" resultType="emp" parameterType="emp"> SELECT * FROM emp <!-- <where> <if test="username!=null"> and name = #{username} </if> </where> --> <trim prefix="where" prefixOverrides="AND |OR "> <if test="empno != null"> and empno = #{empno} </if> <if test="ename!=null"> AND ename = #{ename} </if> </trim> </select> 映射文件 <!-- 代替set --> <update id="updateEmprById3" parameterType="emp"> update emp <trim prefix="set" suffixOverrides=","> <if test="ename!=null"> ename = #{ename}, </if> <if test="job != null"> job = #{job} </if> </trim> <trim prefix="where" prefixOverrides="AND |OR "> <if test="empno != null"> and empno = #{empno} </if> </trim> </update> EmpMapper接口 public Emp getEmpById4(Emp emp) throws IOException; public Integer updateEmprById3(Emp emp) throws IOException; 5.foreach语句 foreach用来遍历,遍历的对象可以是数组,也可以是集合。 相关属性: Collection:collection属性的值有三个分别是list、array、map三种。 Open:前缀。 Close:后缀。 Separator:分隔符,表示迭代时每个元素之间以什么分隔。 Item:表示在迭代过程中每一个元素的别名。 Index:用一个变量名表示当前循环的索引位置。 映射文件 <insert id="addEmp6"> insert into emp(ename,job)values <foreach collection="emps" item="emp" separator=","> (#{emp.ename},#{emp.job}) </foreach> </insert> EmpMapper接口 public int addEmp6(@Param("emps")List<Emp> emps); 6.SQL块 映射文件 <!-- 定义重复使用的SQL内容 --> <sql id="baseSql"> empno,ename,job </sql> <!-- 使用include引入sql块 --> <select id="selEmp1" resultType="emp"> select <include refid="baseSql"/> from emp </select> EmpMapper接口 public List<Emp> selEmp1() throws IOException; 7.bind 映射文件 <select id="getEmpById6" resultType="emp"> <!-- 声明了一个参数empno 在后面就可以使用了 --> <bind name="empno" value="7975" /> select * from emp where empno=${empno} </select> EmpMapper接口 public Emp getEmpById6()throws IOException; 全部代码: EmpMapper接口 package com.zsl.dao; import java.io.IOException; import java.util.List; import org.apache.ibatis.annotations.Param; import com.zsl.pojo.Emp; public interface EmpMapper { public Integer addEmp(Emp emp) throws IOException; public Integer deleteEmpById(Integer empno) throws IOException; public Integer updateEmprById(Emp emp) throws IOException; public Emp getEmpById(@Param("empno")Integer empno) throws IOException; public Integer addEmp1(String ename,String job) throws IOException; public Integer addEmp2(String ename,String job) throws IOException; public Integer addEmp3(@Param("ename")String ename,@Param("job")String job) throws IOException; public Integer addEmp4(@Param("ename")String ename,@Param("job")String job) throws IOException; public List<Emp> selEmp() throws IOException; public Emp getEmpById2(@Param("empno")Integer empno) throws IOException; public Emp getEmpById3(Emp emp) throws IOException; public Integer updateEmprById2(Emp emp) throws IOException; public Emp getEmpById4(Emp emp) throws IOException; public Integer updateEmprById3(Emp emp) throws IOException; // 如果不指定@Param 默认是array public List<Emp> getEmpById5(@Param("empnos")List<Integer> empno); public int addEmp6(@Param("emps")List<Emp> emps); public List<Emp> selEmp1() throws IOException; public Emp getEmpById6()throws IOException; } EmpMapper.XML映射文件 <?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="com.zsl.dao.EmpMapper"> <!-- <insert id="addEmp" parameterType="emp"> insert into emp(ename,job)values(#{ename},#{job}) </insert> --> <delete id="deleteEmpById" parameterType="int"> delete from emp where empno=#{empno} </delete> <update id="updateEmprById" parameterType="emp"> update emp set name = #{ename} where empno=#{empno} </update> <select id="getEmpById" resultType="emp"> select * from emp where empno=${empno} </select> <insert id="addEmp1"> insert into emp(ename,job)values(#{arg0},#{arg1}) </insert> <insert id="addEmp2"> insert into emp(ename,job)values(#{param1},#{param2}) </insert> <insert id="addEmp3"> insert into emp(ename,job)values(${ename},${job}) </insert> <insert id="addEmp4"> insert into emp(ename,job)values(#{ename},#{job}) </insert> <select id="selEmp3" resultType="emp"> select empno empno,ename ename,job job,mgr mgrA from emp </select> <resultMap type="emp" id="baseMap"> <id column="empno" property="empno" /> <result property="ename" column="ename" /> <result property="job" column="job" /> <result property="mgrA" column="mgr" /> </resultMap> <select id="selEmp" resultType="emp" resultMap="baseMap"> select * from emp </select> <!-- useGeneratedKeys:使用生成的主键 keyProperty="id":将生成的主键的值保存到对象的id属性中 --> <insert id="addEmp" parameterType="emp" useGeneratedKeys="true" keyProperty="empno"> insert into emp(ename,job)values(#{ename},#{job}) </insert> <insert id="addEmp6" parameterType="emp"> <selectKey keyProperty="empno" resultType="int"> select LAST_INSERT_ID() </selectKey> insert into emp(ename,job)values(#{ename},#{job}) </insert> <select id="getEmpById2" resultType="emp"> SELECT * FROM emp WHERE 1=1 <if test="empno != null"> AND empno = #{empno} </if> </select> <select id="getEmpById3" resultType="emp" parameterType="emp"> SELECT * FROM EMP <where> <choose> <when test="empno != null"> AND empno like #{empno} </when> <when test="ename != null"> AND ename like #{ename} </when> <otherwise> AND job = "zz" </otherwise> </choose> </where> </select> <update id="updateEmprById2" parameterType="emp"> UPDATE emp <set> <if test="ename!=null"> ename=#{ename},</if> <if test="job!=null"> job=#{job},</if> </set> <where> <if test="empno!=null"> empno=#{empno}; </if> </where> </update> <!-- 代替where --> <select id="getEmpById4" resultType="emp" parameterType="emp"> SELECT * FROM emp <!-- <where> <if test="username!=null"> and name = #{username} </if> </where> --> <trim prefix="where" prefixOverrides="AND |OR "> <if test="empno != null"> and empno = #{empno} </if> <if test="ename!=null"> AND ename = #{ename} </if> </trim> </select> <!-- 代替set --> <update id="updateEmprById3" parameterType="emp"> update emp <trim prefix="set" suffixOverrides=","> <if test="ename!=null"> ename = #{ename}, </if> <if test="job != null"> job = #{job} </if> </trim> <trim prefix="where" prefixOverrides="AND |OR "> <if test="empno != null"> and empno = #{empno} </if> </trim> </update> <select id="getEmpById5" resultType="emp"> select * from emp where empno in <foreach collection="empnos" open="(" close=")" separator="," item="empno"> #{empno} </foreach> </select> <insert id="addEmp6"> insert into emp(ename,job)values <foreach collection="emps" item="emp" separator=","> (#{emp.ename},#{emp.job}) </foreach> </insert> <!-- 定义重复使用的SQL内容 --> <sql id="baseSql"> empno,ename,job </sql> <!-- 使用include引入sql块 --> <select id="selEmp1" resultType="emp"> select <include refid="baseSql"/> from emp </select> <select id="getEmpById6" resultType="emp"> <!-- 声明了一个参数empno 在后面就可以使用了 --> <bind name="empno" value="7975" /> select * from emp where empno=${empno} </select> </mapper>