diff --git a/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java
new file mode 100644
index 00000000..d9693c5b
--- /dev/null
+++ b/mybatis-flex-core/src/main/java/com/mybatisflex/core/activerecord/query/WhereBuilder.java
@@ -0,0 +1,351 @@
+/*
+ * Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
+ *
+ * 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
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.mybatisflex.core.activerecord.query;
+
+import com.mybatisflex.core.query.CPI;
+import com.mybatisflex.core.query.QueryColumn;
+import com.mybatisflex.core.query.SqlConnector;
+import com.mybatisflex.core.util.LambdaGetter;
+import com.mybatisflex.core.util.LambdaUtil;
+
+import java.util.Collection;
+import java.util.function.Predicate;
+
+/**
+ * @param
+ * @author 王帅
+ * @since 2023-07-24
+ */
+public class WhereBuilder> {
+
+ private final R queryModel;
+ private final QueryColumn queryColumn;
+ private final SqlConnector connector;
+
+ public WhereBuilder(R queryModel, QueryColumn queryColumn, SqlConnector connector) {
+ this.queryModel = queryModel;
+ this.queryColumn = queryColumn;
+ this.connector = connector;
+ }
+
+ public R eq(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.eq(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R eq(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.eq(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R eq(LambdaGetter value) {
+ return eq(LambdaUtil.getQueryColumn(value));
+ }
+
+ public R eq(LambdaGetter value, Predicate when) {
+ return eq(LambdaUtil.getQueryColumn(value), when);
+ }
+
+ public R ne(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.ne(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R ne(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.ne(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R ne(LambdaGetter value) {
+ return ne(LambdaUtil.getQueryColumn(value));
+ }
+
+ public R ne(LambdaGetter value, Predicate when) {
+ return ne(LambdaUtil.getQueryColumn(value), when);
+ }
+
+ public R like(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.like(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R like(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.like(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R likeLeft(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.likeLeft(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R likeLeft(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.likeLeft(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R likeRight(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.likeRight(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R likeRight(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.likeRight(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R gt(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.gt(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R gt(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.gt(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R gt(LambdaGetter value) {
+ return gt(LambdaUtil.getQueryColumn(value));
+ }
+
+ public R gt(LambdaGetter value, Predicate when) {
+ return gt(LambdaUtil.getQueryColumn(value), when);
+ }
+
+ public R ge(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.ge(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R ge(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.ge(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R ge(LambdaGetter value) {
+ return ge(LambdaUtil.getQueryColumn(value));
+ }
+
+ public R ge(LambdaGetter value, Predicate when) {
+ return ge(LambdaUtil.getQueryColumn(value), when);
+ }
+
+ public R lt(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.lt(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R lt(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.lt(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R lt(LambdaGetter value) {
+ return lt(LambdaUtil.getQueryColumn(value));
+ }
+
+ public R lt(LambdaGetter value, Predicate when) {
+ return lt(LambdaUtil.getQueryColumn(value), when);
+ }
+
+ public R le(Object value) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.le(value), connector);
+ }
+ return queryModel;
+ }
+
+ public R le(Object value, Predicate when) {
+ if (value != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.le(value, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R le(LambdaGetter value) {
+ return le(LambdaUtil.getQueryColumn(value));
+ }
+
+ public R le(LambdaGetter value, Predicate when) {
+ return le(LambdaUtil.getQueryColumn(value), when);
+ }
+
+ public R isNull() {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.isNull(), connector);
+ return queryModel;
+ }
+
+ public R isNull(Predicate when) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.isNull(when), connector);
+ return queryModel;
+ }
+
+ public R isNotNull() {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.isNotNull(), connector);
+ return queryModel;
+ }
+
+ public R isNotNull(Predicate when) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.isNotNull(when), connector);
+ return queryModel;
+ }
+
+ public R in(Object... arrays) {
+ if (arrays != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.in(arrays), connector);
+ }
+ return queryModel;
+ }
+
+ public R in(Object[] arrays, Predicate when) {
+ //忽略 QueryWrapper.in("name", null) 的情况
+ if (arrays != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.in(arrays, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R in(R queryModel) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.in(queryModel), connector);
+ }
+ return this.queryModel;
+ }
+
+ public R in(R queryModel, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.in(queryModel, when), connector);
+ }
+ return this.queryModel;
+ }
+
+ public R in(Collection> collection) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.in(collection), connector);
+ }
+ return queryModel;
+ }
+
+ public R in(Collection> collection, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.in(collection, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R notIn(Object... arrays) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notIn(arrays), connector);
+ }
+ return queryModel;
+ }
+
+ public R notIn(Object[] arrays, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notIn(arrays, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R notIn(Collection> collection) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notIn(collection), connector);
+ }
+ return queryModel;
+ }
+
+ public R notIn(Collection> collection, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notIn(collection, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R notIn(R queryModel) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notIn(queryModel), connector);
+ }
+ return this.queryModel;
+ }
+
+ public R notIn(R queryModel, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notIn(queryModel, when), connector);
+ }
+ return this.queryModel;
+ }
+
+ public R between(Object start, Object end) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.between(start, end), connector);
+ }
+ return queryModel;
+ }
+
+ public R between(Object start, Object end, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.between(start, end, when), connector);
+ }
+ return queryModel;
+ }
+
+ public R notBetween(Object start, Object end) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notBetween(start, end), connector);
+ }
+ return queryModel;
+ }
+
+ public R notBetween(Object start, Object end, Predicate when) {
+ if (queryModel != null) {
+ CPI.addWhereQueryCondition(queryModel.getQueryWrapper(), queryColumn.notBetween(start, end, when), connector);
+ }
+ return queryModel;
+ }
+
+}