diff --git a/.gitignore b/.gitignore
index fa13141b9bcf706184200eae27cb8e8d6a0b0646..2d622301a7817a1e327d211d992cdd88a41f4269 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,31 +1,331 @@
-target/
-logs/
-!.mvn/wrapper/maven-wrapper.jar
+#java忽略文件
+
+*.class
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#Eclipse忽略文件
+.metadata
+bin/
+tmp/
+*.tmp
+*.bak
+*.swp
+*~.nib
+local.properties
+.settings/
+.loadpath
+.recommenders
+
+.mvn/
+
+# Eclipse Core
+.project
+
+# External tool builders
+.externalToolBuilders/
-### STS ###
-.apt_generated
+# Locally stored "Eclipse launch configurations"
+*.launch
+
+# PyDev specific (Python IDE for Eclipse)
+*.pydevproject
+
+# CDT-specific (C/C++ Development Tooling)
+.cproject
+
+# JDT-specific (Eclipse Java Development Tools)
.classpath
+
+# Java annotation processor (APT)
.factorypath
-.project
-.settings
+
+# PDT-specific (PHP Development Tools)
+.buildpath
+
+# sbteclipse plugin
+.target
+
+# Tern plugin
+.tern-project
+
+# TeXlipse plugin
+.texlipse
+
+# STS (Spring Tool Suite)
.springBeans
-### IntelliJ IDEA ###
-.idea
+# Code Recommenders
+.recommenders/
+
+#windows忽略文件
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+#JetBrains 公司产品 如前端常用webstorm
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff:
+.idea/workspace.xml
+.idea/tasks.xml
+
+# Sensitive or high-churn files:
+.idea/dataSources/
+.idea/dataSources.ids
+.idea/dataSources.xml
+.idea/dataSources.local.xml
+.idea/sqlDataSources.xml
+.idea/dynamic.xml
+.idea/uiDesigner.xml
+
+# Gradle:
+.idea/gradle.xml
+.idea/libraries
+
+# Mongo Explorer plugin:
+.idea/mongoSettings.xml
+
+## File-based project format:
*.iws
+
+## Plugin-specific files:
+
+# IntelliJ
+/out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+
+#前端常用sublime编辑器
+# cache files for sublime text
+*.tmlanguage.cache
+*.tmPreferences.cache
+*.stTheme.cache
+
+# workspace files are user-specific
+*.sublime-workspace
+
+# project files should be checked into the repository, unless a significant
+# proportion of contributors will probably not be using SublimeText
+# *.sublime-project
+
+# sftp configuration file
+sftp-config.json
+
+# Package control specific files
+Package Control.last-run
+Package Control.ca-list
+Package Control.ca-bundle
+Package Control.system-ca-bundle
+Package Control.cache/
+Package Control.ca-certs/
+Package Control.merged-ca-bundle
+Package Control.user-ca-bundle
+oscrypto-ca-bundle.crt
+bh_unicode_properties.cache
+
+# Sublime-github package stores a github token in this file
+# https://packagecontrol.io/packages/sublime-github
+GitHub.sublime-settings
+
+#notepad
+# Notepad++ backups #
+*.bak
+
+#python忽略文件
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+env/
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+.vscode/
+node_modules/
+
+# PyInstaller
+# Usually these files are written by a python script from a template
+# before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*,cover
+.hypothesis/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+webapp/
+/webapp/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# pyenv
+.python-version
+
+# celery beat schedule file
+celerybeat-schedule
+
+# dotenv
+.env
+
+# virtualenv
+.venv/
+venv/
+ENV/
+
+# Spyder project settings
+.spyderproject
+
+# Rope project settings
+.ropeproject
+
+
+#maven忽略文件
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+
+# Exclude maven wrapper
+!/.mvn/wrapper/maven-wrapper.jar
+
+
+#mircosoft office忽略
+*.tmp
+
+# Word temporary
+~$*.doc*
+
+# Excel temporary
+~$*.xls*
+
+# Excel Backup File
+*.xlk
+
+# PowerPoint temporary
+~$*.ppt*
+
+# Visio autosave temporary files
+*.~vsdx
+
+#防止恶意插件病毒等
+*.exe
+
+
+# 忽略各级目录的idea和eclipse文件
+target/
+.settings/
+*.classpath
+*.project
+/logs/
+*.yml
*.iml
+.idea/
*.ipr
+*.iws
-### NetBeans ###
-nbproject/private/
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
-/.idea/
-/easyopen-parent.iml
-/.settings/
-/.project
-!/.idea/
-/.idea/libraries/
-/local-config/
+
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
\ No newline at end of file
diff --git a/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/Column.java b/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/Column.java
index 722d2f9301884fc5eb0384a5a69b48dacd4099a6..f4bf53d44ca9b6c4a6212a4bc153dafcfd599029 100644
--- a/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/Column.java
+++ b/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/Column.java
@@ -31,6 +31,7 @@ import java.lang.annotation.Target;
public @interface Column {
/**
* 表字段名
+ *
* @return 表字段名
*/
String name() default "";
@@ -50,12 +51,14 @@ public @interface Column {
* }
* }
*
+ *
* @return true:是
*/
boolean lazyFetch() default false;
/**
* 是否乐观锁字段
+ *
* @return true:是
*/
boolean version() default false;
@@ -72,12 +75,20 @@ public @interface Column {
*
* @return 未删除数据库保存的值
*/
- String notDeleteValue() default "";
+ String notDeleteValue() default "0";
/**
* 删除后数据库保存的值,不指定默认为1
*
* @return 删除后数据库保存的值
*/
- String deleteValue() default "";
+ String deleteValue() default "1";
+
+
+ /**
+ * 逻辑删除策略,logicDelete为true时有效
+ *
+ * @return
+ */
+ LogicDeleteStrategy logicDeleteStrategy() default LogicDeleteStrategy.FIXED_VALUE;
}
\ No newline at end of file
diff --git a/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/LogicDeleteStrategy.java b/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/LogicDeleteStrategy.java
new file mode 100644
index 0000000000000000000000000000000000000000..9a0404fb04935e2ea8382b727c2a5fe0ed779d32
--- /dev/null
+++ b/fastmybatis-annotation/src/main/java/com/gitee/fastmybatis/annotation/LogicDeleteStrategy.java
@@ -0,0 +1,39 @@
+package com.gitee.fastmybatis.annotation;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ *
+ * 逻辑删除策略
+ *
+ *
+ * @author youbeiwuhuan
+ * @version 1.0.0
+ * @date 2023/4/23 14:43
+ */
+
+public enum LogicDeleteStrategy {
+
+ /**
+ * 固定值策略,notDeleteValue和deleteValue生效
+ */
+ FIXED_VALUE("fixed_value"),
+
+
+ /**
+ * 删除时主键填充逻辑删除字段策略
+ */
+ ID_FILL("id_fill"),
+ ;
+
+ private String code;
+
+
+ LogicDeleteStrategy(String code) {
+ this.code = code;
+ }
+
+ public String getCode() {
+ return code;
+ }
+}
diff --git a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/FastmybatisConfig.java b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/FastmybatisConfig.java
index ee571ec7c726a1ee7664406c85c3576c4e60423f..ab3ad9e32598a34fa2fc03169ae4e50f200895fc 100644
--- a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/FastmybatisConfig.java
+++ b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/FastmybatisConfig.java
@@ -1,5 +1,6 @@
package com.gitee.fastmybatis.core;
+import com.gitee.fastmybatis.annotation.LogicDeleteStrategy;
import com.gitee.fastmybatis.core.handler.BaseFill;
import java.io.File;
@@ -55,6 +56,12 @@ public class FastmybatisConfig {
/** 全局模板classpath */
private String globalVmLocation;
+
+ /**
+ * 逻辑删除策略,默认LogicDeleteStrategy.FIXED_VALUE
+ *
+ */
+ private String logicDeleteStrategy = LogicDeleteStrategy.FIXED_VALUE.getCode();
/** 逻辑删除,指定未删除时的值 */
private String logicNotDeleteValue = "0";
@@ -116,6 +123,14 @@ public class FastmybatisConfig {
return camel2underline;
}
+
+ public String getLogicDeleteStrategy() {
+ return logicDeleteStrategy;
+ }
+
+ public void setLogicDeleteStrategy(String logicDeleteStrategy) {
+ this.logicDeleteStrategy = logicDeleteStrategy;
+ }
public int getMapperExecutorPoolSize() {
return mapperExecutorPoolSize;
}
diff --git a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnDefinition.java b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnDefinition.java
index f86831de4708bff78ffb6b2e47bd202974903bce..a49574403f7ec1159999114feef628c8acfb3156 100644
--- a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnDefinition.java
+++ b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnDefinition.java
@@ -7,7 +7,7 @@ import com.gitee.fastmybatis.core.handler.Identitys;
/**
* 表字段信息
- *
+ *
* @author tanghc
*/
public class ColumnDefinition {
@@ -16,43 +16,81 @@ public class ColumnDefinition {
private static final String MYBATIS_JDBC_TYPE = ", jdbcType=%s";
- /** java字段名 */
+ /**
+ * java字段名
+ */
private String javaFieldName;
- /** 数据库字段名 */
+ /**
+ * 数据库字段名
+ */
private String columnName;
- /** javaBean字段类型,String,Integer等 */
+ /**
+ * javaBean字段类型,String,Integer等
+ */
private String type;
- /** javaBean字段完整类型,java.lang.String */
+ /**
+ * javaBean字段完整类型,java.lang.String
+ */
private String fullType;
- /** 是否自增 */
+ /**
+ * 是否自增
+ */
private boolean isIdentity;
- /** 是否auto策略 */
+ /**
+ * 是否auto策略
+ */
private boolean isAuto;
- /** 是否uuid策略 */
+ /**
+ * 是否uuid策略
+ */
private boolean isUuid;
- /** 是否sequence策略(oracle) */
+ /**
+ * 是否sequence策略(oracle)
+ */
private boolean isSequence;
- /** 序列名称 */
+ /**
+ * 序列名称
+ */
private String sequenceName;
private boolean isCustomFill;
- /** 是否主键 */
+ /**
+ * 是否主键
+ */
private boolean isPk;
private boolean isEnum;
- /** 是否乐观锁字段 */
+ /**
+ * 是否乐观锁字段
+ */
private boolean isVersion;
- /** 是否逻辑删除 */
+ /**
+ * 是否逻辑删除.废弃用{@link #logicDeleteStrategy} 代替,同时配置logicDelete和logicDeleteStrategy则以logicDeleteStrategy为准
+ */
+ @Deprecated
private boolean isLogicDelete;
- /** 是否是忽略更新字段 */
+ /**
+ * 是否是忽略更新字段
+ */
private boolean isIgnoreUpdate;
- /** 删除值 */
+
+
+ /**
+ * 逻辑删除策略
+ */
+ private String logicDeleteStrategy;
+
+ /**
+ * 删除值
+ */
private Object logicDeleteValue;
- /** 未删除值 */
+ /**
+ * 未删除值
+ */
private Object logicNotDeleteValue;
private String comment;
private String typeHandler;
private FillType fillType;
-
+
private int orderIndex = 1;
public boolean getIsCustomFillUpdate() {
@@ -61,6 +99,7 @@ public class ColumnDefinition {
/**
* 是否是插入字段,不为自增且未设置忽略
+ *
* @return true:是插入字段
*/
public boolean getIsInsertColumn() {
@@ -69,6 +108,7 @@ public class ColumnDefinition {
/**
* 是否是更新字段,不为主键且未设置忽略
+ *
* @return
*/
public boolean getIsUpdateColumn() {
@@ -115,9 +155,9 @@ public class ColumnDefinition {
return hasTypeHandler(type)
? (", typeHandler=" + typeHandler)
: "";
- // jdbcType=VARCHAR
- //: type == FillType.INSERT || type == FillType.UPDATE
- //? String.format(MYBATIS_JDBC_TYPE, this.getMybatisJdbcType()) : "";
+ // jdbcType=VARCHAR
+ //: type == FillType.INSERT || type == FillType.UPDATE
+ //? String.format(MYBATIS_JDBC_TYPE, this.getMybatisJdbcType()) : "";
}
public boolean getHasTypeHandlerInsert() {
@@ -158,26 +198,27 @@ public class ColumnDefinition {
/**
* 返回 mybatis值内容
+ *
* @param fillType 填充类型
- * @param prefix 前缀
+ * @param prefix 前缀
* @return 如返回#{userName}
*/
private String getMybatisValue(FillType fillType, String prefix) {
// 如果是乐观锁字段
- if (this.isVersion) {
+ if (this.isVersion) {
return this.columnName + "+1";
} else {
StringBuilder mybatisValue = new StringBuilder();
mybatisValue.append("#{" + prefix + this.getJavaFieldName()).append(this.getTypeHandlerValue(fillType))
.append("}");
- return mybatisValue.toString();
+ return mybatisValue.toString();
}
}
/**
* 是否是乐观锁字段
- *
+ *
* @return true是
*/
public boolean getIsVersion() {
@@ -190,7 +231,7 @@ public class ColumnDefinition {
/**
* 是否是自增主键
- *
+ *
* @return true,是
*/
public boolean getIsIdentityPk() {
@@ -207,8 +248,8 @@ public class ColumnDefinition {
/**
* 返回java字段名,并且第一个字母大写
- *
- * @return 返回java字段名,并且第一个字母大写
+ *
+ * @return 返回java字段名, 并且第一个字母大写
*/
public String getJavaFieldNameUF() {
return FieldUtil.upperFirstLetter(getJavaFieldName());
@@ -216,7 +257,7 @@ public class ColumnDefinition {
/**
* 返回java字段
- *
+ *
* @return 返回java字段
*/
public String getJavaFieldName() {
@@ -229,8 +270,8 @@ public class ColumnDefinition {
/**
* 获得装箱类型,Integer,Float
- *
- * @return 获得装箱类型,Integer,Float
+ *
+ * @return 获得装箱类型, Integer, Float
*/
public String getJavaTypeBox() {
return JavaTypeUtil.convertToJavaBoxType(type);
@@ -316,10 +357,21 @@ public class ColumnDefinition {
this.typeHandler = typeHandler;
}
+
+ public String getLogicDeleteStrategy() {
+ return logicDeleteStrategy;
+ }
+
+ public void setLogicDeleteStrategy(String logicDeleteStrategy) {
+ this.logicDeleteStrategy = logicDeleteStrategy;
+ }
+
+ @Deprecated
public void setIsLogicDelete(boolean isLogicDelete) {
this.isLogicDelete = isLogicDelete;
}
+ @Deprecated
public boolean getIsLogicDelete() {
return this.isLogicDelete;
}
@@ -348,13 +400,13 @@ public class ColumnDefinition {
}
}
- public int getOrderIndex() {
- return orderIndex;
- }
+ public int getOrderIndex() {
+ return orderIndex;
+ }
- public void setOrderIndex(int orderIndex) {
- this.orderIndex = orderIndex;
- }
+ public void setOrderIndex(int orderIndex) {
+ this.orderIndex = orderIndex;
+ }
public boolean getIsAuto() {
return isAuto;
diff --git a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnSelector.java b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnSelector.java
index 2ade59bb75d7684c04c68acc9235b428e3b709aa..3d70d2dce9de7de40e5bac1ab1d16964f16cc3a5 100644
--- a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnSelector.java
+++ b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/ColumnSelector.java
@@ -269,17 +269,26 @@ public class ColumnSelector {
Object delVal, notDelVal;
String deleteValue = logicDeleteDefinition.getDeleteValue();
String notDeleteValue = logicDeleteDefinition.getNotDeleteValue();
+ String logicDeleteStrategy = logicDeleteDefinition.getLogicDeleteStrategy();
// 如果没有指定则使用全局配置的值
if ("".equals(deleteValue)) {
deleteValue = this.config.getLogicDeleteValue();
}
+
if ("".equals(notDeleteValue)) {
notDeleteValue = this.config.getLogicNotDeleteValue();
}
+
+ if ("".equals(logicDeleteStrategy)) {
+ logicDeleteStrategy = this.config.getLogicDeleteStrategy();
+ }
+
+
delVal = StringUtil.isInteger(deleteValue) ? Integer.valueOf(deleteValue) : deleteValue;
columnDefinition.setLogicDeleteValue(delVal);
notDelVal = StringUtil.isInteger(notDeleteValue) ? Integer.valueOf(notDeleteValue) : notDeleteValue;
columnDefinition.setLogicNotDeleteValue(notDelVal);
+ columnDefinition.setLogicDeleteStrategy(logicDeleteStrategy);
}
private BaseFill> getFill(String columnName, Field field) {
diff --git a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/LogicDeleteDefinition.java b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/LogicDeleteDefinition.java
index 7534de718cc4bfeecfcfc064d96d5d26771d2205..7ff465ce3c59b3b75b9f8bffefedf3a49267b93a 100644
--- a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/LogicDeleteDefinition.java
+++ b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/generator/LogicDeleteDefinition.java
@@ -4,6 +4,11 @@ package com.gitee.fastmybatis.core.ext.code.generator;
* @author thc
*/
public class LogicDeleteDefinition {
+ /**
+ * 逻辑删除策略
+ */
+ private String logicDeleteStrategy;
+
/**
* 未删除数据库保存的值,不指定默认为0
*/
@@ -29,4 +34,12 @@ public class LogicDeleteDefinition {
public void setDeleteValue(String deleteValue) {
this.deleteValue = deleteValue;
}
+
+ public String getLogicDeleteStrategy() {
+ return logicDeleteStrategy;
+ }
+
+ public void setLogicDeleteStrategy(String logicDeleteStrategy) {
+ this.logicDeleteStrategy = logicDeleteStrategy;
+ }
}
diff --git a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/util/FieldUtil.java b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/util/FieldUtil.java
index 45dea9bc2ffa72a356f6b846eb388144b9da1272..c54e450d0a3c0cdfd8c6469ce28fe3a3d325383a 100644
--- a/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/util/FieldUtil.java
+++ b/fastmybatis-core/src/main/java/com/gitee/fastmybatis/core/ext/code/util/FieldUtil.java
@@ -8,11 +8,13 @@ import com.gitee.fastmybatis.core.FastmybatisConfig;
import com.gitee.fastmybatis.core.annotation.LazyFetch;
import com.gitee.fastmybatis.core.annotation.LogicDelete;
import com.gitee.fastmybatis.core.ext.code.generator.LogicDeleteDefinition;
+import com.gitee.fastmybatis.annotation.LogicDeleteStrategy;
import com.gitee.fastmybatis.core.util.ClassUtil;
import com.gitee.fastmybatis.core.util.StringUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
+import java.util.Objects;
import java.util.Optional;
/**
@@ -20,318 +22,335 @@ import java.util.Optional;
*/
public class FieldUtil {
private FieldUtil() {
- }
-
- private static final String UUID_NAME = "uuid";
- private static final String INCREMENT_NAME = "increment";
- private static final String SEQUENCE_NAME = "seq";
- private static final String STRING_TYPE = "String";
- private static final String DOT = ".";
-
- /**
- * 过滤"."
- *
- * @param field 字段名
- * @return 过滤‘.’符号
- */
- public static String dotFilter(String field) {
- if (isNotEmpty(field) && field.contains(DOT)) {
- String[] words = field.split("\\.");
- StringBuilder ret = new StringBuilder();
- for (String str : words) {
- ret.append(upperFirstLetter(str));
- }
- return ret.toString();
- }
- return field;
- }
-
- /**
- * 将第一个字母转换成大写
- *
- * @param str 内容
- * @return 返回原字符串且第一个字符大写
- */
- public static String upperFirstLetter(String str) {
- if (isNotEmpty(str)) {
- String firstUpper = String.valueOf(str.charAt(0)).toUpperCase();
- str = firstUpper + str.substring(1);
- }
- return str;
- }
-
- /**
- * 将第一个字母转换成小写
- *
- * @param str 内容
- * @return 返回原字符串且第一个字母小写
- */
- public static String lowerFirstLetter(String str) {
- if (isNotEmpty(str)) {
- String firstLower = String.valueOf(str.charAt(0)).toLowerCase();
- str = firstLower + str.substring(1);
- }
- return str;
- }
-
- public static final char UNDERLINE = '_';
-
- /**
- * 驼峰转下划线
- * @param param 内容
- * @return 返回转换后的字符串
- */
- public static String camelToUnderline(String param) {
- if (param == null || "".equals(param.trim())) {
- return "";
- }
- int len = param.length();
- StringBuilder sb = new StringBuilder(len);
- for (int i = 0; i < len; i++) {
- char c = param.charAt(i);
- int preIndex = i - 1;
- int nextIndex = i + 1;
- // 是否需要变为小写字母
- boolean needToLower = (
- Character.isUpperCase(c)
- && preIndex > 0
- && Character.isLowerCase(param.charAt(preIndex))
- )
- ||
- (
- Character.isUpperCase(c)
- && nextIndex < len
- && Character.isLowerCase(param.charAt(nextIndex))
- );
-
- if (needToLower) {
- if(i > 0) {
- sb.append(UNDERLINE);
- }
- sb.append(Character.toLowerCase(c));
- } else {
- sb.append(c);
- }
- }
- return sb.toString();
- }
-
- public static String formatField(String field) {
- // t.`username`
- String[] arr = field.split("\\.");
- if (arr.length == 2) {
- field = arr[1];
- }
- // 去除首尾`(mysql)
- field = StringUtil.trimLeadingCharacter(field, '`');
- field = StringUtil.trimTrailingCharacter(field, '`');
- // 去除首尾"(pgsql)
- field = StringUtil.trimLeadingCharacter(field, '"');
- field = StringUtil.trimTrailingCharacter(field, '"');
- // 去除首尾[](SqlServer)
- field = StringUtil.trimLeadingCharacter(field, '[');
- field = StringUtil.trimTrailingCharacter(field, ']');
- return field;
- }
-
- /**
- * 下划线转驼峰
- * @param param 内容
- * @return 返回转换后的字符串
- */
- public static String underlineToCamel(String param) {
- if (param == null || "".equals(param.trim())) {
- return "";
- }
- int len = param.length();
- StringBuilder sb = new StringBuilder(len);
- for (int i = 0; i < len; i++) {
- char c = param.charAt(i);
- if (c == UNDERLINE) {
- if (++i < len) {
- sb.append(Character.toUpperCase(param.charAt(i)));
- }
- } else {
- sb.append(c);
- }
- }
- return sb.toString();
- }
-
- /**
- * 字段是否被transient关键字修饰或有@Transient注解
- * @param field 字段
- * @return 是返回true
- */
- public static boolean isTransientField(Field field) {
- return Modifier.isTransient(field.getModifiers());
- }
-
- private static boolean isEmpty(String s) {
- return s == null || s.trim().length() == 0;
- }
-
- private static boolean isNotEmpty(String s) {
- return !isEmpty(s);
- }
-
- public static boolean isPk(Field field, FastmybatisConfig config) {
- String pkName = FieldUtil.getPkAnnotation(field)
- .map(Pk::name)
- .orElse("");
- if ("".equals(pkName)) {
- pkName = config.getGlobalIdName();
- }
- return pkName.equalsIgnoreCase(FieldUtil.camelToUnderline(field.getName()));
- }
-
- /**
- * 是否是主键并且没有指定主键策略
- * @param field 字段
- * @return true:是
- */
- public static boolean isPkStrategyNone(Field field, FastmybatisConfig config) {
- if (!isPk(field, config)) {
- return false;
- }
- return getPkStrategy(field)
- .orElse(PkStrategy.INCREMENT) == PkStrategy.NONE;
- }
-
- public static Optional getTableAnnotation(Field field) {
- Class> entityClass = field.getDeclaringClass();
- return getTableAnnotation(entityClass);
- }
-
- public static Optional getTableAnnotation(Class> entityClass) {
- Table table = ClassUtil.findAnnotation(entityClass, Table.class);
- return Optional.ofNullable(table);
- }
-
- /**
- * 返回主键策略
- * @param field 字段
- * @return 主键策略
- */
- public static Optional getPkStrategy(Field field) {
- return getPkAnnotation(field).map(Pk::strategy);
- }
-
- /**
- * 返回主键配置
- * @param field 字段
- * @return 主键策略
- */
- public static Optional getPkAnnotation(Field field) {
- return getTableAnnotation(field).map(Table::pk);
- }
-
- /**
- * 是否主键自增
- * @param field 字段
- * @return true:是
- */
- public static boolean isIncrement(Field field) {
- return getPkStrategy(field).orElse(PkStrategy.NONE) == PkStrategy.INCREMENT;
- }
-
- /**
- * 是否是UUID字段
- * @param field 字段
- * @return true:是
- */
- public static boolean isUuid(Field field) {
- return getPkStrategy(field)
- .orElse(PkStrategy.NONE) == PkStrategy.UUID;
- }
-
- /**
- * 是否是seq字段
- * @param field 字段
- * @return true:是
- */
- public static boolean isSequence(Field field) {
- return isNotEmpty(getSequenceName(field));
- }
-
- /**
- * 返回seq名称
- * @param field 字段
- * @return 没有返回null
- */
- public static String getSequenceName(Field field) {
- return getTableAnnotation(field)
- .map(Table::pk)
- .map(Pk::sequenceName)
- .orElse(null);
- }
-
- /**
- * 是否是乐观锁字段
- */
- public static boolean isVersionColumn(Field field) {
- return getColumnAnnotation(field)
- .map(Column::version)
- .orElse(false);
- }
-
- public static String getColumnName(Field field, FastmybatisConfig config) {
- String name = getColumnAnnotation(field)
- .map(Column::name)
- .orElse(null);
- // 没有注解使用java字段名
- if (isEmpty(name)) {
- String javaFieldName = field.getName();
- // 如果开启了驼峰转下划线形式
- name = config.isCamel2underline() ? FieldUtil.camelToUnderline(field.getName()) : javaFieldName;
- }
- return name;
- }
-
- public static Optional getColumnAnnotation(Field field) {
- return Optional.ofNullable(field.getAnnotation(Column.class));
- }
-
- public static boolean hasTableAnnotation(Field field) {
- Class> declaringClass = field.getDeclaringClass();
- return ClassUtil.findAnnotation(declaringClass, Table.class) != null;
- }
-
- /**
- * 懒加载对象字段名
- */
- public static String getLazyEntityColumnName(Field field, FastmybatisConfig config) {
- Boolean lazy = getColumnAnnotation(field)
- .map(Column::lazyFetch)
- .orElse(false);
- if (lazy) {
- return getColumnName(field, config);
- }
- LazyFetch annotation = field.getAnnotation(LazyFetch.class);
- if (annotation != null) {
- String column = annotation.column();
- if ("".equals(column)) {
- throw new IllegalArgumentException("必须指定LazyFetch.column值");
- }
- }
- return null;
- }
-
- public static LogicDeleteDefinition getLogicDeleteDefinition(Field field) {
- Column column = field.getAnnotation(Column.class);
- if (column != null && column.logicDelete()) {
- LogicDeleteDefinition logicDeleteDefinition = new LogicDeleteDefinition();
- logicDeleteDefinition.setDeleteValue(column.deleteValue());
- logicDeleteDefinition.setNotDeleteValue(column.notDeleteValue());
- return logicDeleteDefinition;
- }
- LogicDelete logicDelete = field.getAnnotation(LogicDelete.class);
- if (logicDelete != null) {
- LogicDeleteDefinition logicDeleteDefinition = new LogicDeleteDefinition();
- logicDeleteDefinition.setDeleteValue(logicDelete.deleteValue());
- logicDeleteDefinition.setNotDeleteValue(logicDelete.notDeleteValue());
- return logicDeleteDefinition;
- }
- return null;
- }
+ }
+
+ private static final String UUID_NAME = "uuid";
+ private static final String INCREMENT_NAME = "increment";
+ private static final String SEQUENCE_NAME = "seq";
+ private static final String STRING_TYPE = "String";
+ private static final String DOT = ".";
+
+ /**
+ * 过滤"."
+ *
+ * @param field 字段名
+ * @return 过滤‘.’符号
+ */
+ public static String dotFilter(String field) {
+ if (isNotEmpty(field) && field.contains(DOT)) {
+ String[] words = field.split("\\.");
+ StringBuilder ret = new StringBuilder();
+ for (String str : words) {
+ ret.append(upperFirstLetter(str));
+ }
+ return ret.toString();
+ }
+ return field;
+ }
+
+ /**
+ * 将第一个字母转换成大写
+ *
+ * @param str 内容
+ * @return 返回原字符串且第一个字符大写
+ */
+ public static String upperFirstLetter(String str) {
+ if (isNotEmpty(str)) {
+ String firstUpper = String.valueOf(str.charAt(0)).toUpperCase();
+ str = firstUpper + str.substring(1);
+ }
+ return str;
+ }
+
+ /**
+ * 将第一个字母转换成小写
+ *
+ * @param str 内容
+ * @return 返回原字符串且第一个字母小写
+ */
+ public static String lowerFirstLetter(String str) {
+ if (isNotEmpty(str)) {
+ String firstLower = String.valueOf(str.charAt(0)).toLowerCase();
+ str = firstLower + str.substring(1);
+ }
+ return str;
+ }
+
+ public static final char UNDERLINE = '_';
+
+ /**
+ * 驼峰转下划线
+ *
+ * @param param 内容
+ * @return 返回转换后的字符串
+ */
+ public static String camelToUnderline(String param) {
+ if (param == null || "".equals(param.trim())) {
+ return "";
+ }
+ int len = param.length();
+ StringBuilder sb = new StringBuilder(len);
+ for (int i = 0; i < len; i++) {
+ char c = param.charAt(i);
+ int preIndex = i - 1;
+ int nextIndex = i + 1;
+ // 是否需要变为小写字母
+ boolean needToLower = (
+ Character.isUpperCase(c)
+ && preIndex > 0
+ && Character.isLowerCase(param.charAt(preIndex))
+ )
+ ||
+ (
+ Character.isUpperCase(c)
+ && nextIndex < len
+ && Character.isLowerCase(param.charAt(nextIndex))
+ );
+
+ if (needToLower) {
+ if (i > 0) {
+ sb.append(UNDERLINE);
+ }
+ sb.append(Character.toLowerCase(c));
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ public static String formatField(String field) {
+ // t.`username`
+ String[] arr = field.split("\\.");
+ if (arr.length == 2) {
+ field = arr[1];
+ }
+ // 去除首尾`(mysql)
+ field = StringUtil.trimLeadingCharacter(field, '`');
+ field = StringUtil.trimTrailingCharacter(field, '`');
+ // 去除首尾"(pgsql)
+ field = StringUtil.trimLeadingCharacter(field, '"');
+ field = StringUtil.trimTrailingCharacter(field, '"');
+ // 去除首尾[](SqlServer)
+ field = StringUtil.trimLeadingCharacter(field, '[');
+ field = StringUtil.trimTrailingCharacter(field, ']');
+ return field;
+ }
+
+ /**
+ * 下划线转驼峰
+ *
+ * @param param 内容
+ * @return 返回转换后的字符串
+ */
+ public static String underlineToCamel(String param) {
+ if (param == null || "".equals(param.trim())) {
+ return "";
+ }
+ int len = param.length();
+ StringBuilder sb = new StringBuilder(len);
+ for (int i = 0; i < len; i++) {
+ char c = param.charAt(i);
+ if (c == UNDERLINE) {
+ if (++i < len) {
+ sb.append(Character.toUpperCase(param.charAt(i)));
+ }
+ } else {
+ sb.append(c);
+ }
+ }
+ return sb.toString();
+ }
+
+ /**
+ * 字段是否被transient关键字修饰或有@Transient注解
+ *
+ * @param field 字段
+ * @return 是返回true
+ */
+ public static boolean isTransientField(Field field) {
+ return Modifier.isTransient(field.getModifiers());
+ }
+
+ private static boolean isEmpty(String s) {
+ return s == null || s.trim().length() == 0;
+ }
+
+ private static boolean isNotEmpty(String s) {
+ return !isEmpty(s);
+ }
+
+ public static boolean isPk(Field field, FastmybatisConfig config) {
+ String pkName = FieldUtil.getPkAnnotation(field)
+ .map(Pk::name)
+ .orElse("");
+ if ("".equals(pkName)) {
+ pkName = config.getGlobalIdName();
+ }
+ return pkName.equalsIgnoreCase(FieldUtil.camelToUnderline(field.getName()));
+ }
+
+ /**
+ * 是否是主键并且没有指定主键策略
+ *
+ * @param field 字段
+ * @return true:是
+ */
+ public static boolean isPkStrategyNone(Field field, FastmybatisConfig config) {
+ if (!isPk(field, config)) {
+ return false;
+ }
+ return getPkStrategy(field)
+ .orElse(PkStrategy.INCREMENT) == PkStrategy.NONE;
+ }
+
+ public static Optional getTableAnnotation(Field field) {
+ Class> entityClass = field.getDeclaringClass();
+ return getTableAnnotation(entityClass);
+ }
+
+ public static Optional getTableAnnotation(Class> entityClass) {
+ Table table = ClassUtil.findAnnotation(entityClass, Table.class);
+ return Optional.ofNullable(table);
+ }
+
+ /**
+ * 返回主键策略
+ *
+ * @param field 字段
+ * @return 主键策略
+ */
+ public static Optional getPkStrategy(Field field) {
+ return getPkAnnotation(field).map(Pk::strategy);
+ }
+
+ /**
+ * 返回主键配置
+ *
+ * @param field 字段
+ * @return 主键策略
+ */
+ public static Optional getPkAnnotation(Field field) {
+ return getTableAnnotation(field).map(Table::pk);
+ }
+
+ /**
+ * 是否主键自增
+ *
+ * @param field 字段
+ * @return true:是
+ */
+ public static boolean isIncrement(Field field) {
+ return getPkStrategy(field).orElse(PkStrategy.NONE) == PkStrategy.INCREMENT;
+ }
+
+ /**
+ * 是否是UUID字段
+ *
+ * @param field 字段
+ * @return true:是
+ */
+ public static boolean isUuid(Field field) {
+ return getPkStrategy(field)
+ .orElse(PkStrategy.NONE) == PkStrategy.UUID;
+ }
+
+ /**
+ * 是否是seq字段
+ *
+ * @param field 字段
+ * @return true:是
+ */
+ public static boolean isSequence(Field field) {
+ return isNotEmpty(getSequenceName(field));
+ }
+
+ /**
+ * 返回seq名称
+ *
+ * @param field 字段
+ * @return 没有返回null
+ */
+ public static String getSequenceName(Field field) {
+ return getTableAnnotation(field)
+ .map(Table::pk)
+ .map(Pk::sequenceName)
+ .orElse(null);
+ }
+
+ /**
+ * 是否是乐观锁字段
+ */
+ public static boolean isVersionColumn(Field field) {
+ return getColumnAnnotation(field)
+ .map(Column::version)
+ .orElse(false);
+ }
+
+ public static String getColumnName(Field field, FastmybatisConfig config) {
+ String name = getColumnAnnotation(field)
+ .map(Column::name)
+ .orElse(null);
+ // 没有注解使用java字段名
+ if (isEmpty(name)) {
+ String javaFieldName = field.getName();
+ // 如果开启了驼峰转下划线形式
+ name = config.isCamel2underline() ? FieldUtil.camelToUnderline(field.getName()) : javaFieldName;
+ }
+ return name;
+ }
+
+ public static Optional getColumnAnnotation(Field field) {
+ return Optional.ofNullable(field.getAnnotation(Column.class));
+ }
+
+ public static boolean hasTableAnnotation(Field field) {
+ Class> declaringClass = field.getDeclaringClass();
+ return ClassUtil.findAnnotation(declaringClass, Table.class) != null;
+ }
+
+ /**
+ * 懒加载对象字段名
+ */
+ public static String getLazyEntityColumnName(Field field, FastmybatisConfig config) {
+ Boolean lazy = getColumnAnnotation(field)
+ .map(Column::lazyFetch)
+ .orElse(false);
+ if (lazy) {
+ return getColumnName(field, config);
+ }
+ LazyFetch annotation = field.getAnnotation(LazyFetch.class);
+ if (annotation != null) {
+ String column = annotation.column();
+ if ("".equals(column)) {
+ throw new IllegalArgumentException("必须指定LazyFetch.column值");
+ }
+ }
+ return null;
+ }
+
+ public static LogicDeleteDefinition getLogicDeleteDefinition(Field field) {
+ Column column = field.getAnnotation(Column.class);
+ if (column != null && column.logicDelete()) {
+
+ LogicDeleteDefinition logicDeleteDefinition = new LogicDeleteDefinition();
+ logicDeleteDefinition.setLogicDeleteStrategy(column.logicDeleteStrategy().getCode());
+ logicDeleteDefinition.setDeleteValue(column.deleteValue());
+ logicDeleteDefinition.setNotDeleteValue(column.notDeleteValue());
+
+ return logicDeleteDefinition;
+ }
+
+
+ LogicDelete logicDelete = field.getAnnotation(LogicDelete.class);
+ if (logicDelete != null) {
+ LogicDeleteDefinition logicDeleteDefinition = new LogicDeleteDefinition();
+ // 兼容老逻辑
+ logicDeleteDefinition.setLogicDeleteStrategy(LogicDeleteStrategy.FIXED_VALUE.getCode());
+ logicDeleteDefinition.setDeleteValue(logicDelete.deleteValue());
+ logicDeleteDefinition.setNotDeleteValue(logicDelete.notDeleteValue());
+ return logicDeleteDefinition;
+ }
+ return null;
+ }
}
diff --git a/fastmybatis-core/src/main/resources/fastmybatis/tpl/dmdbms.vm b/fastmybatis-core/src/main/resources/fastmybatis/tpl/dmdbms.vm
index ffac7ce1f522751342a94f1d912e1fce549b91af..2a4dd8377f3906fc63749efb90d04a0db8d16835 100644
--- a/fastmybatis-core/src/main/resources/fastmybatis/tpl/dmdbms.vm
+++ b/fastmybatis-core/src/main/resources/fastmybatis/tpl/dmdbms.vm
@@ -432,14 +432,18 @@
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -448,21 +452,27 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+
#end
-
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -471,17 +481,39 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{value}
+
#end
-
-
- DELETE FROM ${table.tableName}
-
-
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
+ #end
+ #end
+
+
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+
+ #else
+
+ DELETE FROM `${table.tableName}`
+
+
+ #end
diff --git a/fastmybatis-core/src/main/resources/fastmybatis/tpl/microsoftsqlserver.vm b/fastmybatis-core/src/main/resources/fastmybatis/tpl/microsoftsqlserver.vm
index 72ec75669df8c581c5fb6050830d226e13a323f6..74932ea754e11482cafed4371fc2e64d65a2a19d 100644
--- a/fastmybatis-core/src/main/resources/fastmybatis/tpl/microsoftsqlserver.vm
+++ b/fastmybatis-core/src/main/resources/fastmybatis/tpl/microsoftsqlserver.vm
@@ -423,14 +423,18 @@
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -439,21 +443,27 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+
#end
-
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -462,18 +472,40 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{value}
+
#end
-
-
- DELETE FROM [${table.tableName}]
-
-
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
+ #end
+ #end
+
+
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+
+ #else
+
+ DELETE FROM `${table.tableName}`
+
+
+ #end
diff --git a/fastmybatis-core/src/main/resources/fastmybatis/tpl/mysql.vm b/fastmybatis-core/src/main/resources/fastmybatis/tpl/mysql.vm
index fa4570588d9c21c54459bb5363f8058b14de6f8f..91c499eefb355d6083159f7be22bcc0d4e883c1e 100644
--- a/fastmybatis-core/src/main/resources/fastmybatis/tpl/mysql.vm
+++ b/fastmybatis-core/src/main/resources/fastmybatis/tpl/mysql.vm
@@ -402,70 +402,88 @@
-
- #if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
-
- #foreach($column in $columns)
- #if(${column.isPk})
- #elseif(${column.isLogicDelete})
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
#end
#end
-
- WHERE ${pk.columnName} = #{${pk.javaFieldName}}
- AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
- #if(${table.hasVersionColumn})
- AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
- #else
- DELETE FROM ${table.tableName}
- WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+
+ WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+ #if(${table.hasVersionColumn})
+ AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
+ #else
+
+ DELETE FROM ${table.tableName}
+ WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+ #end
-
- #if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
-
- #foreach($column in $columns)
- #if(${column.isPk})
- #elseif(${column.isLogicDelete})
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
#end
#end
-
- WHERE ${pk.columnName} = #{value}
- AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
- #if(${table.hasVersionColumn})
- AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
- #else
- DELETE FROM ${table.tableName}
- WHERE ${pk.columnName} = #{value}
+
+ WHERE ${pk.columnName} = #{value}
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+ #if(${table.hasVersionColumn})
+ AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
+ #else
+
+ DELETE FROM ${table.tableName}
+ WHERE ${pk.columnName} = #{value}
+ #end
-
- #if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
-
- #foreach($column in $columns)
- #if(${column.isPk})
- #elseif(${column.isLogicDelete})
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
#end
#end
-
-
- AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
- #else
- DELETE FROM `${table.tableName}`
-
- #end
+ #end
+
+
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+
+ #else
+
+ DELETE FROM `${table.tableName}`
+
+ #end
diff --git a/fastmybatis-core/src/main/resources/fastmybatis/tpl/oracle.vm b/fastmybatis-core/src/main/resources/fastmybatis/tpl/oracle.vm
index c624a3735c62d389c1e636b2c6019e1d51c46dbb..b57991f90773338c97268f0cda79be8287a54088 100644
--- a/fastmybatis-core/src/main/resources/fastmybatis/tpl/oracle.vm
+++ b/fastmybatis-core/src/main/resources/fastmybatis/tpl/oracle.vm
@@ -432,14 +432,18 @@
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -448,21 +452,27 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+
#end
-
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -471,17 +481,39 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{value}
+
#end
-
-
- DELETE FROM ${table.tableName}
-
-
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
+ #end
+ #end
+
+
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+
+ #else
+
+ DELETE FROM `${table.tableName}`
+
+
+ #end
diff --git a/fastmybatis-core/src/main/resources/fastmybatis/tpl/postgresql.vm b/fastmybatis-core/src/main/resources/fastmybatis/tpl/postgresql.vm
index 42282b668adc1adb3e85dfb35bee239ea649465b..39333f7fadac3d1fb8b84f4e28050b1f125bf81c 100644
--- a/fastmybatis-core/src/main/resources/fastmybatis/tpl/postgresql.vm
+++ b/fastmybatis-core/src/main/resources/fastmybatis/tpl/postgresql.vm
@@ -383,14 +383,18 @@
-
#if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
+
+ UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -399,21 +403,27 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+
#end
-
-
#if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
+
+ UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -422,17 +432,39 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{value}
+
#end
-
-
- DELETE FROM "${table.tableName}"
-
-
+ #if(${table.hasLogicDeleteColumn})
+
+ UPDATE ${table.tableName}
+
+ #foreach($column in $columns)
+ #if(${column.isPk})
+ #elseif(${column.isLogicDelete})
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
+ #end
+ #end
+
+
+ AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+
+ #else
+
+ DELETE FROM `${table.tableName}`
+
+
+ #end
diff --git a/fastmybatis-core/src/main/resources/fastmybatis/tpl/sqlite.vm b/fastmybatis-core/src/main/resources/fastmybatis/tpl/sqlite.vm
index b6cf49004c90aba94f2518c20991777d0e834c7a..ab5d7fa5ffe645f2c7e0b523813812c6b3250a7e 100644
--- a/fastmybatis-core/src/main/resources/fastmybatis/tpl/sqlite.vm
+++ b/fastmybatis-core/src/main/resources/fastmybatis/tpl/sqlite.vm
@@ -402,14 +402,18 @@
-
#if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
+
+ UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -418,21 +422,27 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{${pk.javaFieldName}}
+
#end
-
-
#if(${table.hasLogicDeleteColumn})
- UPDATE ${table.tableName}
+
+ UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
@@ -441,31 +451,39 @@
#if(${table.hasVersionColumn})
AND ${table.versionColumn.columnName} = #{${table.versionColumn.javaFieldName}}
#end
+
#else
+
DELETE FROM ${table.tableName}
WHERE ${pk.columnName} = #{value}
+
#end
-
-
#if(${table.hasLogicDeleteColumn})
+
UPDATE ${table.tableName}
#foreach($column in $columns)
#if(${column.isPk})
#elseif(${column.isLogicDelete})
- ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #if($column.logicDeleteStrategy == 'fixed_value')
+ ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicDeleteValueString},
+ #elseif($column.logicDeleteStrategy == 'id_fill')
+ ${table.logicDeleteColumn.columnName} = ${pk.columnName},
+ #end
#end
#end
AND ${table.logicDeleteColumn.columnName} = ${table.logicDeleteColumn.logicNotDeleteValueString}
+
#else
+
DELETE FROM `${table.tableName}`
+
#end
-
diff --git a/fastmybatis-demo/fastmybatis-demo-springboot/src/main/java/com/myapp/entity/TUser.java b/fastmybatis-demo/fastmybatis-demo-springboot/src/main/java/com/myapp/entity/TUser.java
index c7030981a18730d11d8ff36cccc2a28b7c20d656..c18f257c7b126325a44a00d8f625d156a31d28fb 100644
--- a/fastmybatis-demo/fastmybatis-demo-springboot/src/main/java/com/myapp/entity/TUser.java
+++ b/fastmybatis-demo/fastmybatis-demo-springboot/src/main/java/com/myapp/entity/TUser.java
@@ -4,6 +4,7 @@ import com.gitee.fastmybatis.annotation.Column;
import com.gitee.fastmybatis.annotation.Pk;
import com.gitee.fastmybatis.annotation.PkStrategy;
import com.gitee.fastmybatis.annotation.Table;
+import com.gitee.fastmybatis.annotation.LogicDeleteStrategy;
import java.math.BigDecimal;
import java.util.Date;
@@ -28,7 +29,7 @@ public class TUser {
private Byte state;
/** 是否删除, 数据库字段:isdel */
- @Column(logicDelete = true)
+ @Column(logicDelete = true,logicDeleteStrategy = LogicDeleteStrategy.ID_FILL)
private Boolean isdel;
/** 备注, 数据库字段:remark */
diff --git a/fastmybatis-demo/fastmybatis-demo-springboot/src/main/resources/application.properties b/fastmybatis-demo/fastmybatis-demo-springboot/src/main/resources/application.properties
index 8ec6da14e31231a7dced2b2e1cf33d02104ed5b9..c765f92f649981f5b40979cee7e990ff4b9c860e 100644
--- a/fastmybatis-demo/fastmybatis-demo-springboot/src/main/resources/application.properties
+++ b/fastmybatis-demo/fastmybatis-demo-springboot/src/main/resources/application.properties
@@ -3,7 +3,7 @@ spring.profiles.active=dev
# mysql
mysql.host=127.0.0.1:3306
mysql.username=root
-mysql.password=root
+mysql.password=fan1988
mysql.db=stu
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
diff --git a/fastmybatis-demo/fastmybatis-demo-springboot/src/test/java/com/myapp/UserMapperTest.java b/fastmybatis-demo/fastmybatis-demo-springboot/src/test/java/com/myapp/UserMapperTest.java
index ab0b58bc8221df679dedef4ebac393db1f96572e..98e9aa280106659804f7e1d16cccd9ede507397a 100644
--- a/fastmybatis-demo/fastmybatis-demo-springboot/src/test/java/com/myapp/UserMapperTest.java
+++ b/fastmybatis-demo/fastmybatis-demo-springboot/src/test/java/com/myapp/UserMapperTest.java
@@ -1,5 +1,6 @@
package com.myapp;
+import com.gitee.fastmybatis.core.query.Query;
import com.myapp.dao.TUserMapper;
import com.myapp.entity.TUser;
import org.junit.Test;
@@ -41,4 +42,24 @@ public class UserMapperTest extends BaseTest {
System.out.println(user);
}
+ @Test
+ public void deleteById() {
+ int effectRows=userMapper.deleteById(1);
+ System.out.println(effectRows);
+ }
+
+ @Test
+ public void delete() {
+ TUser user = new TUser();
+ user.setId(2);
+ int effectRows=userMapper.delete(user);
+ System.out.println(effectRows);
+ }
+ @Test
+ public void deleteByQuery() {
+ Query query = new Query();
+ query.eq("id", 3);
+ int effectRows=userMapper.deleteByQuery(query);
+ System.out.println(effectRows);
+ }
}
diff --git a/fastmybatis-demo/fastmybatis-demo-springboot/t_user-mysql.sql b/fastmybatis-demo/fastmybatis-demo-springboot/t_user-mysql.sql
index fb5b75cd0cd3f64755bced68dc7d2d1ce0c5d2b3..45aa52c801ae606cd8113a40dcce237b0ad0cd9d 100644
--- a/fastmybatis-demo/fastmybatis-demo-springboot/t_user-mysql.sql
+++ b/fastmybatis-demo/fastmybatis-demo-springboot/t_user-mysql.sql
@@ -7,7 +7,7 @@ CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
`username` varchar(255) DEFAULT NULL COMMENT '用户名',
`state` tinyint(4) DEFAULT NULL COMMENT '状态',
- `isdel` bit(1) DEFAULT NULL COMMENT '是否删除',
+ `isdel` int(11) DEFAULT NULL COMMENT '是否删除',
`remark` text COMMENT '备注',
`add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`money` decimal(10,2) DEFAULT NULL COMMENT '金额',