From bb4e54bca6139ed8eac495f8978dadf54467679a Mon Sep 17 00:00:00 2001
From: chenjialing <595168663@qq.com>
Date: Mon, 28 Mar 2022 11:18:09 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96--mybatis=E5=A2=9E=E5=BC=BA?=
=?UTF-8?q?=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../com/genersoft/iot/vmp/conf/dao/Id.java | 16 +++++
.../genersoft/iot/vmp/conf/dao/Invisible.java | 16 +++++
.../SelectByEntityExtendedLanguageDriver.java | 43 ++++++++++++++
.../SimpleInsertExtendedLanguageDriver.java | 59 +++++++++++++++++++
.../SimpleSelectInExtendedLanguageDriver.java | 33 +++++++++++
.../SimpleUpdateExtendedLanguageDriver.java | 53 +++++++++++++++++
6 files changed, 220 insertions(+)
create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/dao/Id.java
create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/dao/Invisible.java
create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/dao/SelectByEntityExtendedLanguageDriver.java
create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleInsertExtendedLanguageDriver.java
create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleSelectInExtendedLanguageDriver.java
create mode 100644 src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleUpdateExtendedLanguageDriver.java
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/dao/Id.java b/src/main/java/com/genersoft/iot/vmp/conf/dao/Id.java
new file mode 100644
index 00000000..45f20b20
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/dao/Id.java
@@ -0,0 +1,16 @@
+package com.genersoft.iot.vmp.conf.dao;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 通过注解控制实体中的ID属性
+ *
+ * @author
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Id {
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/dao/Invisible.java b/src/main/java/com/genersoft/iot/vmp/conf/dao/Invisible.java
new file mode 100644
index 00000000..6983deff
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/dao/Invisible.java
@@ -0,0 +1,16 @@
+package com.genersoft.iot.vmp.conf.dao;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 通过注解控制实体中的属性不存数据库
+ *
+ * @author
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Invisible {
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/dao/SelectByEntityExtendedLanguageDriver.java b/src/main/java/com/genersoft/iot/vmp/conf/dao/SelectByEntityExtendedLanguageDriver.java
new file mode 100644
index 00000000..1dcc1597
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/dao/SelectByEntityExtendedLanguageDriver.java
@@ -0,0 +1,43 @@
+package com.genersoft.iot.vmp.conf.dao;
+
+import com.google.common.base.CaseFormat;
+import org.apache.ibatis.mapping.SqlSource;
+import org.apache.ibatis.scripting.LanguageDriver;
+import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
+import org.apache.ibatis.session.Configuration;
+
+import java.lang.reflect.Field;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * mybatis 注解模式 select 支持传入对象 驱动
+ * SELECT * FROM xxx_user where 1=1 (#{userObject})
+ *
+ * @author
+ */
+public class SelectByEntityExtendedLanguageDriver extends XMLLanguageDriver implements LanguageDriver {
+
+ private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");
+
+ @Override
+ public SqlSource createSqlSource(Configuration configuration, String script, Class> parameterType) {
+
+ Matcher matcher = inPattern.matcher(script);
+ if (matcher.find()) {
+ StringBuffer ss = new StringBuffer();
+ for (Field field : parameterType.getDeclaredFields()) {
+ //如果不是加了忽略注解的字段就去拼接
+ if (!field.isAnnotationPresent(Invisible.class)) {
+ //and type !=''
+ String temp = "and __column=#{__field}";
+ ss.append(temp.replaceAll("__field", field.getName()).replaceAll("__column",
+ CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName())));
+ }
+ }
+ script = matcher.replaceAll(ss.toString());
+ script = "";
+ }
+ return super.createSqlSource(configuration, script, parameterType);
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleInsertExtendedLanguageDriver.java b/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleInsertExtendedLanguageDriver.java
new file mode 100644
index 00000000..4269f0be
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleInsertExtendedLanguageDriver.java
@@ -0,0 +1,59 @@
+package com.genersoft.iot.vmp.conf.dao;
+
+import com.google.common.base.CaseFormat;
+import org.apache.ibatis.mapping.SqlSource;
+import org.apache.ibatis.scripting.LanguageDriver;
+import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
+import org.apache.ibatis.session.Configuration;
+
+import java.lang.reflect.Field;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * mybatis 注解模式 insert 支持传入对象 驱动
+ * INSERT INTO xxx_user (#{userObject})
+ *
+ * @author
+ */
+public class SimpleInsertExtendedLanguageDriver extends XMLLanguageDriver implements LanguageDriver {
+ private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");
+
+ @Override
+ public SqlSource createSqlSource(Configuration configuration, String script, Class> parameterType) {
+ Matcher matcher = inPattern.matcher(script);
+ if (matcher.find()) {
+
+ // 组建 (xx, xx , xx)字段语句
+ StringBuffer ss = new StringBuffer("( ");
+ for (Field field : parameterType.getDeclaredFields()) {
+ //如果不是加了忽略注解的字段就去拼接
+ if (field.isAnnotationPresent(Invisible.class)) {
+ continue;
+ }
+
+ String column = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName());
+ String temp = " __column,";
+ ss.append(temp.replaceAll("__field", field.getName()).replaceAll("__column", column));
+ }
+ ss.append(") VALUES ( ");
+
+ // 组建 ("1", "xx", "")值语句
+ for (Field field : parameterType.getDeclaredFields()) {
+ if (field.isAnnotationPresent(Invisible.class)) {
+ continue;
+ }
+
+ String temp = " #{__field},";
+ ss.append(temp.replaceAll("__field", field.getName()));
+ }
+
+ ss.append(") ");
+ script = matcher.replaceAll(ss.toString());
+
+ script = "";
+ }
+ return super.createSqlSource(configuration, script, parameterType);
+ }
+
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleSelectInExtendedLanguageDriver.java b/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleSelectInExtendedLanguageDriver.java
new file mode 100644
index 00000000..654d4c9c
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleSelectInExtendedLanguageDriver.java
@@ -0,0 +1,33 @@
+package com.genersoft.iot.vmp.conf.dao;
+
+import org.apache.ibatis.mapping.SqlSource;
+import org.apache.ibatis.scripting.LanguageDriver;
+import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
+import org.apache.ibatis.session.Configuration;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * mybatis 注解模式 select 支持传入list 驱动
+ * SELECT * FROM xxx_user WHERE user_id IN (#{userIds})
+ *
+ * @author
+ */
+public class SimpleSelectInExtendedLanguageDriver extends XMLLanguageDriver implements LanguageDriver {
+
+ private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");
+
+ @Override
+ public SqlSource createSqlSource(Configuration configuration, String script, Class> parameterType) {
+
+ Matcher matcher = inPattern.matcher(script);
+ if (matcher.find()) {
+ script = matcher
+ .replaceAll("(#{__item})");
+ }
+
+ script = "";
+ return super.createSqlSource(configuration, script, parameterType);
+ }
+}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleUpdateExtendedLanguageDriver.java b/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleUpdateExtendedLanguageDriver.java
new file mode 100644
index 00000000..145657d6
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/conf/dao/SimpleUpdateExtendedLanguageDriver.java
@@ -0,0 +1,53 @@
+package com.genersoft.iot.vmp.conf.dao;
+
+import com.google.common.base.CaseFormat;
+import org.apache.ibatis.mapping.SqlSource;
+import org.apache.ibatis.scripting.LanguageDriver;
+import org.apache.ibatis.scripting.xmltags.XMLLanguageDriver;
+import org.apache.ibatis.session.Configuration;
+
+import java.lang.reflect.Field;
+import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * mybatis 注解模式 update 支持传入对象 驱动
+ * UPDATE xxx_user (#{userObject}) WHERE true and xxxx
+ *
+ * @author
+ */
+public class SimpleUpdateExtendedLanguageDriver extends XMLLanguageDriver implements LanguageDriver {
+ private final Pattern inPattern = Pattern.compile("\\(#\\{(\\w+)\\}\\)");
+
+ @Override
+ public SqlSource createSqlSource(Configuration configuration, String script, Class> parameterType) {
+ Matcher matcher = inPattern.matcher(script);
+ if (matcher.find()) {
+ StringBuffer ss = new StringBuffer();
+ ss.append("");
+
+ for (Field field : parameterType.getDeclaredFields()) {
+ if (!field.isAnnotationPresent(Id.class)){
+ String temp = "";
+ if(field.getType()== Date.class){
+ temp = "__column=#{__field},";
+ }else {
+ temp = "__column=#{__field},";
+ }
+ ss.append(temp.replaceAll("__field", field.getName()).replaceAll("__column",
+ CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, field.getName())));
+ }
+
+ }
+
+ ss.deleteCharAt(ss.lastIndexOf(","));
+ ss.append("");
+
+ script = matcher.replaceAll(ss.toString());
+
+ script = "";
+ }
+ return super.createSqlSource(configuration, script, parameterType);
+ }
+}