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); + } +}