1. 程式人生 > >MyBatis詳解 一篇就夠啦

MyBatis詳解 一篇就夠啦

第1章MyBatis框架配置檔案詳解

1.1 typeHandlers型別轉換器

  每當MyBatis 設定引數到PreparedStatement 或者從ResultSet 結果集中取得值時,就會使用TypeHandler 來處理資料庫型別與java 型別之間轉換。下表描述了預設

TypeHandlers

 1.1.1 自定義型別轉換器

假設表中欄位是int型別,而實體類與之對應的屬性是boolean型別,此時可以採用自定義型別轉換器進行對應

(1)實體類

 1 package com.chenyanbin.beans;
 2 
 3 public class Dept {
 4     private Integer deptNo;
 5     private String dname;
 6     private String loc;
 7     private boolean flag;
 8     public Integer getDeptNo() {
 9         return deptNo;
10     }
11     public boolean isFlag() {
12         return flag;
13     }
14     public void setFlag(boolean flag) {
15         this.flag = flag;
16     }
17     public void setDeptNo(Integer deptNo) {
18         this.deptNo = deptNo;
19     }
20     public String getDname() {
21         return dname;
22     }
23     public void setDname(String dname) {
24         this.dname = dname;
25     }
26     public String getLoc() {
27         return loc;
28     }
29     public void setLoc(String loc) {
30         this.loc = loc;
31     }
32 }

(2) 表中欄位

 (3) 開發自定義型別轉換器:MyTypeHandler.java

繼承並實現介面:TypeHandler.java

 1 package com.chenyanbin.util;
 2 
 3 import java.sql.CallableStatement;
 4 import java.sql.PreparedStatement;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 
 8 import org.apache.ibatis.jdbc.Null;
 9 import org.apache.ibatis.type.JdbcType;
10 import org.apache.ibatis.type.TypeHandler;
11 /*
12  * setParameter:這個方法在生成SQL語句時才被呼叫
13  * 
14  * getResult:查詢結束之後,在將ResultSet資料行轉換為實體類物件時,通知TypeHandler將當前資料行某個欄位轉換為何種型別
15  * 
16  * 
17  */
18 public class MyTypeHandler implements TypeHandler {
19 
20     public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
21         if (parameter==null) { //dept.flag=null insertsql flag設定0
22             ps.setInt(i, 0);
23             return;
24         }
25         Boolean flag=(Boolean)parameter;
26         if (flag==true) {
27             ps.setInt(i, 1);
28         }
29         else {
30             ps.setInt(i, 0);
31         }
32     }
33 
34     public Object getResult(ResultSet rs, String columnName) throws SQLException {
35         int flag = rs.getInt(columnName); //1 or 0
36         Boolean myFlag=Boolean.FALSE;
37         if (flag==1) {
38             myFlag=Boolean.TRUE;
39         }
40         return myFlag;
41     }
42 
43     public Object getResult(ResultSet rs, int columnIndex) throws SQLException {
44         // TODO Auto-generated method stub
45         return null;
46     }
47 
48     public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {
49         // TODO Auto-generated method stub
50         return null;
51     }
52 
53 }

(4) 在MyBatis核心配置檔案註冊自定義型別轉換器:

myBatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 屬性配置 -->
 7     <properties resource="config.properties"></properties>
 8     <!-- 別名配置 -->
 9     <typeAliases>
10         <package name="com.chenyanbin.beans" />
11         <package name="com.chenyanbin.dao" />
12     </typeAliases>
13     <!-- 型別處理器 -->
14     <typeHandlers>
15         <!-- 從java中的Boolean轉jdbc中的NUMERIC -->
16         <typeHandler handler="com.chenyanbin.util.MyTypeHandler"
17             javaType="Boolean" jdbcType="NUMERIC" />
18     </typeHandlers>
19     <!-- 環境配置 -->
20     <environments default="development">
21         <!-- 環境配置 -->
22         <environment id="development">
23             <!-- 事務管理器 -->
24             <transactionManager type="JDBC"></transactionManager>
25             <!-- 資料來源 -->
26             <dataSource type="pooled">
27                 <property name="driver" value="${jdbc.driver}" />
28                 <property name="url" value="${jdbc.url}" />
29                 <property name="username" value="${jdbc.username}" />
30                 <property name="password" value="${jdbc.password}" />
31             </dataSource>
32         </environment>
33     </environments>
34     <!-- 對映器 -->
35     <mappers>
36         <package name="com.chenyanbin.dao" />
37     </mappers>
38 </configuration>

config.properties

1 jdbc.driver=com.mysql.jdbc.Driver
2 jdbc.url=jdbc:mysql://localhost:3306/sam
3 jdbc.username=root
4 jdbc.password=root

(5) 建立介面:DeptMapper.java

 1 package com.chenyanbin.dao;
 2 
 3 import java.util.List;
 4 import com.chenyanbin.beans.Dept;
 5 
 6 public interface DeptMapper {
 7     public void deptSave(Dept dept);
 8 
 9     public List<Dept> deptFind();
10 }

(6)  DeptMapper.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="com.chenyanbin.dao.DeptMapper">
 6     <insert id="deptSave">
 7         insert into dept (DEPTNO,DNAME,LOC,flag)
 8         values(#{deptNo},#{dname},#{loc},#{flag})
 9     </insert>
10     <select id="deptFind" resultType="Dept">
11         select deptNo,dname,loc,flag from dept
12     </select>
13 </mapper>
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 屬性配置 -->
 7     <properties resource="config.properties"></properties>
 8     <!-- 別名配置 -->
 9     <typeAliases>
10         <package name="com.chenyanbin.beans" />
11         <package name="com.chenyanbin.dao" />
12     </typeAliases>
13     <!-- 環境配置 -->
14     <environments default="development">
15         <!-- 環境配置 -->
16         <environment id="development">
17             <!-- 事務管理器 -->
18             <transactionManager type="JDBC"></transactionManager>
19             <!-- 資料來源 -->
20             <dataSource type="pooled">
21                 <property name="driver" value="${jdbc.driver}" />
22                 <property name="url" value="${jdbc.url}" />
23                 <property name="username" value="${jdbc.username}" />
24                 <property name="password" value="${jdbc.password}" />
25             </dataSource>
26         </environment>
27     </environments>
28     <!-- 對映器 -->
29     <mappers>
30         <package name="com.chenyanbin.dao" />
31     </mappers>
32 </configuration>
方式二:myBatis-config.xml
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE mapper
 3   PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 5 <mapper namespace="com.chenyanbin.dao.DeptMapper">
 6     <insert id="deptSave">
 7         insert into dept (DEPTNO,DNAME,LOC,flag)
 8         values(#{deptNo},#{dname},#{loc},#{flag})
 9     </insert>
10     <resultMap type="dept" id="deptMap">
11     <result column="flag" property="flag" typeHandler="com.chenyanbin.util.MyTypeHandler"/>
12     </resultMap>
13     <select id="deptFind" resultType="Dept">
14         select deptNo,dname,loc,flag from dept
15     </select>
16 </mapper>
方式二:DeptMapper.xml

(7) 執行單元測試:TestMain_01.java

 1 package com.chenyanbin.test;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.List;
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.junit.After;
11 import org.junit.Before;
12 import org.junit.Test;
13 import com.chenyanbin.beans.Dept;
14 import com.chenyanbin.dao.DeptMapper;
15 
16 public class TestMain_01 {
17     private SqlSession session;
18 
19     @Before
20     public void Start() {
21         try {
22             InputStream inputStream = Resources.getResourceAsStream("myBatis-config.xml");
23             SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
24             session = factory.openSession();
25         } catch (Exception e) {
26             e.printStackTrace();
27         }
28     }
29 
30     @After
31     public void end() {
32         if (session == null) {
33             session.close();
34         }
35     }
36 
37     @Test
38     public void test01() throws IOException {
39         Dept d2 = new Dept();
40         d2.setDname("上海事業部");
41         d2.setLoc("上海");
42         d2.setFlag(false);
43         session.insert("deptSave", d2);
44         session.commit();
45         session.close();
46     }
47 
48     @Test
49     public void test02() {        
50           DeptMapper dao=session.getMapper(DeptMapper.class);
51           List<Dept> deptList=dao.deptFind();
52           System.out.println("ok");         
53     }
54 
55 }

(8) 專案目錄結構

 1.2 objectFactory 物件工廠

  MyBatis 每次建立結果物件的新例項時,它都會使用一個物件工廠(ObjectFactory)例項來完成。 預設的物件工廠需要做的僅僅是例項化目標類,要麼通過預設構造方法,要麼在引數對映存在的時候通過引數構造方法來例項化。 如果想覆蓋物件工廠的預設行為,則可以通過建立自己的物件工廠來實現。

1.2.1 自定義物件工廠

表結構:dept

 實體類:Dept.java

 1 package com.chenyanbin.beans;
 2 
 3 public class Dept {
 4     private Integer deptNo;
 5     private String dname;
 6     private String loc;
 7     private Boolean flag;
 8     private String country;
 9     public String getCountry() {
10         return country;
11     }
12     public void setCountry(String country) {
13         this.country = country;
14     }
15     public Integer getDeptNo() {
16         return deptNo;
17     }
18     public Boolean getFlag() {
19         return flag;
20     }
21     public void setFlag(Boolean flag) {
22         this.flag = flag;
23     }
24     public void setDeptNo(Integer deptNo) {
25         this.deptNo = deptNo;
26     }
27     public String getDname() {
28         return dname;
29     }
30     public void setDname(String dname) {
31         this.dname = dname;
32     }
33     public String getLoc() {
34         return loc;
35     }
36     public void setLoc(String loc) {
37         this.loc = loc;
38     }
39 }

(1) 繼承與DefaultObjectFactory:MyObjectFactory.java

 1 package com.chenyanbin.util;
 2 
 3 import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
 4 
 5 import com.chenyanbin.beans.Dept;
 6 
 7 public class MyObjectFactory extends DefaultObjectFactory {
 8 
 9     @Override
10     public Object create(Class type) {// 重新定義Dept類例項物件建立規則,其他類例項物件建立規則不想改變
11         if (Dept.class == type) {
12             // 依靠父類提供create方法建立Dept物件
13             Dept dept = (Dept) super.create(type);
14             // 設定自定義規則
15             dept.setCountry("China");
16             return dept;
17         }
18         return super.create(type);
19     }
20 
21 }

(2) 在MyBatis核心檔案中註冊自定義工廠

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 屬性配置 -->
 7     <properties resource="config.properties"></properties>
 8     <!-- 別名配置 -->
 9     <typeAliases>
10         <package name="com.chenyanbin.beans" />
11         <package name="com.chenyanbin.dao" />
12     </typeAliases>
13     <!-- ObjectFactory物件工廠 -->
14     <objectFactory type="com.chenyanbin.util.MyObjectFactory"></objectFactory>
15     <!-- 型別處理器 -->
16 <!--     <typeHandlers>
17         從java中的Boolean轉jdbc中的NUMERIC
18         <typeHandler handler="com.chenyanbin.util.MyTypeHandler"
19             javaType="Boolean" jdbcType="NUMERIC" />
20     </typeHandlers> -->
21     <!-- 環境配置 -->
22     <environments default="development">
23         <!-- 環境配置 -->
24         <environment id="development">
25             <!-- 事務管理器 -->
26             <transactionManager type="JDBC"></transactionManager>
27             <!-- 資料來源 -->
28             <dataSource type="pooled">
29                 <property name="driver" value="${jdbc.driver}" />
30                 <property name="url" value="${jdbc.url}" />
31                 <property name="username" value="${jdbc.username}" />
32                 <property name="password" value="${jdbc.password}" />
33             </dataSource>
34         </environment>
35     </environments>
36     <!-- 對映器 -->
37     <mappers>
38         <package name="com.chenyanbin.dao" />
39     </mappers>
40 </configuration>

 1.3 Plugins 攔截器

  攔截器的一個作用就是我們可以攔截某些方法的呼叫,我們可以選擇在這些被攔截的方法執行前後加上某些邏輯,也可以在執行這些被攔截的方法時執行自己的邏輯而不再執行被攔截的方法。Mybatis攔截器設計的一個初衷就是為了供使用者在某些時候可以實現自己的邏輯而不必去動Mybatis固有的邏輯。打個比方,對於Executor,Mybatis中有幾種實現:BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor。這個時候如果你覺得這幾種實現對於Executor介面的query方法都不能滿足你的要求,那怎麼辦呢?是要去改原始碼嗎?當然不。我們可以建立一個Mybatis攔截器用於攔截Executor介面的query方法,在攔截之後實現自己的query方法邏輯,之後可以選擇是否繼續執行原來的query方法。

  對於攔截器Mybatis為我們提供了一個Interceptor介面,通過實現該介面就可以定義我們自己的攔截器。我們先來看一下這個介面的定義:

  我們可以看到在該介面中一共定義有三個方法,intercept、plugin和setProperties。plugin方法是攔截器用於封裝目標物件的,通過該方法我們可以返回目標物件本身,也可以返回一個它的代理。當返回的是代理的時候我們可以對其中的方法進行攔截來呼叫intercept方法,當然也可以呼叫其他方法,這點將在後文講解。setProperties方法是用於在Mybatis配置檔案中指定一些屬性的。

       定義自己的Interceptor最重要的是要實現plugin方法和intercept方法,在plugin方法中我們可以決定是否要進行攔截進而決定要返回一個什麼樣的目標物件。而intercept方法就是要進行攔截的時候要執行的方法。

       對於plugin方法而言,其實Mybatis已經為我們提供了一個實現。Mybatis中有一個叫做Plugin的類,裡面有一個靜態方法wrap(Object target,Interceptor interceptor),通過該方法可以決定要返回的物件是目標物件還是對應的代理。

對於實現自己的Interceptor而言有兩個很重要的註解,一個是@Intercepts,其值是一個@Signature陣列。@Intercepts用於表明當前的物件是一個Interceptor,而@Signature則表明要攔截的介面、方法以及對應的引數型別。

 

 建立自己的攔截器:MySimpleInterceptor.java

 1 package com.chenyanbin.util;
 2 
 3 import java.util.Properties;
 4 
 5 import org.apache.ibatis.executor.Executor;
 6 import org.apache.ibatis.mapping.MappedStatement;
 7 import org.apache.ibatis.plugin.Interceptor;
 8 import org.apache.ibatis.plugin.Intercepts;
 9 import org.apache.ibatis.plugin.Invocation;
10 import org.apache.ibatis.plugin.Plugin;
11 import org.apache.ibatis.plugin.Signature;
12 import org.apache.ibatis.session.ResultHandler;
13 import org.apache.ibatis.session.RowBounds;
14 
15 @Intercepts({ @Signature(method = "query", type = Executor.class, args = { MappedStatement.class, Object.class,
16         RowBounds.class, ResultHandler.class }) })
17 public class MySimpleInterceptor implements Interceptor {
18     /*
19      * 引數:Invocation {代理物件,被監控的方法物件,當前被監控方法執行時需要實參}
20      */
21     public Object intercept(Invocation invocation) throws Throwable {
22         // TODO Auto-generated method stub
23         System.out.println("被攔截方法執行之前,做的輔助服務。。。。。");
24         Object object = invocation.proceed(); // 執行被攔截方法
25         System.out.println("被攔截方法執行之後,做的輔助服務。。。。。");
26         return object;
27     }
28 
29     /*
30      * 引數:target 表示被攔截的物件,應該是Executor介面例項物件 作用: 如果 被攔截的物件所在的類是有實現介面就為當前攔截物件生成一個代理物件
31      * 如果被攔截的物件所在的類沒有指定介面,這個物件之後的行為不會被代理操作
32      */
33     public Object plugin(Object target) {
34         // TODO Auto-generated method stub
35         return Plugin.wrap(target, this);
36     }
37 
38     public void setProperties(Properties properties) {
39         // TODO Auto-generated method stub
40 
41     }
42 
43 }

MyBatis核心配置檔案:myBatis-config.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE configuration
 3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6     <!-- 屬性配置 -->
 7     <properties resource="config.properties"></properties>
 8     <!-- 別名配置 -->
 9     <typeAliases>
10         <package name="com.chenyanbin.beans" />
11         <package name="com.chenyanbin.dao" />
12     </typeAliases>
13     <!-- ObjectFactory物件工廠 -->
14     <objectFactory type="com.chenyanbin.util.MyObjectFactory"></objectFactory>
15     <!-- Plugins攔截器 -->
16     <plugins>
17         <plugin interceptor="com.chenyanbin.util.MySimpleInterceptor"></plugin>
18     </plugins>
19     <!-- 型別處理器 -->
20     <!-- <typeHandlers> 從java中的Boolean轉jdbc中的NUMERIC <typeHandler handler="com.chenyanbin.util.MyTypeHandler" 
21         javaType="Boolean" jdbcType="NUMERIC" /> </typeHandlers> -->
22     <!-- 環境配置 -->
23     <environments default="development">
24         <!-- 環境配置 -->
25         <environment id="development">
26             <!-- 事務管理器 -->
27             <transactionManager type="JDBC"></transactionManager>
28             <!-- 資料來源 -->
29             <dataSource type="pooled">
30                 <property name="driver" value="${jdbc.driver}" />
31                 <property name="url" value="${jdbc.url}" />
32                 <property name="username" value="${jdbc.username}" />
33                 <property name="password" value="${jdbc.password}" />
34             </dataSource>
35         </environment>
36     </environments>
37     <!-- 對映器 -->
38     <mappers>
39         <package name="com.chenyanbin.dao" />
40     </mappers>
41 </configuration>

單元測試

 1 package com.chenyanbin.test;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.util.List;
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.plugin.Interceptor;
 8 import org.apache.ibatis.session.SqlSession;
 9 import org.apache.ibatis.session.SqlSessionFactory;
10 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
11 import org.junit.After;
12 import org.junit.Before;
13 import org.junit.Test;
14 import com.chenyanbin.beans.Dept;
15 import com.chenyanbin.dao.DeptMapper;
16 
17 public class TestMain_01 {
18     private SqlSession session;
19 
20     @Before
21     public void Start() {
22         try {
23             InputStream inputStream = Resources.getResourceAsStream("myBatis-config.xml");
24             SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
25             session = factory.openSession();
26         } catch (Exception e) {
27             e.printStackTrace();
28         }
29     }
30 
31     @After
32     public void end() {
33         if (session == null) {
34             session.close();
35         }
36     }
37 
38     @Test
39     public void test01() throws IOException {
40         Dept d2 = new Dept();
41         d2.setDname("上海事業部");
42         d2.setLoc("上海");
43         d2.setFlag(false);
44         session.insert("deptSave", d2);
45         session.commit();
46         session.close();
47     }
48 
49     @Test
50     public void test02() {    
51         Interceptor ccInterceptor;
52           DeptMapper dao=session.getMapper(DeptMapper.class);
53           List<Dept> deptList=dao.deptFind();
54           System.out.println("ok");         
55     }
56 
57 }

 1 ##define an appender named console
 2 log4j.appender.console=org.apache.log4j.ConsoleAppender
 3 #The Target value is System.out or System.err
 4 log4j.appender.console.Target=System.out
 5 #set the layout type of the apperder
 6 log4j.appender.console.layout=org.apache.log4j.PatternLayout
 7 #set the layout format pattern
 8 log4j.appender.console.layout.ConversionPattern=[%-5p] %m%n
 9 
10 ##define a logger
11 log4j.rootLogger=debug,console
log4j.properties

MyBatis自定義攔截器,可以攔截介面只有四種.

  • Executor.class
  • StatementHandler.class
  • ParameterHandler.class
  • ResultSetHandler.class

 第二章 MyBatis框架Mapper配置檔案詳解

2.1 引數(#{引數名})

 #{}實現的是向prepareStatement中的預處理語句中設定引數值,sql語句中#{}表示一個佔位符即?

使用#{引數名},將引數的內容新增到sql語句中指定位置.

如果當前sql語句中只有一個引數,此時引數名稱可以隨意定義

    但是,如果當前sql語句有多個引數,此時引數名稱應該是與當前表關聯[實體類的屬性名]或則[Map集合關鍵字]

上述SQL語句在呼叫時,我們可以分別採用如下兩種方式輸入引數

使用#{}讀取實體類物件屬性內容

使用#{}讀取map集合中關鍵字的值

2.2 #{}和${}區別

在MyBatis中提供了兩種方式讀取引數的內容到SQL語句中,分別是

#{引數名} :實體類物件或則Map集合讀取內容

 ${引數名} :實體類物件或則Map集合讀取內容

 

為了能夠看到兩種方式的區別,需要看到MyBatis執行時輸送的SQL情況.因此

需要藉助Log4J日誌進行觀察

 

第一步: 載入Log4j日誌工具包到專案

第二步:將Log4j配置檔案新增到src/main/resources下

接下來,我們可以檢視

輸出結果

 從這裡我們可以看出兩者的區別:

 #{} : 採用預編譯方式,可以防止SQL注入

 ${}:  採用直接賦值方式,無法阻止SQL注入攻擊

在大多數情況下,我們都是採用#{}讀取引數內容.但是在一些特殊的情況下,我們還是需要使用${}讀取引數的.

比如 有兩張表,分別是emp_2017 和 emp_2018 .如果需要在查詢語句中動態指定表名,就只能使用${}

<select>

      select *  from emp_${year}

<select>

再比如.需要動態的指定查詢中的排序欄位,此時也只能使用${}

<select>

       select  *  from dept order by ${name}

</select>

簡單來說,在JDBC不支援使用佔位符的地方,都可以使用${}

2.3 resultMap

  MyBatis框架中是根據表中欄位名到實體類定位同名屬性的.如果出現了實體類屬性名與表中欄位名不一致的情況,則無法自動進行對應.此時可以使用resultMap來重新建立實體類與欄位名之間對應關係.

 

 2.4 Sql標籤

首先,我們如下兩條SQL對映

這兩條查詢對映中要查詢的表以及查詢的欄位是完全一致的.因此可以<sql>標籤

 將[select  *  from dept]進行抽取.

在需要使用到這個查詢的地方,通過<include>標籤進行引用

 第三章 MyBatis動態SQL

3.1 什麼是MyBatis動態SQL

 根據使用者提供的引數,動態決定查詢語句依賴的查詢條件或則SQL語句的內容

3.2 動態SQL依賴標籤

  • if
  • choose、when、otherwise
  • trim、where、set
  • foreach

if使用

 

 choose、when、otherwise

  類似於Java中的switch case default. 只有一個條件生效,也就是隻執行滿足的條件when,沒有滿足的條件就執行otherwise,表示預設條件

 

 when的使用

 

 set使用

會在成功拼接的條件前加上SET單詞且最後一個”,”號會被無視掉

 

 trim使用

 

 foreach的使用

foreach標籤用於對集合內容進行遍歷,將得到內容作為SQL語句的一部分.

在實際開發過程中主要用於in語句的構建和批量新增操作

foreach元素的屬性主要有 item,index,collection,open,separator,close。

案例1.使用foreach實現批處理新增

 案例2.使用foreach遍歷list集合作為查詢條件

 案例3.使用foreach遍歷陣列作為查詢條件

案例4.使用foreach遍歷Map作為查詢條件

&n