2019-04-28 Mybatis generator逆向工程生成的Example代碼分析

今天主要對Mybatis generator生成的DAO層等進行分析,講解Example類的使用和擴展java

1.先在數據庫建表mysql

1 CREATE TABLE `department` ( 2   `fid` varchar(255) NOT NULL, 3   `code` varchar(255) DEFAULT NULL COMMENT '部門代碼', 4   `name` varchar(255) DEFAULT NULL COMMENT '部門名稱', 5   PRIMARY KEY (`fid`) 6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.建立Mybatis generator配置文件sql

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"  3  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
 4 <generatorConfiguration>
 5   <context id="context1">
 6    <!-- 去掉註釋 -->
 7    <commentGenerator>
 8         <property name="suppressAllComments" value="true" />
 9     </commentGenerator> 
10     
11     <!-- 配置鏈接信息 -->
12     <jdbcConnection connectionURL="jdbc:mysql://localhost:3306/demo1?serverTimezone=GMT%2B8" 
13  driverClass="com.mysql.cj.jdbc.Driver" password="x5" userId="root" />
14     <!-- 配置實體類生成路徑 -->
15     <javaModelGenerator targetPackage="com.wf.ew.demo1.model" targetProject="reverse\src\main\java" />
16        <!-- 配置MapperXML文件生成路徑 -->
17     <sqlMapGenerator targetPackage="com.wf.ew.demo1.dao" targetProject="reverse\src\main\java" />
18     <!-- 配置DAO層生成路徑 -->
19     <javaClientGenerator targetPackage="com.wf.ew.demo1.dao" targetProject="reverse\src\main\java" type="XMLMAPPER" />
20     <!-- 配置表和實體類的映射關係 -->
21     <table tableName="department" domainObjectName="Department">
22      <!-- <columnOverride column="???" property="???" /> -->
23     </table>
24   
25   </context>
26   
27 </generatorConfiguration>

3.生成的DepartmentExample數據庫

 1 package com.wf.ew.demo1.model;  2 
 3 import java.util.ArrayList;  4 import java.util.List;  5 
 6 
 7 public class DepartmentExample {  8    
 9     /**
 10  * 排序條件  11      */
 12     protected String orderByClause;  13 
 14     /**
 15  * 去重標識  16      */
 17     protected boolean distinct;  18     
 19  
 20     /**
 21  * 最終以or進行鏈接的條件列表,Criteria爲一個以and鏈接的條件集  22      */
 23     protected List<Criteria> oredCriteria;  24 
 25     /**
 26  * 初始化條件描述對象容器列表  27      */
 28     public DepartmentExample() {  29         oredCriteria = new ArrayList<Criteria>();  30  }  31     
 32     // 此處省略orderByClause、distinct的Getter、Setter和oredCriteria的Getter
 33  ……  34 
 35     /**
 36  * 增長以and鏈接的條件集(先補全後增長)  37      */
 38     public void or(Criteria criteria) {  39  oredCriteria.add(criteria);  40  }  41 
 42     /**
 43  * 增長空的以and鏈接的條件集(先增長後補全)  44  * @return
 45      */
 46     public Criteria or() {  47         Criteria criteria = createCriteriaInternal();  48  oredCriteria.add(criteria);  49         return criteria;  50  }  51 
 52     /**
 53  * 增長空的以and鏈接的條件集(當且僅當容器爲空的才能加入)  54  * @return
 55      */
 56     public Criteria createCriteria() {  57         Criteria criteria = createCriteriaInternal();  58         if (oredCriteria.size() == 0) {  59  oredCriteria.add(criteria);  60  }  61         return criteria;  62  }  63 
 64     /**
 65  * 增長空的條件描述對象容器(內部實現)  66  * @return
 67      */
 68     protected Criteria createCriteriaInternal() {  69         Criteria criteria = new Criteria();  70         return criteria;  71  }  72 
 73     /**
 74  * 格式化過濾對象  75      */
 76     public void clear() {  77  oredCriteria.clear();  78         orderByClause = null;  79         distinct = false;  80  }  81 
 82     /**
 83  * 抽象類:條件描述對象容器(容器內的條件會以and鏈接)  84      */
 85     protected abstract static class GeneratedCriteria {  86         /**
 87  * 條件描述對象容器  88          */
 89         protected List<Criterion> criteria;  90 
 91         /**
 92  * 初始化條件描述對象容器  93          */
 94         protected GeneratedCriteria() {  95             super();  96             criteria = new ArrayList<Criterion>();  97  }  98 
 99         /**
100  * 判斷是否有效(基本條件最少爲1) 101  * @return
102          */
103         public boolean isValid() { 104             return criteria.size() > 0; 105  } 106 
107         /**
108  * 得到全部條件描述對象 109  * @return
110          */
111         public List<Criterion> getAllCriteria() { 112             return criteria; 113  } 114 
115         /**
116  * 得到條件描述對象容器 117  * @return
118          */
119         public List<Criterion> getCriteria() { 120             return criteria; 121  } 122 
123         /*== 通用增長條件描述對象的方法 == */
124         /**
125  * 增長沒有沒有佔位符的條件描述 126  * @param condition 127          */
128         protected void addCriterion(String condition) { 129             if (condition == null) { 130                 throw new RuntimeException("Value for condition cannot be null"); 131  } 132             criteria.add(new Criterion(condition)); 133  } 134 
135         /**
136  * 增長單佔位符的條件描述(沒有typeHandler) 137  * @param condition 138  * @param value 139  * @param property 140          */
141         protected void addCriterion(String condition, Object value, String property) { 142             if (value == null) { 143                 throw new RuntimeException("Value for " + property + " cannot be null"); 144  } 145             criteria.add(new Criterion(condition, value)); 146  } 147 
148         /**
149  * 增長區間參數的條件描述(沒有typeHandler) 150  * @param condition 151  * @param value1 152  * @param value2 153  * @param property 154          */
155         protected void addCriterion(String condition, Object value1, Object value2, String property) { 156             if (value1 == null || value2 == null) { 157                 throw new RuntimeException("Between values for " + property + " cannot be null"); 158  } 159             criteria.add(new Criterion(condition, value1, value2)); 160  } 161 
162         
163         // 如下省略 fid、code、name的14種條件查詢生成(爲空、不爲空、=、<>、>、>=、<、<=、like、not like、in、not in、between、not between)
164  …… 165       
166      
167  } 168 
169     /**
170  * 靜態內部類:條件描述對象容器實現類 171  * 172      */
173     public static class Criteria extends GeneratedCriteria { 174 
175         protected Criteria() { 176             super(); 177  } 178  } 179 
180     /**
181  * 靜態內部類:條件描述對象 182  * 183      */
184     public static class Criterion { 185         private String condition; // 原子條件
186 
187         private Object value; // 第一個值
188 
189         private Object secondValue; // 第二個值
190 
191         private boolean noValue; // 是否沒有值
192 
193         private boolean singleValue; // 是否單值(與listValue互逆)
194 
195         private boolean betweenValue; // 是否區間值
196 
197         private boolean listValue; // 是否列表(與singleValue互逆)
198 
199         private String typeHandler; 200 
201         public String getCondition() { 202             return condition; 203  } 204 
205         // 此處省略 value、noValue、singleValue、listValue、typeHandler的Getter方法
206  …… 207 
208         /**
209  * 建立沒有佔位符的條件 210  * @param condition 211          */
212         protected Criterion(String condition) { 213             super(); 214             this.condition = condition; 215             this.typeHandler = null; 216             this.noValue = true; 217  } 218 
219         /**
220  * 建立單佔位符的條件 221  * @param condition 222  * @param value 223  * @param typeHandler 224          */
225         protected Criterion(String condition, Object value, String typeHandler) { 226             super(); 227             this.condition = condition; 228             this.value = value; 229             this.typeHandler = typeHandler; 230             if (value instanceof List<?>) { 231                 this.listValue = true; 232             } else { 233                 this.singleValue = true; 234  } 235  } 236 
237         /**
238  * 建立單佔位符的條件(沒有typeHandler) 239  * @param condition 240  * @param value 241          */
242         protected Criterion(String condition, Object value) { 243             this(condition, value, null); 244  } 245 
246         /**
247  * 建立區間參數的條件 248  * @param condition 249  * @param value 250  * @param secondValue 251  * @param typeHandler 252          */
253         protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { 254             super(); 255             this.condition = condition; 256             this.value = value; 257             this.secondValue = secondValue; 258             this.typeHandler = typeHandler; 259             this.betweenValue = true; 260  } 261 
262         /**
263  * 建立區間參數的條件(沒有typeHandler) 264  * @param condition 265  * @param value 266  * @param secondValue 267          */
268         protected Criterion(String condition, Object value, Object secondValue) { 269             this(condition, value, secondValue, null); 270  } 271  } 272 }

4.DepartmentExample的分析apache

  • DepartmentExample類中還包含了GeneratedCriteria、Criteria、Criterion三個靜態內部類
  • Criterion表示一個最小粒度的條件的描述
  • GeneratedCriteria是一個抽象類;表示Criterion的集合,元素之間使用and鏈接
  • Criteria是GeneratedCriteria的實現類
  • DepartmentExample表示一個SQL語句的where、distinct、order by部分的描述;其中where部分表示Criteria的集合,元素間使用or鏈接

  使用一個例子進行說明 網絡

 1 SELECT DISTINCT
 2     *
 3 FROM
 4  maintainbill  5 WHERE
 6  (  7         fState = '已完成'
 8         AND 
 9         fItemType LIKE '%網絡%'
10  ) 11 OR ( 12     fState = '待安排'
13     AND 
14     fItemType LIKE '%電腦%'
15 );
  • 七、九、十二、14爲一個Criterion
  • 七、9須要存放到同一個Criteria中
  • 十二、14須要存放到同一個Criteria中
  • 6-15位DepartmentExample的條件部分(以上兩個Criteria須要存放入Example的List中)

5.使用DepartmentExample查詢的優缺點mybatis

優勢:app

  • 由於是代碼生成的,能夠省去本身寫XML和接口方法
  • 查詢條件靈活

缺點:dom

  • 查刪改都須要使用Example,略顯繁瑣
  • 沒有分頁功能

6.擴展DepartmentExample分頁ide

① 在Example中加入startindex(開始行索引)、limit(記錄數)屬性及Getter、Setter

②擴展MapperXML中查詢列表的select

<if test="startindex !=null and limit !=null"> limit ${startindex},${limit} </if>

7.補充DepartmentMapper接口的方法說明

 1 package com.wf.ew.demo1.dao;  2 
 3 import java.util.List;  4 
 5 import org.apache.ibatis.annotations.Param;  6 
 7 import com.wf.ew.demo1.model.Department;  8 import com.wf.ew.demo1.model.DepartmentExample;  9 
10 public interface DepartmentMapper{ 11     /**
12  * 根據example查詢記錄數 13      */
14     long countByExample(DepartmentExample example); 15 
16     /**
17  * 根據example刪除記錄 18      */
19     int deleteByExample(DepartmentExample example); 20 
21     /**
22  * 插入行(插入全部屬性值) 23      */
24     int insert(Department record); 25 
26     /**
27  * 插入行(插入非null屬性值) 28      */
29     int insertSelective(Department record); 30 
31     /**
32  * 根據example查詢記錄 33      */
34     List<Department> selectByExample(DepartmentExample example); 35 
36    
37     /**
38  * 根據example更新表(更新非null屬性) 39      */
40     int updateByExampleSelective(@Param("record") Department record, @Param("example") DepartmentExample example); 41 
42     /**
43  * 根據example更新表(更新全部屬性) 44      */
45     int updateByExample(@Param("record") Department record, @Param("example") DepartmentExample example); 46 }
相關文章
相關標籤/搜索