今天主要对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 2 45 6 7 26 278 10 11 129 14 15 16 17 18 19 20 21 22 23
24 25
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 ListoredCriteria; 24 25 /** 26 * 初始化条件描述对象容器列表 27 */ 28 public DepartmentExample() { 29 oredCriteria = new ArrayList (); 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 criteria; 90 91 /** 92 * 初始化条件描述对象容器 93 */ 94 protected GeneratedCriteria() { 95 super(); 96 criteria = new ArrayList (); 97 } 98 99 /**100 * 判断是否有效(基本条件最少为1)101 * @return102 */103 public boolean isValid() {104 return criteria.size() > 0;105 }106 107 /**108 * 获得所有条件描述对象109 * @return110 */111 public List getAllCriteria() {112 return criteria;113 }114 115 /**116 * 获得条件描述对象容器117 * @return118 */119 public List getCriteria() {120 return criteria;121 }122 123 /*== 通用增加条件描述对象的方法 == */124 /**125 * 增加没有没有占位符的条件描述126 * @param condition127 */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 condition138 * @param value139 * @param property140 */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 condition151 * @param value1152 * @param value2153 * @param property154 */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 condition211 */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 condition222 * @param value223 * @param typeHandler224 */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 condition240 * @param value241 */242 protected Criterion(String condition, Object value) {243 this(condition, value, null);244 }245 246 /**247 * 创建区间参数的条件248 * @param condition249 * @param value250 * @param secondValue251 * @param typeHandler252 */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 condition265 * @param value266 * @param secondValue267 */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
limit ${startindex},${limit}
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 ListselectByExample(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 }