From 921d0084ac3b9c43eb1024f5b835dac0fc6f2279 Mon Sep 17 00:00:00 2001 From: ztNozdormu Date: Sun, 27 Aug 2023 15:34:26 +0800 Subject: [PATCH] =?UTF-8?q?clickhouse=E6=A8=A1=E5=9D=97=E5=A2=9E=E5=8A=A0m?= =?UTF-8?q?ybatis-plus=E5=9F=BA=E6=9C=AC=E8=B5=A0=E5=88=A0=E6=94=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=96=B9=E6=B3=95=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../injector/ClickHouseSqlInjector.java | 35 +++++++++ .../injector/config/CkProperties.java | 35 +++++++++ .../injector/config/ClickHouseConfig.java | 57 ++++++++++++++ .../injector/enums/SqlMethodDiv.java | 45 +++++++++++ .../injector/methods/DeleteClickHouse.java | 77 +++++++++++++++++++ .../methods/UpdateByIdClickHouse.java | 71 +++++++++++++++++ .../injector/methods/UpdateClickHouse.java | 68 ++++++++++++++++ ...ot.autoconfigure.AutoConfiguration.imports | 1 + 8 files changed, 389 insertions(+) create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/ClickHouseSqlInjector.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/CkProperties.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/ClickHouseConfig.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/enums/SqlMethodDiv.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/DeleteClickHouse.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateByIdClickHouse.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateClickHouse.java create mode 100644 yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/ClickHouseSqlInjector.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/ClickHouseSqlInjector.java new file mode 100644 index 000000000..60461ecc8 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/ClickHouseSqlInjector.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.framework.clickhouse.injector; + +import cn.iocoder.yudao.framework.clickhouse.injector.enums.SqlMethodDiv; +import cn.iocoder.yudao.framework.clickhouse.injector.methods.DeleteClickHouse; +import cn.iocoder.yudao.framework.clickhouse.injector.methods.UpdateByIdClickHouse; +import cn.iocoder.yudao.framework.clickhouse.injector.methods.UpdateClickHouse; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; +import com.baomidou.mybatisplus.core.metadata.TableInfo; + + +import java.util.List; + +/** + * 注册方法 + * + * @author coder + */ +public class ClickHouseSqlInjector extends DefaultSqlInjector { + + @Override + public List getMethodList(Class mapperClass, TableInfo tableInfo) { + /** + * 这里很重要,先要通过父类方法,获取到原有的集合,不然会自带的通用方法会失效的 + */ + List methodList = super.getMethodList(mapperClass,tableInfo); + /*** + * 添加自定义方法类 + */ + methodList.add(new UpdateByIdClickHouse(SqlMethodDiv.UPDATE_BY_ID.getMethod())); + methodList.add(new UpdateClickHouse(SqlMethodDiv.UPDATE.getMethod())); + methodList.add(new DeleteClickHouse(SqlMethodDiv.DELETE_BY_ID.getMethod())); + return methodList; + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/CkProperties.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/CkProperties.java new file mode 100644 index 000000000..57d088492 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/CkProperties.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.framework.clickhouse.injector.config;//package com.w3.framework.clickhouse.config; +// +//import lombok.Data; +//import org.springframework.boot.context.properties.ConfigurationProperties; +// +///** +// * jdbc基本配置参数 +// */ +//@ConfigurationProperties(prefix = "spring.datasource.click") +//@Data +//public class CkProperties { +// +// public String address; +// +// public String username; +// +// public String password; +// +// public String dbName; +// +// public int socketTimeout; +// +// private String driverClassName; +// +// private String url; +// +// private int initialSize; +// +// private int maxActive; +// +// private int minIdle; +// +// private int maxWait; +// +//} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/ClickHouseConfig.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/ClickHouseConfig.java new file mode 100644 index 000000000..7a5a219a9 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/config/ClickHouseConfig.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.framework.clickhouse.injector.config;//package com.w3.framework.clickhouse.config; +// +//import lombok.Data; +//import org.springframework.boot.autoconfigure.AutoConfiguration; +//import org.springframework.boot.context.properties.EnableConfigurationProperties; +//import org.springframework.context.annotation.Bean; +//import ru.yandex.clickhouse.ClickHouseDataSource; +//import ru.yandex.clickhouse.settings.ClickHouseProperties; +// +// +///** +// * @desc ClickHouse基本配置参数 +// * SQL方式执行 +// */ +//@AutoConfiguration +//@EnableConfigurationProperties({CkProperties.class}) +//@Data +//public class ClickHouseConfig { +// +//// private static ClickHouseDataSource clickHouseDataSource; +// +// @Bean +// public ClickHouseDataSource clickHouseDataSource(CkProperties ckProperties) { +// ClickHouseProperties properties = new ClickHouseProperties(); +// properties.setUser(ckProperties.username); +// properties.setPassword(ckProperties.getPassword()); +// properties.setDatabase(ckProperties.dbName); +// properties.setSocketTimeout(ckProperties.socketTimeout); +//// clickHouseDataSource = new ClickHouseDataSource(clickhouseProperties.address, properties); +//// return clickHouseDataSource; +// return new ClickHouseDataSource(ckProperties.address, properties); +// } +// +//// public static List> exeSql(String sql) { +//// System.out.println("cliockhouse 执行sql:" + sql); +//// Connection connection = null; +//// try { +//// connection = clickHouseDataSource.getConnection(); +//// assert connection != null; +//// Statement statement = connection.createStatement(); +//// ResultSet results = statement.executeQuery(sql); +//// ResultSetMetaData rsmd = results.getMetaData(); +//// List> list = new ArrayList<>(); +//// while (results.next()) { +//// Map row = new HashMap<>(); +//// for (int i = 1; i <= rsmd.getColumnCount(); i++) { +//// row.put(rsmd.getColumnName(i), results.getString(rsmd.getColumnName(i))); +//// } +//// list.add(row); +//// } +//// return list; +//// } catch (SQLException e) { +//// e.printStackTrace(); +//// } +//// return null; +//// } +//} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/enums/SqlMethodDiv.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/enums/SqlMethodDiv.java new file mode 100644 index 000000000..645448de2 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/enums/SqlMethodDiv.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.framework.clickhouse.injector.enums; + +public enum SqlMethodDiv { + + /** + * 删除 + */ + DELETE_BY_ID("deleteByIdClickHouse", "根据ID 删除一条数据", ""), + + /** + * 逻辑删除 + */ + LOGIC_DELETE_BY_ID("deleteByIdClickHouse", "根据ID 逻辑删除一条数据", ""), + + /** + * 修改 条件主键 + */ + UPDATE_BY_ID("updateByIdClickHouse", "根据ID 选择修改数据", ""), + /** + * 修改 条件主键 + */ + UPDATE("updateClickHouse", "根据 whereEntity 条件,更新记录", ""); + + private final String method; + private final String desc; + private final String sql; + + SqlMethodDiv(String method, String desc, String sql) { + this.method = method; + this.desc = desc; + this.sql = sql; + } + + public String getMethod() { + return method; + } + + public String getDesc() { + return desc; + } + + public String getSql() { + return sql; + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/DeleteClickHouse.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/DeleteClickHouse.java new file mode 100644 index 000000000..ebb2d4628 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/DeleteClickHouse.java @@ -0,0 +1,77 @@ +package cn.iocoder.yudao.framework.clickhouse.injector.methods; + +import cn.iocoder.yudao.framework.clickhouse.injector.enums.SqlMethodDiv; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + + +/** + * @author coder + * @date 2023-08-27 + * @desc 通过MybatisPlus源码 扩展修改 + */ +public class DeleteClickHouse extends AbstractMethod { + + public DeleteClickHouse(String methodName) { + super(methodName); + } + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + String sql; + SqlMethodDiv sqlMethod = SqlMethodDiv.LOGIC_DELETE_BY_ID; + if (tableInfo.isWithLogicDelete()) { + sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlLogicSet(tableInfo), + tableInfo.getKeyColumn(), tableInfo.getKeyProperty(), + tableInfo.getLogicDeleteSql(true, true)); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class); + return addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); + } else { + sqlMethod = SqlMethodDiv.DELETE_BY_ID; + sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), tableInfo.getKeyColumn(), + tableInfo.getKeyProperty()); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class); + return this.addDeleteMappedStatement(mapperClass, sqlMethod.getMethod(), sqlSource); + } + } + + + /** + * SQL 更新 set 语句 + * + * @param logic 是否逻辑删除注入器 + * @param ew 是否存在 UpdateWrapper 条件 + * @param table 表信息 + * @param alias 别名 + * @param prefix 前缀 + * @return sql + */ + @Override + protected String sqlSet(boolean logic, boolean ew, TableInfo table, boolean judgeAliasNull, final String alias, + final String prefix) { + String sqlScript = table.getAllSqlSet(logic, prefix); + if (judgeAliasNull) { + sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", alias), true); + } + if (ew) { + sqlScript += NEWLINE; + sqlScript += SqlScriptUtils.convertIf(SqlScriptUtils.unSafeParam(U_WRAPPER_SQL_SET), + String.format("%s != null and %s != null", WRAPPER, U_WRAPPER_SQL_SET), false); + } + sqlScript = convertSet(sqlScript); + return sqlScript; + } + + /** + * 去掉sest 和 suffixOverrides=","代表去掉第一个逗号 + * + * @param sqlScript + * @return + */ + public static String convertSet(final String sqlScript) { + return " " + sqlScript + "\n" + ""; + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateByIdClickHouse.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateByIdClickHouse.java new file mode 100644 index 000000000..8d8ca8a6e --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateByIdClickHouse.java @@ -0,0 +1,71 @@ +package cn.iocoder.yudao.framework.clickhouse.injector.methods; + +import cn.iocoder.yudao.framework.clickhouse.injector.enums.SqlMethodDiv; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; +import org.apache.ibatis.executor.keygen.NoKeyGenerator; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + +/** + * @author coder + * @date 2023-08-27 + * @desc 通过MybatisPlus源码 扩展修改 + */ +public class UpdateByIdClickHouse extends AbstractMethod { + + public UpdateByIdClickHouse(String methodName) { + super(methodName); + } + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + SqlMethodDiv sqlMethod = SqlMethodDiv.UPDATE_BY_ID; + + final String additional = optlockVersion(tableInfo) + tableInfo.getLogicDeleteSql(true, true); + String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), + this.sqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, ENTITY, ENTITY_DOT), + tableInfo.getKeyColumn(), ENTITY_DOT + tableInfo.getKeyProperty(), additional); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + return this.addInsertMappedStatement(mapperClass, modelClass, + sqlMethod.getMethod(), sqlSource, new NoKeyGenerator(), null, null); + } + + + /** + * SQL 更新 set 语句 + * + * @param logic 是否逻辑删除注入器 + * @param ew 是否存在 UpdateWrapper 条件 + * @param table 表信息 + * @param alias 别名 + * @param prefix 前缀 + * @return sql + */ + @Override + protected String sqlSet(boolean logic, boolean ew, TableInfo table, boolean judgeAliasNull, final String alias, + final String prefix) { + String sqlScript = table.getAllSqlSet(logic, prefix); + if (judgeAliasNull) { + sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", alias), true); + } + if (ew) { + sqlScript += NEWLINE; + sqlScript += SqlScriptUtils.convertIf(SqlScriptUtils.unSafeParam(U_WRAPPER_SQL_SET), + String.format("%s != null and %s != null", WRAPPER, U_WRAPPER_SQL_SET), false); + } + sqlScript = convertSet(sqlScript); + return sqlScript; + } + + /** + * 去掉sest 和 suffixOverrides=","代表去掉第一个逗号 + * + * @param sqlScript + * @return + */ + public static String convertSet(final String sqlScript) { + return " " + sqlScript + "\n" + ""; + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateClickHouse.java b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateClickHouse.java new file mode 100644 index 000000000..db72584f0 --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/java/cn/iocoder/yudao/framework/clickhouse/injector/methods/UpdateClickHouse.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.framework.clickhouse.injector.methods; + +import cn.iocoder.yudao.framework.clickhouse.injector.enums.SqlMethodDiv; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.metadata.TableInfo; +import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils; +import org.apache.ibatis.mapping.MappedStatement; +import org.apache.ibatis.mapping.SqlSource; + + +/** + * @author coder + * @date 2023-08-27 + * @desc 通过MybatisPlus源码 扩展修改 + */ +public class UpdateClickHouse extends AbstractMethod { + + public UpdateClickHouse(String methodName) { + super(methodName); + } + + @Override + public MappedStatement injectMappedStatement(Class mapperClass, Class modelClass, TableInfo tableInfo) { + SqlMethodDiv sqlMethod = SqlMethodDiv.UPDATE; + String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), + sqlSet(true, true, tableInfo, true, ENTITY, ENTITY_DOT), + sqlWhereEntityWrapper(true, tableInfo), sqlComment()); + SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource); + } + + + /** + * SQL 更新 set 语句 + * + * @param logic 是否逻辑删除注入器 + * @param ew 是否存在 UpdateWrapper 条件 + * @param table 表信息 + * @param alias 别名 + * @param prefix 前缀 + * @return sql + */ + @Override + protected String sqlSet(boolean logic, boolean ew, TableInfo table, boolean judgeAliasNull, final String alias, + final String prefix) { + String sqlScript = table.getAllSqlSet(logic, prefix); + if (judgeAliasNull) { + sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", alias), true); + } + if (ew) { + sqlScript += NEWLINE; + sqlScript += SqlScriptUtils.convertIf(SqlScriptUtils.unSafeParam(U_WRAPPER_SQL_SET), + String.format("%s != null and %s != null", WRAPPER, U_WRAPPER_SQL_SET), false); + } + sqlScript = convertSet(sqlScript); + return sqlScript; + } + + /** + * 去掉sest 和 suffixOverrides=","代表去掉第一个逗号 + * + * @param sqlScript + * @return + */ + public static String convertSet(final String sqlScript) { + return " " + sqlScript + "\n" + ""; + } +} diff --git a/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 000000000..ec0eac9ac --- /dev/null +++ b/yudao-framework/yudao-spring-boot-starter-clickhouse/src/main/resources/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +## com.w3.framework.clickhouse.config.ClickHouseConfig \ No newline at end of file