1. 程式人生 > >2019-04-28 Mybatis generator逆向工程生成的Example代碼分析

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

fst 列表 null 映射 ont example get ota div

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

1.先在數據庫建表

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配置文件

 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的分析

  • 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 );
  • 7、9、12、14為一個Criterion
  • 7、9需要存放到同一個Criteria中
  • 12、14需要存放到同一個Criteria中
  • 6-15位DepartmentExample的條件部分(以上兩個Criteria需要存放入Example的List中)

5.使用DepartmentExample查詢的優缺點

優點:

  • 因為是代碼生成的,可以省去自己寫XML和接口方法
  • 查詢條件靈活

缺點:

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

6.擴展DepartmentExample分頁

① 在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 }

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