動態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>

全局配置文件
mybatis-cfg.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 <!-- 導入外部資源 -->
 <properties resource="db.properties"/> 
 
  <!-- 自定義別名 -->
    <typeAliases>
        <typeAlias type="com.zsl.pojo.Emp" alias="emp"/>
    </typeAliases>
 <!-- 環境 -->
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${userName}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>
  <!-- 注冊映射文件 -->
  <mappers>
  	<mapper resource="EmpMapper.xml"/>
  </mappers>
</configuration>

Pojo

package com.zsl.pojo;

import java.util.List;

public class Emp {
	private Integer empno;
	private String ename;
	private String job;
	private Integer mgrA;//這里與數據庫字段名稱不同,數據庫字段為mgr
	public Integer getEmpno() {
		return empno;
	}
	public void setEmpno(Integer empno) {
		this.empno = empno;
	}
	public String getEname() {
		return ename;
	}
	public void setEname(String ename) {
		this.ename = ename;
	}
	public String getJob() {
		return job;
	}
	public void setJob(String job) {
		this.job = job;
	}

	public Emp() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Integer getMgrA() {
		return mgrA;
	}
	public void setMgrA(Integer mgrA) {
		this.mgrA = mgrA;
	}
	public Emp(Integer empno, String ename, String job, Integer mgrA) {
		super();
		this.empno = empno;
		this.ename = ename;
		this.job = job;
//		this.mgrA = mgrA;
	}
	@Override
	public String toString() {
		return "Emp [empno=" + empno + ", ename=" + ename + ", job=" + job  + "]";
		//+ ", mgrA=" + mgrA
	}
}

DBUtils

package com.zsl.utils;

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class DbUtils {
	public static SqlSession getSession() throws IOException {
		// TODO Auto-generated method stub
		// 1.通過Resources對象加載配置文件
		InputStream inputStream = Resources.getResourceAsStream("mybatis-cfg.xml");
		// 2.獲取SqlSessionFactory對象
		SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
		// 3.通過SqlSessionFactory對象獲取SQLSession對象
		SqlSession session = factory.openSession();
		return session;
	}
	
	public static void commit(SqlSession session) {
		// TODO Auto-generated method stub
		session.commit();
	}
	
	public static void close(SqlSession session) {
		// TODO Auto-generated method stub
		session.close();
	}
}

測試類Test

package com.zsl.test;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import com.zsl.dao.EmpMapper;
import com.zsl.pojo.Emp;
import com.zsl.utils.DbUtils;


public class Test {
	public static void main(String[] args) throws IOException {

		Test test = new Test();
		System.out.println(test.addUser3());
	}

	public Integer addUser1() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Integer integer = mapper.addEmp1("zsladd1", "程序員1");
		session.commit();
		session.close();
		return integer;
	}

	public Integer addUser2() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Integer integer = mapper.addEmp2("zsladd2", "程序員2");
		session.commit();
		session.close();
		return integer;
	}

	public Integer addUser3() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Integer integer = mapper.addEmp3("zsladd3", "程序員3");
		session.commit();
		session.close();
		return integer;
	}

	public Integer addUser4() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Integer integer = mapper.addEmp4("zsladd4", "程序員4");
		session.commit();
		session.close();
		return integer;
	}

	public Emp getEmpById() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp = mapper.getEmpById(7902);
		session.close();
		return emp;
	}

	public List<Emp> selEmp() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		List<Emp> list = mapper.selEmp();
		return list;
	}

	public Integer addUser() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp = new Emp();
		emp.setEname("zsl00");
		emp.setJob("程序員00");
		Integer integer = mapper.addEmp(emp);
		System.out.println("該條記錄主鍵:" + emp.getEmpno());
		session.commit();
		session.close();
		return integer;
	}

	public Emp getEmpById2() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp = mapper.getEmpById2(7900);
		session.close();
		return emp;
	}
	
	public Emp getEmpById3() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp2 = new Emp();
		emp2.setEname("JAMES");
		Emp emp = mapper.getEmpById3(emp2);
		return emp;
	}

	public Integer updateEmprById2() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp = new Emp();
		emp.setEmpno(7941);
		emp.setEname("zsl55");
		emp.setJob("程序員55");
		Integer integer = mapper.updateEmprById2(emp);
		session.commit();
		session.close();
		return integer;
	}
	
	public Integer updateEmprById3() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp = new Emp();
		emp.setEmpno(7941);
		emp.setEname("zsl77");
		emp.setJob("程序員77");
		Integer integer = mapper.updateEmprById2(emp);
		session.commit();
		session.close();
		return integer;
	}
	
	public Emp getEmpById4() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp2 = new Emp();
		emp2.setEname("JAMES");
		Emp emp = mapper.getEmpById3(emp2);
		session.close();
		return emp;
	}
	
	public List<Emp> getEmpById5() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		List<Integer> list = new ArrayList<>();
		list.add(7969);
		list.add(7970);
		list.add(7971);
		List<Emp> empList = mapper.getEmpById5(list);
		session.close();
		return empList;
	}
	
	public Integer addEmp6() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		List<Emp> emps = new ArrayList<>();
		Emp emp = new Emp();
		emp.setEname("zsl88");
		emp.setJob("程序員88");
		emps.add(emp);
		Emp empA = new Emp();
		empA.setEname("zsl99");
		empA.setJob("程序員99");
		emps.add(empA);
		int addEmp6 = mapper.addEmp6(emps);
		session.commit();
		session.close();
		return addEmp6;
	}
	
	public List<Emp> selEmp1() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		List<Emp> list = mapper.selEmp1();
		session.close();
		return list;
	}
	
	public Emp getEmpById6() throws IOException {
		// TODO Auto-generated method stub
		SqlSession session = DbUtils.getSession();
		EmpMapper mapper = session.getMapper(EmpMapper.class);
		Emp emp = mapper.getEmpById6();
		session.close();
		return emp;

	}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM