動態SQL基本語句用法
阿新 • • 發佈:2020-09-02
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>