mybatis plus内置了好多CRUD,其中 EntityWrapper这个类就是。
这个类是mybatis plus帮我们写好的好多接口,就如同我们在dao层写好方法在xml中实现一样。
那么这个友好的类给我们实现了哪些方法呐,今天我们来通过看看源码,来具体说说,

/*** Copyright (c) 2011-2014, hubin (jobob@qq.com).* <p>* Licensed under the Apache License, Version 2.0 (the "License"); you may not* use this file except in compliance with the License. You may obtain a copy of* the License at* <p>* http://www.apache.org/licenses/LICENSE-2.0* <p>* Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the* License for the specific language governing permissions and limitations under* the License.*/
package com.baomidou.mybatisplus.mapper;import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;import com.baomidou.mybatisplus.enums.SqlLike;
import com.baomidou.mybatisplus.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.toolkit.ArrayUtils;
import com.baomidou.mybatisplus.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.toolkit.MapUtils;
import com.baomidou.mybatisplus.toolkit.SqlUtils;
import com.baomidou.mybatisplus.toolkit.StringUtils;/*** <p>* 条件构造抽象类,定义T-SQL语法* </p>** @author hubin , yanghu , Dyang , Caratacus* @Date 2016-11-7*/
@SuppressWarnings("serial")
public abstract class Wrapper<T> implements Serializable {/*** 占位符*/private static final String PLACE_HOLDER = "{%s}";private static final String MYBATIS_PLUS_TOKEN = "#{%s.paramNameValuePairs.%s}";private static final String MP_GENERAL_PARAMNAME = "MPGENVAL";private static final String DEFAULT_PARAM_ALIAS = "ew";protected String paramAlias = null;/*** SQL 查询字段内容,例如:id,name,age*/protected String sqlSelect = null;/*** 实现了TSQL语法的SQL实体*/protected SqlPlus sql = new SqlPlus();/*** 自定义是否输出sql为 WHERE OR AND OR OR*/protected Boolean isWhere;/*** 拼接WHERE后应该是AND还是OR*/protected String AND_OR = "AND";private Map<String, Object> paramNameValuePairs = new HashMap<>(4);private AtomicInteger paramNameSeq = new AtomicInteger(0);/*** 兼容EntityWrapper** @return*/public T getEntity() {return null;}public String getSqlSelect() {if (StringUtils.isEmpty(sqlSelect)) {return null;}return stripSqlInjection(sqlSelect);}public Wrapper<T> setSqlSelect(String sqlSelect) {if (StringUtils.isNotEmpty(sqlSelect)) {this.sqlSelect = sqlSelect;}return this;}/*** SQL 片段 (子类实现)*/public abstract String getSqlSegment();public String toString() {String sqlSegment = getSqlSegment();if (StringUtils.isNotEmpty(sqlSegment)) {sqlSegment = sqlSegment.replaceAll("#\\{" + getParamAlias() + ".paramNameValuePairs.MPGENVAL[0-9]+}", "\\?");}return sqlSegment;}/*** <p>* SQL中WHERE关键字跟的条件语句* </p>* <p>* eg: ew.where("name='zhangsan'").where("id={0}","123");* <p>* 输出: WHERE (NAME='zhangsan' AND id=123)* </p>** @param sqlWhere where语句* @param params   参数集* @return this*/public Wrapper<T> where(String sqlWhere, Object... params) {sql.WHERE(formatSql(sqlWhere, params));return this;}/*** <p>* 等同于SQL的"field=value"表达式* </p>** @param column* @param params* @return*/public Wrapper<T> eq(String column, Object params) {sql.WHERE(formatSql(String.format("%s = {0}", column), params));return this;}/*** <p>* 等同于SQL的"field <> value"表达式* </p>** @param column* @param params* @return*/public Wrapper<T> ne(String column, Object params) {sql.WHERE(formatSql(String.format("%s <> {0}", column), params));return this;}/*** <p>* 等同于SQL的"field=value"表达式* </p>** @param params* @return*/@SuppressWarnings({"rawtypes", "unchecked"})public Wrapper<T> allEq(Map<String, Object> params) {if (MapUtils.isNotEmpty(params)) {Iterator iterator = params.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, Object> entry = (Map.Entry<String, Object>) iterator.next();Object value = entry.getValue();if (StringUtils.checkValNotNull(value)) {sql.WHERE(formatSql(String.format("%s = {0}", entry.getKey()), entry.getValue()));}}}return this;}/*** <p>* 等同于SQL的"field>value"表达式* </p>** @param column* @param params* @return*/public Wrapper<T> gt(String column, Object params) {sql.WHERE(formatSql(String.format("%s > {0}", column), params));return this;}/*** <p>* 等同于SQL的"field>=value"表达式* </p>** @param column* @param params* @return*/public Wrapper<T> ge(String column, Object params) {sql.WHERE(formatSql(String.format("%s >= {0}", column), params));return this;}/*** <p>* 等同于SQL的"field<value"表达式* </p>** @param column* @param params* @return*/public Wrapper<T> lt(String column, Object params) {sql.WHERE(formatSql(String.format("%s < {0}", column), params));return this;}/*** <p>* 等同于SQL的"field<=value"表达式* </p>** @param column* @param params* @return*/public Wrapper<T> le(String column, Object params) {sql.WHERE(formatSql(String.format("%s <= {0}", column), params));return this;}/*** <p>* AND 连接后续条件* </p>** @param sqlAnd and条件语句* @param params 参数集* @return this*/public Wrapper<T> and(String sqlAnd, Object... params) {sql.AND().WHERE(formatSql(sqlAnd, params));return this;}/*** <p>* 使用AND连接并换行* </p>* <p>* eg: ew.where("name='zhangsan'").and("id=11").andNew("statu=1"); 输出: WHERE* (name='zhangsan' AND id=11) AND (statu=1)* </p>** @param sqlAnd AND 条件语句* @param params 参数值* @return this*/public Wrapper<T> andNew(String sqlAnd, Object... params) {sql.AND_NEW().WHERE(formatSql(sqlAnd, params));return this;}/*** <p>* 使用AND连接并换行* </p>* <p>** @return this*/public Wrapper<T> and() {sql.AND_NEW();return this;}/*** <p>* 使用OR连接并换行* </p>** @return this*/public Wrapper<T> or() {sql.OR_NEW();return this;}/*** <p>* 添加OR条件* </p>** @param sqlOr  or 条件语句* @param params 参数集* @return this*/public Wrapper<T> or(String sqlOr, Object... params) {if (StringUtils.isEmpty(sql.toString())) {AND_OR = "OR";}sql.OR().WHERE(formatSql(sqlOr, params));return this;}/*** <p>* 使用OR换行,并添加一个带()的新的条件* </p>* <p>* eg: ew.where("name='zhangsan'").and("id=11").orNew("statu=1"); 输出: WHERE* (name='zhangsan' AND id=11) OR (statu=1)* </p>** @param sqlOr  AND 条件语句* @param params 参数值* @return this*/public Wrapper<T> orNew(String sqlOr, Object... params) {if (StringUtils.isEmpty(sql.toString())) {AND_OR = "OR";}sql.OR_NEW().WHERE(formatSql(sqlOr, params));return this;}/*** <p>* SQL中groupBy关键字跟的条件语句* </p>* <p>* eg: ew.where("name='zhangsan'").groupBy("id,name")* </p>** @param columns SQL 中的 Group by 语句,无需输入 Group By 关键字* @return this*/public Wrapper<T> groupBy(String columns) {sql.GROUP_BY(columns);return this;}/*** <p>* SQL中having关键字跟的条件语句* </p>* <p>* eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null")* </p>** @param sqlHaving having关键字后面跟随的语句* @param params    参数集* @return EntityWrapper<T>*/public Wrapper<T> having(String sqlHaving, Object... params) {sql.HAVING(formatSql(sqlHaving, params));return this;}/*** <p>* SQL中orderby关键字跟的条件语句* </p>* <p>* eg: ew.groupBy("id,name").having("id={0}",22).and("password is not null"* ).orderBy("id,name")* </p>** @param columns SQL 中的 order by 语句,无需输入 Order By 关键字* @return this*/public Wrapper<T> orderBy(String columns) {sql.ORDER_BY(columns);return this;}/*** <p>* SQL中orderby关键字跟的条件语句,可根据变更动态排序* </p>** @param columns SQL 中的 order by 语句,无需输入 Order By 关键字* @param isAsc   是否为升序* @return this*/public Wrapper<T> orderBy(String columns, boolean isAsc) {if (StringUtils.isNotEmpty(columns)) {sql.ORDER_BY(columns + (isAsc ? " ASC" : " DESC"));}return this;}/*** LIKE条件语句,value中无需前后%** @param column 字段名称* @param value  匹配值* @return this*/public Wrapper<T> like(String column, String value) {handerLike(column, value, SqlLike.DEFAULT, false);return this;}/*** NOT LIKE条件语句,value中无需前后%** @param column 字段名称* @param value  匹配值* @return this*/public Wrapper<T> notLike(String column, String value) {handerLike(column, value, SqlLike.DEFAULT, true);return this;}/*** 处理LIKE操作** @param column 字段名称* @param value  like匹配值* @param isNot  是否为NOT LIKE操作*/private void handerLike(String column, String value, SqlLike type, boolean isNot) {if (StringUtils.isNotEmpty(column) && StringUtils.isNotEmpty(value)) {StringBuilder inSql = new StringBuilder();inSql.append(column);if (isNot) {inSql.append(" NOT");}inSql.append(" LIKE {0}");sql.WHERE(formatSql(inSql.toString(), SqlUtils.concatLike(value, type)));}}/*** LIKE条件语句,value中无需前后%** @param column 字段名称* @param value  匹配值* @param type* @return this*/public Wrapper<T> like(String column, String value, SqlLike type) {handerLike(column, value, type, false);return this;}/*** NOT LIKE条件语句,value中无需前后%** @param column 字段名称* @param value  匹配值* @param type* @return this*/public Wrapper<T> notLike(String column, String value, SqlLike type) {handerLike(column, value, type, true);return this;}/*** is not null 条件** @param columns 字段名称。多个字段以逗号分隔。* @return this*/public Wrapper<T> isNotNull(String columns) {sql.IS_NOT_NULL(columns);return this;}/*** is not null 条件** @param columns 字段名称。多个字段以逗号分隔。* @return this*/public Wrapper<T> isNull(String columns) {sql.IS_NULL(columns);return this;}/*** EXISTS 条件语句,目前适配mysql及oracle** @param value 匹配值* @return this*/public Wrapper<T> exists(String value) {sql.EXISTS(value);return this;}/*** NOT EXISTS条件语句** @param value 匹配值* @return this*/public Wrapper<T> notExists(String value) {sql.NOT_EXISTS(value);return this;}/*** IN 条件语句,目前适配mysql及oracle** @param column 字段名称* @param value  逗号拼接的字符串* @return this*/public Wrapper<T> in(String column, String value) {if (StringUtils.isNotEmpty(value)) {in(column, StringUtils.splitWorker(value, ",", -1, false));}return this;}/*** NOT IN条件语句** @param column 字段名称* @param value  逗号拼接的字符串* @return this*/public Wrapper<T> notIn(String column, String value) {if (StringUtils.isNotEmpty(value)) {notIn(column, StringUtils.splitWorker(value, ",", -1, false));}return this;}/*** IN 条件语句,目前适配mysql及oracle** @param column 字段名称* @param value  匹配值 List集合* @return this*/public Wrapper<T> in(String column, Collection<?> value) {if (CollectionUtils.isNotEmpty(value))sql.WHERE(formatSql(inExpression(column, value, false), value.toArray()));return this;}/*** NOT IN 条件语句,目前适配mysql及oracle** @param column 字段名称* @param value  匹配值 List集合* @return this*/public Wrapper<T> notIn(String column, Collection<?> value) {if (CollectionUtils.isNotEmpty(value))sql.WHERE(formatSql(inExpression(column, value, true), value.toArray()));return this;}/*** IN 条件语句,目前适配mysql及oracle** @param column 字段名称* @param value  匹配值 object数组* @return this*/public Wrapper<T> in(String column, Object[] value) {if (ArrayUtils.isNotEmpty(value))sql.WHERE(formatSql(inExpression(column, Arrays.asList(value), false), value));return this;}/*** NOT IN 条件语句,目前适配mysql及oracle** @param column 字段名称* @param value  匹配值 object数组* @return this*/public Wrapper<T> notIn(String column, Object... value) {if (ArrayUtils.isNotEmpty(value))sql.WHERE(formatSql(inExpression(column, Arrays.asList(value), true), value));return this;}/*** 获取in表达式** @param column 字段名称* @param value  集合List* @param isNot  是否为NOT IN操作*/private String inExpression(String column, Collection<?> value, boolean isNot) {if (StringUtils.isNotEmpty(column) && CollectionUtils.isNotEmpty(value)) {StringBuilder inSql = new StringBuilder();inSql.append(column);if (isNot) {inSql.append(" NOT");}inSql.append(" IN ");inSql.append("(");int size = value.size();for (int i = 0; i < size; i++) {inSql.append(String.format(PLACE_HOLDER, i));if (i + 1 < size) {inSql.append(",");}}inSql.append(")");return inSql.toString();}return null;}/*** betwwee 条件语句** @param column 字段名称* @param val1* @param val2* @return this*/public Wrapper<T> between(String column, Object val1, Object val2) {sql.WHERE(formatSql(String.format("%s BETWEEN {0} AND {1}", column), val1, val2));return this;}/*** NOT betwwee 条件语句** @param column 字段名称* @param val1* @param val2* @return this*/public Wrapper<T> notBetween(String column, Object val1, Object val2) {sql.WHERE(formatSql(String.format("%s NOT BETWEEN {0} AND {1}", column), val1, val2));return this;}/*** 为了兼容之前的版本,可使用where()或and()替代** @param sqlWhere where sql部分* @param params   参数集* @return this*/public Wrapper<T> addFilter(String sqlWhere, Object... params) {return and(sqlWhere, params);}/*** <p>* 根据判断条件来添加条件语句部分 使用 andIf() 替代* </p>* <p>* eg: ew.filterIfNeed(false,"name='zhangsan'").where("name='zhangsan'")* .filterIfNeed(true,"id={0}",22)* <p>* 输出: WHERE (name='zhangsan' AND id=22)* </p>** @param need     是否需要添加该条件* @param sqlWhere 条件语句* @param params   参数集* @return this*/public Wrapper<T> addFilterIfNeed(boolean need, String sqlWhere, Object... params) {return need ? where(sqlWhere, params) : this;}/*** <p>* SQL注入内容剥离* </p>** @param value 待处理内容* @return this*/protected String stripSqlInjection(String value) {return value.replaceAll("('.+--)|(--)|(\\|)|(%7C)", "");}/*** <p>* 格式化SQL* </p>** @param sqlStr SQL语句部分* @param params 参数集* @return this*/protected String formatSql(String sqlStr, Object... params) {return formatSqlIfNeed(true, sqlStr, params);}/*** <p>* 根据需要格式化SQL<BR>* <BR>* Format SQL for methods: EntityWrapper.where/and/or...("name={0}", value);* ALL the {<b>i</b>} will be replaced with #{MPGENVAL<b>i</b>}<BR>* <BR>* ew.where("sample_name=<b>{0}</b>", "haha").and("sample_age &gt;<b>{0}</b>* and sample_age&lt;<b>{1}</b>", 18, 30) <b>TO</b>* sample_name=<b>#{MPGENVAL1}</b> and sample_age&gt;#<b>{MPGENVAL2}</b> and* sample_age&lt;<b>#{MPGENVAL3}</b><BR>* </p>** @param need   是否需要格式化* @param sqlStr SQL语句部分* @param params 参数集* @return this*/protected String formatSqlIfNeed(boolean need, String sqlStr, Object... params) {if (!need || StringUtils.isEmpty(sqlStr)) {return null;}// #200if (ArrayUtils.isNotEmpty(params)) {for (int i = 0; i < params.length; ++i) {String genParamName = MP_GENERAL_PARAMNAME + paramNameSeq.incrementAndGet();sqlStr = sqlStr.replace(String.format(PLACE_HOLDER, i),String.format(MYBATIS_PLUS_TOKEN, getParamAlias(), genParamName));paramNameValuePairs.put(genParamName, params[i]);}}return sqlStr;}/*** <p>* 自定义是否输出sql开头为 `WHERE` OR `AND` OR `OR`* </p>** @param bool* @return this*/public Wrapper<T> isWhere(Boolean bool) {this.isWhere = bool;return this;}/*** <p>* SQL LIMIT* </p>** @param begin 起始* @param end   结束* @return this*/public Wrapper<T> limit(int begin, int end) {sql.LIMIT(begin, end);return this;}/*** Fix issue 200.** @return* @since 2.0.3*/public Map<String, Object> getParamNameValuePairs() {return paramNameValuePairs;}public String getParamAlias() {return StringUtils.isEmpty(paramAlias) ? DEFAULT_PARAM_ALIAS : paramAlias;}/*** <p>* 调用该方法时 应当在吃初始化时优先设置该值 不要重复设置该值 要不然我就给你抛异常了* </p>** @param paramAlias* @return*/public Wrapper<T> setParamAlias(String paramAlias) {if (StringUtils.isNotEmpty(getSqlSegment())) {throw new MybatisPlusException("Error: Please call this method when initializing!");}if (StringUtils.isNotEmpty(this.paramAlias)) {throw new MybatisPlusException("Error: Please do not call the method repeatedly!");}this.paramAlias = paramAlias;return this;}
}

最后说一句,阅读源码,你会收获很多,看到别人的处理方式,你会有很大进步的。哈哈,今天你学到了吗

mybatis plus 中 EntityWrapper源码解读相关推荐

  1. Fabric中PBFT源码解读——Checkpoint机制

    文章目录 1. 写在前面 1.1 前置阅读 1.2 对TestCheckpoint函数的测试 2. 对TestCheckpoint函数运行流程的解读 2.1 Checkpoint和Water mark ...

  2. Fabric中PBFT源码解读 (3)

    文章目录 5. Preprepare消息的接收以及Prepare消息的发送 6. Prepare消息的接收以及Commit消息的发送 5. Preprepare消息的接收以及Prepare消息的发送 ...

  3. spark源码解读3之RDD中top源码解读

    更多代码请见:https://github.com/xubo245/SparkLearning spark源码解读系列环境:spark-2.0.1 (20161103github下载版) 1.理解 输 ...

  4. Thread 中 ThreadLocal 源码解读

    先了解一下ThreadLocal类提供的几个方法: public T get() { } public void set(T value) { } public void remove() { } p ...

  5. pytorch中SGD源码解读

    调用方法: torch.optim.SGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0 ...

  6. 源码解读Mybatis List列表In查询实现的注意事项

    http://www.blogjava.net/xmatthew/archive/2011/08/31/355879.html 在SQL开发过程中,动态构建In集合条件查询是比较常见的用法,在Myba ...

  7. Hive中lateral view的应用到源码解读

    对于从事大数据开发的同学,经常会应用到explode(炸裂函数)和lateral view(侧输出流). Explode(炸裂函数) 参数必须是array或者map格式(通常跟split函数使用): ...

  8. ios html zfplayer,【iOS】ZFPlayer源码解读中

    前言 本篇继ZFPlayer源码解读基础之上,主要解析说明控制层与播放器,因为在上篇文章至现在并未提及丝毫关于这两个类业务的实现. 首先说下这两个类各自的职责. 控制层:主要负责响应与用户之间的交互, ...

  9. html 源码知识,源码解读

    用Node.js写一个web服务器,我前面已经写过两篇文章了: 第一篇是不使用任何框架也能搭建一个web服务器,主要是熟悉Node.js原生API的使用:使用Node.js原生API写一个web服务器 ...

最新文章

  1. TaxonKit:小巧、高效、实用的NCBI分类学数据命令行工具
  2. DeepMind 再发 Nature,图神经网络解决物理难题
  3. Javascript实现复选框(全选反选功能)
  4. 一文读懂 .NET 中的高性能队列 Channel
  5. Etherchannel的配置 三层
  6. 【报告分享】2019中国少儿编程行业报告.pdf(附下载链接)
  7. 布隆过滤器(Bloom Filter)- 原理、实现和推导
  8. Mysql学习笔记(一)数据类型
  9. grafana计算不同时间的差值_大数据时代!如何基于Spark Streaming构建实时计算平台...
  10. 蚂蚁金服 SOFAArk 0.6.0 新特性介绍 | 模块化开发容器...
  11. iOS 推送功能打包后获取不到deviceToken
  12. 绝地求生key钓鱼全套教程加源码
  13. java 阿里云消息推送到手机
  14. Cloudera Manager Agent 的 Parcel 目录位于可用空间小于 5.0 吉字节 的文件系统上。 /opt/cloudera/parcels(可用:5.0 吉字节 (12.74%)
  15. 阿里云华北1235、华东1、华东2和华南1分别对应哪些城市?地域节点物理数据中心在哪?... 1
  16. 咳血的独角兽丨互联网的幕后攻防
  17. Promise学习-手写一个promise
  18. 网络空间资产测绘小结2
  19. 基于android的校友帮平台系统
  20. 赵小楼《天道》《遥远的救世主》深度解析(86)聪明是一种思考方式,精明只有算计和小心眼,只想赚钱却又不想承担风险是典型的弱势文化

热门文章

  1. 为什么人工智能被过度炒作?
  2. 我人生的贵人系列之 - 文深刘
  3. DeepFake 新高度:一阶运动模型让“万物皆可动”
  4. 5 个越早知道越好的 Python 特性
  5. 命名人工智能最高奖,破译德军密码,却被祖国逼得自杀-6月7日
  6. SAP MM ME21N 创建委外采购PO报错 - Not possible to determine any components - 之对策
  7. leetcode--Two Sum
  8. 认清智能化战争的制胜根本
  9. 他们提出了一个大胆的猜想:GWT(深度学习)→通用人工智能
  10. 麦肯锡季刊 | 人工智能的发展与障碍