mirror of
https://gitee.com/mybatis-flex/mybatis-flex.git
synced 2025-12-08 01:28:24 +08:00
commit
1c67e8656d
@ -53,20 +53,14 @@ public abstract class JdbcDialect implements IDialect {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Map<String, String> buildColumnRemarks(Table table, DatabaseMetaData dbMeta, Connection conn) throws SQLException {
|
private Map<String, String> buildColumnRemarks(Table table, DatabaseMetaData dbMeta, Connection conn) {
|
||||||
Map<String, String> columnRemarks = new HashMap<>();
|
Map<String, String> columnRemarks = new HashMap<>();
|
||||||
ResultSet colRs = null;
|
try (ResultSet colRs = dbMeta.getColumns(conn.getCatalog(), null, table.getName(), null)) {
|
||||||
try {
|
|
||||||
colRs = dbMeta.getColumns(conn.getCatalog(), null, table.getName(), null);
|
|
||||||
while (colRs.next()) {
|
while (colRs.next()) {
|
||||||
columnRemarks.put(colRs.getString("COLUMN_NAME"), colRs.getString("REMARKS"));
|
columnRemarks.put(colRs.getString("COLUMN_NAME"), colRs.getString("REMARKS"));
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
System.err.println("无法获取字段的备注内容:" + e.getMessage());
|
System.err.println("无法获取字段的备注内容:" + e.getMessage());
|
||||||
} finally {
|
|
||||||
if (colRs != null) {
|
|
||||||
colRs.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return columnRemarks;
|
return columnRemarks;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class JdbcTypeMapping {
|
public class JdbcTypeMapping {
|
||||||
|
|
||||||
private static Map<String, String> mapping = new HashMap<>();
|
private static final Map<String, String> mapping = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
registerMapping("[B", "byte[]");
|
registerMapping("[B", "byte[]");
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import java.util.*;
|
|||||||
|
|
||||||
public class GeneratorFactory {
|
public class GeneratorFactory {
|
||||||
|
|
||||||
private static Map<String, IGenerator> generators = new HashMap<>();
|
private static final Map<String, IGenerator> generators = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
registerGenerator("entity", new EntityGenerator());
|
registerGenerator("entity", new EntityGenerator());
|
||||||
|
|||||||
@ -24,7 +24,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class EnjoyTemplate implements ITemplate {
|
public class EnjoyTemplate implements ITemplate {
|
||||||
|
|
||||||
private Engine engine;
|
private final Engine engine;
|
||||||
|
|
||||||
public EnjoyTemplate() {
|
public EnjoyTemplate() {
|
||||||
engine = Engine.create("mybatis-flex", engine -> {
|
engine = Engine.create("mybatis-flex", engine -> {
|
||||||
|
|||||||
@ -25,8 +25,8 @@ import java.util.Enumeration;
|
|||||||
*/
|
*/
|
||||||
public class DefaultMessageFactory implements MessageFactory {
|
public class DefaultMessageFactory implements MessageFactory {
|
||||||
|
|
||||||
private String platform = "mybatis-flex";
|
private final String platform = "mybatis-flex";
|
||||||
private String hostIp = getHostIp();
|
private final String hostIp = getHostIp();
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -28,12 +28,12 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
|
|||||||
*/
|
*/
|
||||||
public class ScheduledMessageCollector implements MessageCollector, Runnable {
|
public class ScheduledMessageCollector implements MessageCollector, Runnable {
|
||||||
|
|
||||||
private long period;
|
private final long period;
|
||||||
private ScheduledExecutorService scheduler;
|
private final ScheduledExecutorService scheduler;
|
||||||
private MessageReporter messageSender;
|
private final MessageReporter messageSender;
|
||||||
|
|
||||||
private List<AuditMessage> messages = Collections.synchronizedList(new ArrayList<>());
|
private final List<AuditMessage> messages = Collections.synchronizedList(new ArrayList<>());
|
||||||
private ReentrantReadWriteLock rrwLock = new ReentrantReadWriteLock();
|
private final ReentrantReadWriteLock rrwLock = new ReentrantReadWriteLock();
|
||||||
|
|
||||||
public ScheduledMessageCollector() {
|
public ScheduledMessageCollector() {
|
||||||
this(10, new ConsoleMessageReporter());
|
this(10, new ConsoleMessageReporter());
|
||||||
|
|||||||
@ -22,9 +22,9 @@ import java.util.List;
|
|||||||
|
|
||||||
public class HttpMessageReporter implements MessageReporter {
|
public class HttpMessageReporter implements MessageReporter {
|
||||||
|
|
||||||
private String endpoint;
|
private final String endpoint;
|
||||||
private String secretKey;
|
private final String secretKey;
|
||||||
private JSONFormatter jsonFormatter;
|
private final JSONFormatter jsonFormatter;
|
||||||
|
|
||||||
public HttpMessageReporter(String endpoint, String secretKey, JSONFormatter jsonFormatter) {
|
public HttpMessageReporter(String endpoint, String secretKey, JSONFormatter jsonFormatter) {
|
||||||
this.endpoint = endpoint;
|
this.endpoint = endpoint;
|
||||||
|
|||||||
@ -27,7 +27,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
public class DataSourceBuilder {
|
public class DataSourceBuilder {
|
||||||
|
|
||||||
private static Map<String, String> dataSourceAlias = new HashMap<>();
|
private static final Map<String, String> dataSourceAlias = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
dataSourceAlias.put("druid", "com.alibaba.druid.pool.DruidDataSource");
|
dataSourceAlias.put("druid", "com.alibaba.druid.pool.DruidDataSource");
|
||||||
@ -39,7 +39,7 @@ public class DataSourceBuilder {
|
|||||||
dataSourceAlias.put("dbcp2", "org.apache.commons.dbcp2.BasicDataSource");
|
dataSourceAlias.put("dbcp2", "org.apache.commons.dbcp2.BasicDataSource");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, String> dataSourceProperties;
|
private final Map<String, String> dataSourceProperties;
|
||||||
|
|
||||||
public DataSourceBuilder(Map<String, String> dataSourceProperties) {
|
public DataSourceBuilder(Map<String, String> dataSourceProperties) {
|
||||||
this.dataSourceProperties = dataSourceProperties;
|
this.dataSourceProperties = dataSourceProperties;
|
||||||
@ -49,11 +49,7 @@ public class DataSourceBuilder {
|
|||||||
String dataSourceClassName = null;
|
String dataSourceClassName = null;
|
||||||
String type = dataSourceProperties.get("type");
|
String type = dataSourceProperties.get("type");
|
||||||
if (StringUtil.isNotBlank(type)) {
|
if (StringUtil.isNotBlank(type)) {
|
||||||
if (dataSourceAlias.containsKey(type)) {
|
dataSourceClassName = dataSourceAlias.getOrDefault(type, type);
|
||||||
dataSourceClassName = dataSourceAlias.get(type);
|
|
||||||
} else {
|
|
||||||
dataSourceClassName = type;
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
dataSourceClassName = detectDataSourceClass();
|
dataSourceClassName = detectDataSourceClass();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
public class DataSourceKey {
|
public class DataSourceKey {
|
||||||
|
|
||||||
private static ThreadLocal<String> keyThreadLocal = new ThreadLocal<>();
|
private static final ThreadLocal<String> keyThreadLocal = new ThreadLocal<>();
|
||||||
|
|
||||||
public static void use(String dataSourceKey) {
|
public static void use(String dataSourceKey) {
|
||||||
keyThreadLocal.set(dataSourceKey);
|
keyThreadLocal.set(dataSourceKey);
|
||||||
|
|||||||
@ -35,12 +35,12 @@ public class DialectFactory {
|
|||||||
* 比如,在 mybatis-flex 实现的方言中有 bug 或者 有自己的独立实现,可以添加自己的方言实现到
|
* 比如,在 mybatis-flex 实现的方言中有 bug 或者 有自己的独立实现,可以添加自己的方言实现到
|
||||||
* 此 map 中,用于覆盖系统的方言实现
|
* 此 map 中,用于覆盖系统的方言实现
|
||||||
*/
|
*/
|
||||||
private static Map<DbType, IDialect> dialectMap = new EnumMap<>(DbType.class);
|
private static final Map<DbType, IDialect> dialectMap = new EnumMap<>(DbType.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过设置当前线程的数据库类型,以达到在代码执行时随时切换方言的功能
|
* 通过设置当前线程的数据库类型,以达到在代码执行时随时切换方言的功能
|
||||||
*/
|
*/
|
||||||
private static ThreadLocal<DbType> dbTypeThreadLocal = new ThreadLocal<>();
|
private static final ThreadLocal<DbType> dbTypeThreadLocal = new ThreadLocal<>();
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -104,12 +104,12 @@ public class DialectFactory {
|
|||||||
case CUBRID:
|
case CUBRID:
|
||||||
case GOLDILOCKS:
|
case GOLDILOCKS:
|
||||||
case CSIIDB:
|
case CSIIDB:
|
||||||
return new CommonsDialectImpl(KeywordWrap.BACKQUOTE, LimitOffsetProcesser.MYSQL);
|
return new CommonsDialectImpl(KeywordWrap.BACKQUOTE, LimitOffsetProcessor.MYSQL);
|
||||||
case ORACLE:
|
case ORACLE:
|
||||||
return new OracleDialect(LimitOffsetProcesser.ORACLE);
|
return new OracleDialect(LimitOffsetProcessor.ORACLE);
|
||||||
case DM:
|
case DM:
|
||||||
case GAUSS:
|
case GAUSS:
|
||||||
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.ORACLE);
|
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.ORACLE);
|
||||||
case POSTGRE_SQL:
|
case POSTGRE_SQL:
|
||||||
case SQLITE:
|
case SQLITE:
|
||||||
case HSQL:
|
case HSQL:
|
||||||
@ -123,21 +123,21 @@ public class DialectFactory {
|
|||||||
case OPENGAUSS:
|
case OPENGAUSS:
|
||||||
case TDENGINE:
|
case TDENGINE:
|
||||||
case UXDB:
|
case UXDB:
|
||||||
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.POSTGRESQL);
|
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.POSTGRESQL);
|
||||||
case ORACLE_12C:
|
case ORACLE_12C:
|
||||||
return new OracleDialect(LimitOffsetProcesser.DERBY);
|
return new OracleDialect(LimitOffsetProcessor.DERBY);
|
||||||
case FIREBIRD:
|
case FIREBIRD:
|
||||||
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.DERBY);
|
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.DERBY);
|
||||||
case SQLSERVER:
|
case SQLSERVER:
|
||||||
return new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcesser.DERBY);
|
return new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcessor.DERBY);
|
||||||
case SQLSERVER_2005:
|
case SQLSERVER_2005:
|
||||||
return new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcesser.DB2);
|
return new CommonsDialectImpl(KeywordWrap.SQUARE_BRACKETS, LimitOffsetProcessor.DB2);
|
||||||
case INFORMIX:
|
case INFORMIX:
|
||||||
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.INFORMIX);
|
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.INFORMIX);
|
||||||
case DB2:
|
case DB2:
|
||||||
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.DB2);
|
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.DB2);
|
||||||
case SYBASE:
|
case SYBASE:
|
||||||
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.SYBASE);
|
return new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.SYBASE);
|
||||||
default:
|
default:
|
||||||
return new CommonsDialectImpl();
|
return new CommonsDialectImpl();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,13 +20,13 @@ import com.mybatisflex.core.query.QueryWrapper;
|
|||||||
/**
|
/**
|
||||||
* limit 和 offset 参数的处理器
|
* limit 和 offset 参数的处理器
|
||||||
*/
|
*/
|
||||||
public interface LimitOffsetProcesser {
|
public interface LimitOffsetProcessor {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MySql 的处理器
|
* MySql 的处理器
|
||||||
* 适合 {@link DbType#MYSQL,DbType#MARIADB,DbType#H2,DbType#CLICK_HOUSE,DbType#XCloud}
|
* 适合 {@link DbType#MYSQL,DbType#MARIADB,DbType#H2,DbType#CLICK_HOUSE,DbType#XCloud}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser MYSQL = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor MYSQL = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
sql.append(" LIMIT ").append(limitOffset).append(", ").append(limitRows);
|
sql.append(" LIMIT ").append(limitOffset).append(", ").append(limitRows);
|
||||||
} else if (limitRows != null) {
|
} else if (limitRows != null) {
|
||||||
@ -41,7 +41,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* 适合 {@link DbType#SAP_HANA,DbType#IMPALA,DbType#HIGH_GO,DbType#VERTICA,DbType#REDSHIFT}
|
* 适合 {@link DbType#SAP_HANA,DbType#IMPALA,DbType#HIGH_GO,DbType#VERTICA,DbType#REDSHIFT}
|
||||||
* 适合 {@link DbType#OPENGAUSS,DbType#TDENGINE,DbType#UXDB}
|
* 适合 {@link DbType#OPENGAUSS,DbType#TDENGINE,DbType#UXDB}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser POSTGRESQL = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor POSTGRESQL = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
sql.append(" LIMIT ").append(limitRows).append(" OFFSET ").append(limitOffset);
|
sql.append(" LIMIT ").append(limitRows).append(" OFFSET ").append(limitOffset);
|
||||||
} else if (limitRows != null) {
|
} else if (limitRows != null) {
|
||||||
@ -54,7 +54,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* derby 的处理器
|
* derby 的处理器
|
||||||
* 适合 {@link DbType#DERBY,DbType#ORACLE_12C,DbType#SQLSERVER ,DbType#POSTGRE_SQL}
|
* 适合 {@link DbType#DERBY,DbType#ORACLE_12C,DbType#SQLSERVER ,DbType#POSTGRE_SQL}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser DERBY = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor DERBY = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
// OFFSET ** ROWS FETCH NEXT ** ROWS ONLY")
|
// OFFSET ** ROWS FETCH NEXT ** ROWS ONLY")
|
||||||
sql.append(" OFFSET ").append(limitOffset).append(" ROWS FETCH NEXT ").append(limitRows).append(" ROWS ONLY");
|
sql.append(" OFFSET ").append(limitOffset).append(" ROWS FETCH NEXT ").append(limitRows).append(" ROWS ONLY");
|
||||||
@ -69,7 +69,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* db2 的处理器
|
* db2 的处理器
|
||||||
* 适合 {@link DbType#DB2,DbType#SQLSERVER_2005}
|
* 适合 {@link DbType#DB2,DbType#SQLSERVER_2005}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser DB2 = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor DB2 = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
// OFFSET ** ROWS FETCH NEXT ** ROWS ONLY")
|
// OFFSET ** ROWS FETCH NEXT ** ROWS ONLY")
|
||||||
sql.append(" OFFSET ").append(limitOffset).append(" ROWS FETCH NEXT ").append(limitRows).append(" ROWS ONLY");
|
sql.append(" OFFSET ").append(limitOffset).append(" ROWS FETCH NEXT ").append(limitRows).append(" ROWS ONLY");
|
||||||
@ -85,7 +85,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* 适合 {@link DbType#INFORMIX}
|
* 适合 {@link DbType#INFORMIX}
|
||||||
* 文档 {@link <a href="https://www.ibm.com/docs/en/informix-servers/14.10?topic=clause-restricting-return-values-skip-limit-first-options">https://www.ibm.com/docs/en/informix-servers/14.10?topic=clause-restricting-return-values-skip-limit-first-options</a>}
|
* 文档 {@link <a href="https://www.ibm.com/docs/en/informix-servers/14.10?topic=clause-restricting-return-values-skip-limit-first-options">https://www.ibm.com/docs/en/informix-servers/14.10?topic=clause-restricting-return-values-skip-limit-first-options</a>}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser INFORMIX = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor INFORMIX = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
// SELECT SKIP 2 FIRST 1 * FROM
|
// SELECT SKIP 2 FIRST 1 * FROM
|
||||||
sql.insert(6, " SKIP " + limitOffset + " FIRST " + limitRows);
|
sql.insert(6, " SKIP " + limitOffset + " FIRST " + limitRows);
|
||||||
@ -99,7 +99,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* Firebird 的处理器
|
* Firebird 的处理器
|
||||||
* 适合 {@link DbType#FIREBIRD}
|
* 适合 {@link DbType#FIREBIRD}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser FIREBIRD = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor FIREBIRD = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
// ROWS 2 TO 3
|
// ROWS 2 TO 3
|
||||||
sql.append(" ROWS ").append(limitOffset).append(" TO ").append(limitOffset + limitRows);
|
sql.append(" ROWS ").append(limitOffset).append(" TO ").append(limitOffset + limitRows);
|
||||||
@ -113,7 +113,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* Oracle11g及以下数据库的处理器
|
* Oracle11g及以下数据库的处理器
|
||||||
* 适合 {@link DbType#ORACLE,DbType#DM,DbType#GAUSS}
|
* 适合 {@link DbType#ORACLE,DbType#DM,DbType#GAUSS}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser ORACLE = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor ORACLE = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null) {
|
if (limitRows != null) {
|
||||||
if (limitOffset == null) {
|
if (limitOffset == null) {
|
||||||
limitOffset = 0;
|
limitOffset = 0;
|
||||||
@ -130,7 +130,7 @@ public interface LimitOffsetProcesser {
|
|||||||
* Sybase 处理器
|
* Sybase 处理器
|
||||||
* 适合 {@link DbType#SYBASE}
|
* 适合 {@link DbType#SYBASE}
|
||||||
*/
|
*/
|
||||||
LimitOffsetProcesser SYBASE = (sql, queryWrapper, limitRows, limitOffset) -> {
|
LimitOffsetProcessor SYBASE = (sql, queryWrapper, limitRows, limitOffset) -> {
|
||||||
if (limitRows != null && limitOffset != null) {
|
if (limitRows != null && limitOffset != null) {
|
||||||
//SELECT TOP 1 START AT 3 * FROM
|
//SELECT TOP 1 START AT 3 * FROM
|
||||||
sql.insert(6, " TOP " + limitRows + " START AT " + (limitOffset + 1));
|
sql.insert(6, " TOP " + limitRows + " START AT " + (limitOffset + 1));
|
||||||
@ -18,7 +18,7 @@ package com.mybatisflex.core.dialect.impl;
|
|||||||
import com.mybatisflex.core.FlexGlobalConfig;
|
import com.mybatisflex.core.FlexGlobalConfig;
|
||||||
import com.mybatisflex.core.dialect.IDialect;
|
import com.mybatisflex.core.dialect.IDialect;
|
||||||
import com.mybatisflex.core.dialect.KeywordWrap;
|
import com.mybatisflex.core.dialect.KeywordWrap;
|
||||||
import com.mybatisflex.core.dialect.LimitOffsetProcesser;
|
import com.mybatisflex.core.dialect.LimitOffsetProcessor;
|
||||||
import com.mybatisflex.core.exception.FlexExceptions;
|
import com.mybatisflex.core.exception.FlexExceptions;
|
||||||
import com.mybatisflex.core.query.*;
|
import com.mybatisflex.core.query.*;
|
||||||
import com.mybatisflex.core.row.Row;
|
import com.mybatisflex.core.row.Row;
|
||||||
@ -40,18 +40,18 @@ import java.util.StringJoiner;
|
|||||||
public class CommonsDialectImpl implements IDialect {
|
public class CommonsDialectImpl implements IDialect {
|
||||||
|
|
||||||
protected KeywordWrap keywordWrap = KeywordWrap.BACKQUOTE;
|
protected KeywordWrap keywordWrap = KeywordWrap.BACKQUOTE;
|
||||||
private LimitOffsetProcesser limitOffsetProcesser = LimitOffsetProcesser.MYSQL;
|
private LimitOffsetProcessor limitOffsetProcessor = LimitOffsetProcessor.MYSQL;
|
||||||
|
|
||||||
public CommonsDialectImpl() {
|
public CommonsDialectImpl() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommonsDialectImpl(LimitOffsetProcesser limitOffsetProcesser) {
|
public CommonsDialectImpl(LimitOffsetProcessor limitOffsetProcessor) {
|
||||||
this.limitOffsetProcesser = limitOffsetProcesser;
|
this.limitOffsetProcessor = limitOffsetProcessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CommonsDialectImpl(KeywordWrap keywordWrap, LimitOffsetProcesser limitOffsetProcesser) {
|
public CommonsDialectImpl(KeywordWrap keywordWrap, LimitOffsetProcessor limitOffsetProcessor) {
|
||||||
this.keywordWrap = keywordWrap;
|
this.keywordWrap = keywordWrap;
|
||||||
this.limitOffsetProcesser = limitOffsetProcesser;
|
this.limitOffsetProcessor = limitOffsetProcessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -827,7 +827,7 @@ public class CommonsDialectImpl implements IDialect {
|
|||||||
* 构建 limit 和 offset 的参数
|
* 构建 limit 和 offset 的参数
|
||||||
*/
|
*/
|
||||||
protected StringBuilder buildLimitOffsetSql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, Integer limitRows, Integer limitOffset) {
|
protected StringBuilder buildLimitOffsetSql(StringBuilder sqlBuilder, QueryWrapper queryWrapper, Integer limitRows, Integer limitOffset) {
|
||||||
return limitOffsetProcesser.process(sqlBuilder, queryWrapper, limitRows, limitOffset);
|
return limitOffsetProcessor.process(sqlBuilder, queryWrapper, limitRows, limitOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
package com.mybatisflex.core.dialect.impl;
|
package com.mybatisflex.core.dialect.impl;
|
||||||
|
|
||||||
import com.mybatisflex.core.dialect.KeywordWrap;
|
import com.mybatisflex.core.dialect.KeywordWrap;
|
||||||
import com.mybatisflex.core.dialect.LimitOffsetProcesser;
|
import com.mybatisflex.core.dialect.LimitOffsetProcessor;
|
||||||
import com.mybatisflex.core.util.CollectionUtil;
|
import com.mybatisflex.core.util.CollectionUtil;
|
||||||
import com.mybatisflex.core.util.StringUtil;
|
import com.mybatisflex.core.util.StringUtil;
|
||||||
|
|
||||||
@ -55,8 +55,8 @@ public class OracleDialect extends CommonsDialectImpl {
|
|||||||
"VALIDATE", "VALUES", "VARCHAR", "VARCHAR2"
|
"VALIDATE", "VALUES", "VARCHAR", "VARCHAR2"
|
||||||
);
|
);
|
||||||
|
|
||||||
public OracleDialect(LimitOffsetProcesser limitOffsetProcesser) {
|
public OracleDialect(LimitOffsetProcessor limitOffsetProcessor) {
|
||||||
super(KeywordWrap.NONE, limitOffsetProcesser);
|
super(KeywordWrap.NONE, limitOffsetProcessor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCaseSensitive() {
|
public boolean isCaseSensitive() {
|
||||||
|
|||||||
@ -33,8 +33,8 @@ import java.util.List;
|
|||||||
|
|
||||||
public class FlexEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
|
public class FlexEnumTypeHandler<E extends Enum<E>> extends BaseTypeHandler<E> {
|
||||||
|
|
||||||
private Class<?> enumPropertyType;
|
private final Class<?> enumPropertyType;
|
||||||
private E[] enums;
|
private final E[] enums;
|
||||||
private Field property;
|
private Field property;
|
||||||
private Method getter;
|
private Method getter;
|
||||||
|
|
||||||
|
|||||||
@ -26,7 +26,7 @@ import java.util.Set;
|
|||||||
|
|
||||||
public class ModifyAttrsRecordHandler implements MethodHandler {
|
public class ModifyAttrsRecordHandler implements MethodHandler {
|
||||||
|
|
||||||
private Set<String> modifyAttrs = new LinkedHashSet<>();
|
private final Set<String> modifyAttrs = new LinkedHashSet<>();
|
||||||
|
|
||||||
public Set<String> getModifyAttrs() {
|
public Set<String> getModifyAttrs() {
|
||||||
return modifyAttrs;
|
return modifyAttrs;
|
||||||
|
|||||||
@ -24,7 +24,7 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
public class ModifyAttrsRecordProxyFactory {
|
public class ModifyAttrsRecordProxyFactory {
|
||||||
|
|
||||||
private static ModifyAttrsRecordProxyFactory instance = new ModifyAttrsRecordProxyFactory();
|
private static final ModifyAttrsRecordProxyFactory instance = new ModifyAttrsRecordProxyFactory();
|
||||||
|
|
||||||
public static ModifyAttrsRecordProxyFactory getInstance(){
|
public static ModifyAttrsRecordProxyFactory getInstance(){
|
||||||
return instance;
|
return instance;
|
||||||
|
|||||||
@ -30,7 +30,7 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class MultiEntityKeyGenerator implements KeyGenerator {
|
public class MultiEntityKeyGenerator implements KeyGenerator {
|
||||||
|
|
||||||
private KeyGenerator keyGenerator;
|
private final KeyGenerator keyGenerator;
|
||||||
|
|
||||||
public MultiEntityKeyGenerator(KeyGenerator keyGenerator) {
|
public MultiEntityKeyGenerator(KeyGenerator keyGenerator) {
|
||||||
this.keyGenerator = keyGenerator;
|
this.keyGenerator = keyGenerator;
|
||||||
|
|||||||
@ -31,10 +31,10 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class MultiPrimaryKeyGenerator implements KeyGenerator, IMultiKeyGenerator {
|
public class MultiPrimaryKeyGenerator implements KeyGenerator, IMultiKeyGenerator {
|
||||||
|
|
||||||
private List<KeyGenerator> keyGenerators;
|
private final List<KeyGenerator> keyGenerators;
|
||||||
|
|
||||||
//所有自增字段的名称
|
//所有自增字段的名称
|
||||||
private String[] autoGenKeyColumnNames;
|
private final String[] autoGenKeyColumnNames;
|
||||||
|
|
||||||
public MultiPrimaryKeyGenerator(MappedStatement mappedStatement, TableInfo tableInfo, List<IdInfo> primaryKeyList) {
|
public MultiPrimaryKeyGenerator(MappedStatement mappedStatement, TableInfo tableInfo, List<IdInfo> primaryKeyList) {
|
||||||
this.keyGenerators = new ArrayList<>();
|
this.keyGenerators = new ArrayList<>();
|
||||||
|
|||||||
@ -31,7 +31,7 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class MultiRowKeyGenerator implements KeyGenerator {
|
public class MultiRowKeyGenerator implements KeyGenerator {
|
||||||
|
|
||||||
private KeyGenerator keyGenerator;
|
private final KeyGenerator keyGenerator;
|
||||||
|
|
||||||
public MultiRowKeyGenerator(KeyGenerator keyGenerator) {
|
public MultiRowKeyGenerator(KeyGenerator keyGenerator) {
|
||||||
this.keyGenerator = keyGenerator;
|
this.keyGenerator = keyGenerator;
|
||||||
|
|||||||
@ -43,7 +43,7 @@ import java.util.Map.Entry;
|
|||||||
*/
|
*/
|
||||||
public class RowJdbc3KeyGenerator implements KeyGenerator {
|
public class RowJdbc3KeyGenerator implements KeyGenerator {
|
||||||
|
|
||||||
private String keyProperty;
|
private final String keyProperty;
|
||||||
|
|
||||||
|
|
||||||
private static final String SECOND_GENERIC_PARAM_NAME = ParamNameResolver.GENERIC_NAME_PREFIX + "2";
|
private static final String SECOND_GENERIC_PARAM_NAME = ParamNameResolver.GENERIC_NAME_PREFIX + "2";
|
||||||
|
|||||||
@ -40,9 +40,9 @@ import java.util.Map;
|
|||||||
* 为 row 的主键生成器
|
* 为 row 的主键生成器
|
||||||
*/
|
*/
|
||||||
public class RowKeyGenerator implements KeyGenerator, IMultiKeyGenerator {
|
public class RowKeyGenerator implements KeyGenerator, IMultiKeyGenerator {
|
||||||
private static KeyGenerator[] NO_KEY_GENERATORS = new KeyGenerator[0];
|
private static final KeyGenerator[] NO_KEY_GENERATORS = new KeyGenerator[0];
|
||||||
|
|
||||||
private MappedStatement ms;
|
private final MappedStatement ms;
|
||||||
private KeyGenerator[] keyGenerators;
|
private KeyGenerator[] keyGenerators;
|
||||||
private List<String> autoKeyGeneratorNames;
|
private List<String> autoKeyGeneratorNames;
|
||||||
|
|
||||||
|
|||||||
@ -26,21 +26,23 @@ public class MaskManager {
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 脱敏处理器,type : processer
|
* 脱敏处理器,type : processor
|
||||||
*/
|
*/
|
||||||
private static Map<String, MaskProcesser> processerMap = new HashMap<>();
|
private static final Map<String, MaskProcessor> processorMap = new HashMap<>();
|
||||||
|
|
||||||
|
private static final ThreadLocal<Boolean> skipFlags = new ThreadLocal<>();
|
||||||
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
registerMaskProcesser(Masks.MOBILE, Masks.MOBILE_PROCESSER);
|
registerMaskProcessor(Masks.MOBILE, Masks.MOBILE_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.FIXED_PHONE, Masks.FIXED_PHONE_PROCESSER);
|
registerMaskProcessor(Masks.FIXED_PHONE, Masks.FIXED_PHONE_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.ID_CARD_NUMBER, Masks.ID_CARD_NUMBER_PROCESSER);
|
registerMaskProcessor(Masks.ID_CARD_NUMBER, Masks.ID_CARD_NUMBER_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.CHINESE_NAME, Masks.CHINESE_NAME_PROCESSER);
|
registerMaskProcessor(Masks.CHINESE_NAME, Masks.CHINESE_NAME_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.ADDRESS, Masks.ADDRESS_PROCESSER);
|
registerMaskProcessor(Masks.ADDRESS, Masks.ADDRESS_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.EMAIL, Masks.EMAIL_PROCESSER);
|
registerMaskProcessor(Masks.EMAIL, Masks.EMAIL_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.PASSWORD, Masks.PASSWORD_PROCESSER);
|
registerMaskProcessor(Masks.PASSWORD, Masks.PASSWORD_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.CAR_LICENSE, Masks.CAR_LICENSE_PROCESSER);
|
registerMaskProcessor(Masks.CAR_LICENSE, Masks.CAR_LICENSE_PROCESSOR);
|
||||||
registerMaskProcesser(Masks.BANK_CARD_NUMBER, Masks.BANK_CARD_PROCESSER);
|
registerMaskProcessor(Masks.BANK_CARD_NUMBER, Masks.BANK_CARD_PROCESSOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -48,15 +50,13 @@ public class MaskManager {
|
|||||||
* 注册处理器,用户可以注册新的脱敏处理器 或者 覆盖内置的处理器
|
* 注册处理器,用户可以注册新的脱敏处理器 或者 覆盖内置的处理器
|
||||||
*
|
*
|
||||||
* @param type 处理器类型
|
* @param type 处理器类型
|
||||||
* @param processer 脱敏处理器
|
* @param processor 脱敏处理器
|
||||||
*/
|
*/
|
||||||
public static void registerMaskProcesser(String type, MaskProcesser processer) {
|
public static void registerMaskProcessor(String type, MaskProcessor processor) {
|
||||||
processerMap.put(type, processer);
|
processorMap.put(type, processor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static ThreadLocal<Boolean> skipFlags = new ThreadLocal<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 跳过脱敏处理
|
* 跳过脱敏处理
|
||||||
*/
|
*/
|
||||||
@ -91,12 +91,12 @@ public class MaskManager {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
MaskProcesser maskProcesser = processerMap.get(type);
|
MaskProcessor maskProcessor = processorMap.get(type);
|
||||||
if (maskProcesser == null) {
|
if (maskProcessor == null) {
|
||||||
throw new IllegalStateException("Can not get mask processer for by type: " + type);
|
throw new IllegalStateException("Can not get mask processor for by type: " + type);
|
||||||
}
|
}
|
||||||
|
|
||||||
return maskProcesser.mask(data);
|
return maskProcessor.mask(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,7 @@ package com.mybatisflex.core.mask;
|
|||||||
/**
|
/**
|
||||||
* 数据脱敏处理器
|
* 数据脱敏处理器
|
||||||
*/
|
*/
|
||||||
public interface MaskProcesser {
|
public interface MaskProcessor {
|
||||||
|
|
||||||
Object mask(Object data);
|
Object mask(Object data);
|
||||||
}
|
}
|
||||||
@ -25,7 +25,7 @@ import java.sql.SQLException;
|
|||||||
|
|
||||||
public class MaskTypeHandler extends BaseTypeHandler<Object> {
|
public class MaskTypeHandler extends BaseTypeHandler<Object> {
|
||||||
|
|
||||||
private String maskType;
|
private final String maskType;
|
||||||
|
|
||||||
public MaskTypeHandler(String maskType) {
|
public MaskTypeHandler(String maskType) {
|
||||||
this.maskType = maskType;
|
this.maskType = maskType;
|
||||||
|
|||||||
@ -86,7 +86,7 @@ public class Masks {
|
|||||||
* 手机号脱敏处理器
|
* 手机号脱敏处理器
|
||||||
* 保留前三后四,中间的为星号 "*"
|
* 保留前三后四,中间的为星号 "*"
|
||||||
*/
|
*/
|
||||||
static MaskProcesser MOBILE_PROCESSER = data -> {
|
static MaskProcessor MOBILE_PROCESSOR = data -> {
|
||||||
if (data instanceof String && ((String) data).startsWith("1") && ((String) data).length() == 11) {
|
if (data instanceof String && ((String) data).startsWith("1") && ((String) data).length() == 11) {
|
||||||
return mask((String) data, 3, 4, 4);
|
return mask((String) data, 3, 4, 4);
|
||||||
}
|
}
|
||||||
@ -98,7 +98,7 @@ public class Masks {
|
|||||||
* 固定电话脱敏
|
* 固定电话脱敏
|
||||||
* 保留前三后四,中间的为星号 "*"
|
* 保留前三后四,中间的为星号 "*"
|
||||||
*/
|
*/
|
||||||
static MaskProcesser FIXED_PHONE_PROCESSER = data -> {
|
static MaskProcessor FIXED_PHONE_PROCESSOR = data -> {
|
||||||
if (data instanceof String && ((String) data).length() > 5) {
|
if (data instanceof String && ((String) data).length() > 5) {
|
||||||
return mask((String) data, 3, 2, ((String) data).length() - 5);
|
return mask((String) data, 3, 2, ((String) data).length() - 5);
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ public class Masks {
|
|||||||
* 身份证号脱敏处理器
|
* 身份证号脱敏处理器
|
||||||
* 身份证号的保留前三后四,中间的数为星号 "*"
|
* 身份证号的保留前三后四,中间的数为星号 "*"
|
||||||
*/
|
*/
|
||||||
static MaskProcesser ID_CARD_NUMBER_PROCESSER = data -> {
|
static MaskProcessor ID_CARD_NUMBER_PROCESSOR = data -> {
|
||||||
if (data instanceof String && ((String) data).length() >= 15) {
|
if (data instanceof String && ((String) data).length() >= 15) {
|
||||||
return mask((String) data, 3, 4, ((String) data).length() - 7);
|
return mask((String) data, 3, 4, ((String) data).length() - 7);
|
||||||
}
|
}
|
||||||
@ -121,7 +121,7 @@ public class Masks {
|
|||||||
/**
|
/**
|
||||||
* 姓名脱敏
|
* 姓名脱敏
|
||||||
*/
|
*/
|
||||||
static MaskProcesser CHINESE_NAME_PROCESSER = data -> {
|
static MaskProcessor CHINESE_NAME_PROCESSOR = data -> {
|
||||||
if (data instanceof String) {
|
if (data instanceof String) {
|
||||||
String name = (String) data;
|
String name = (String) data;
|
||||||
if (name.length() == 2) {
|
if (name.length() == 2) {
|
||||||
@ -141,7 +141,7 @@ public class Masks {
|
|||||||
/**
|
/**
|
||||||
* 地址脱敏
|
* 地址脱敏
|
||||||
*/
|
*/
|
||||||
static MaskProcesser ADDRESS_PROCESSER = data -> {
|
static MaskProcessor ADDRESS_PROCESSOR = data -> {
|
||||||
if (data instanceof String) {
|
if (data instanceof String) {
|
||||||
String address = (String) data;
|
String address = (String) data;
|
||||||
if (address.length() > 6) {
|
if (address.length() > 6) {
|
||||||
@ -157,7 +157,7 @@ public class Masks {
|
|||||||
/**
|
/**
|
||||||
* email 脱敏
|
* email 脱敏
|
||||||
*/
|
*/
|
||||||
static MaskProcesser EMAIL_PROCESSER = data -> {
|
static MaskProcessor EMAIL_PROCESSOR = data -> {
|
||||||
if (data instanceof String && ((String) data).contains("@")) {
|
if (data instanceof String && ((String) data).contains("@")) {
|
||||||
String fullEmail = (String) data;
|
String fullEmail = (String) data;
|
||||||
int indexOf = fullEmail.lastIndexOf("@");
|
int indexOf = fullEmail.lastIndexOf("@");
|
||||||
@ -180,7 +180,7 @@ public class Masks {
|
|||||||
/**
|
/**
|
||||||
* 密码 脱敏
|
* 密码 脱敏
|
||||||
*/
|
*/
|
||||||
static MaskProcesser PASSWORD_PROCESSER = data -> {
|
static MaskProcessor PASSWORD_PROCESSOR = data -> {
|
||||||
if (data instanceof String ) {
|
if (data instanceof String ) {
|
||||||
return mask((String) data, 0, 0, ((String) data).length()) ;
|
return mask((String) data, 0, 0, ((String) data).length()) ;
|
||||||
}
|
}
|
||||||
@ -191,7 +191,7 @@ public class Masks {
|
|||||||
/**
|
/**
|
||||||
* 车牌号 脱敏
|
* 车牌号 脱敏
|
||||||
*/
|
*/
|
||||||
static MaskProcesser CAR_LICENSE_PROCESSER = data -> {
|
static MaskProcessor CAR_LICENSE_PROCESSOR = data -> {
|
||||||
if (data instanceof String) {
|
if (data instanceof String) {
|
||||||
return mask((String) data, 3, 1, ((String) data).length() - 4);
|
return mask((String) data, 3, 1, ((String) data).length() - 4);
|
||||||
}
|
}
|
||||||
@ -202,7 +202,7 @@ public class Masks {
|
|||||||
/**
|
/**
|
||||||
* 银行卡号 脱敏
|
* 银行卡号 脱敏
|
||||||
*/
|
*/
|
||||||
static MaskProcesser BANK_CARD_PROCESSER = data -> {
|
static MaskProcessor BANK_CARD_PROCESSOR = data -> {
|
||||||
if (data instanceof String && ((String) data).length() >= 8) {
|
if (data instanceof String && ((String) data).length() >= 8) {
|
||||||
return mask((String) data, 4, 4, 4);
|
return mask((String) data, 4, 4, 4);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,7 +25,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class Brackets extends QueryCondition {
|
public class Brackets extends QueryCondition {
|
||||||
|
|
||||||
private QueryCondition childCondition;
|
private final QueryCondition childCondition;
|
||||||
|
|
||||||
|
|
||||||
public Brackets(QueryCondition childCondition) {
|
public Brackets(QueryCondition childCondition) {
|
||||||
|
|||||||
@ -23,7 +23,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class DistinctQueryColumn extends QueryColumn {
|
public class DistinctQueryColumn extends QueryColumn {
|
||||||
|
|
||||||
private List<QueryColumn> queryColumns;
|
private final List<QueryColumn> queryColumns;
|
||||||
|
|
||||||
public DistinctQueryColumn(QueryColumn... queryColumns) {
|
public DistinctQueryColumn(QueryColumn... queryColumns) {
|
||||||
this.queryColumns = CollectionUtil.newArrayList(queryColumns);
|
this.queryColumns = CollectionUtil.newArrayList(queryColumns);
|
||||||
|
|||||||
@ -37,8 +37,8 @@ public class Join implements Serializable {
|
|||||||
static final String TYPE_CROSS = " CROSS JOIN ";
|
static final String TYPE_CROSS = " CROSS JOIN ";
|
||||||
|
|
||||||
|
|
||||||
private String type;
|
private final String type;
|
||||||
private QueryTable queryTable;
|
private final QueryTable queryTable;
|
||||||
private QueryCondition on;
|
private QueryCondition on;
|
||||||
private boolean effective;
|
private boolean effective;
|
||||||
|
|
||||||
|
|||||||
@ -21,8 +21,8 @@ package com.mybatisflex.core.query;
|
|||||||
*/
|
*/
|
||||||
public class Joiner<M> {
|
public class Joiner<M> {
|
||||||
|
|
||||||
private M queryWrapper;
|
private final M queryWrapper;
|
||||||
private Join join;
|
private final Join join;
|
||||||
|
|
||||||
public Joiner(M queryWrapper, Join join) {
|
public Joiner(M queryWrapper, Join join) {
|
||||||
this.queryWrapper = queryWrapper;
|
this.queryWrapper = queryWrapper;
|
||||||
|
|||||||
@ -26,8 +26,8 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class OperatorQueryCondition extends QueryCondition {
|
public class OperatorQueryCondition extends QueryCondition {
|
||||||
|
|
||||||
private String operator;
|
private final String operator;
|
||||||
private QueryCondition child;
|
private final QueryCondition child;
|
||||||
|
|
||||||
public OperatorQueryCondition(String operator, QueryCondition child) {
|
public OperatorQueryCondition(String operator, QueryCondition child) {
|
||||||
this.operator = operator;
|
this.operator = operator;
|
||||||
|
|||||||
@ -27,8 +27,8 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class OperatorSelectCondition extends QueryCondition {
|
public class OperatorSelectCondition extends QueryCondition {
|
||||||
//操作符,例如 exist, not exist
|
//操作符,例如 exist, not exist
|
||||||
private String operator;
|
private final String operator;
|
||||||
private QueryWrapper queryWrapper;
|
private final QueryWrapper queryWrapper;
|
||||||
|
|
||||||
public OperatorSelectCondition(String operator, QueryWrapper queryWrapper) {
|
public OperatorSelectCondition(String operator, QueryWrapper queryWrapper) {
|
||||||
this.operator = operator;
|
this.operator = operator;
|
||||||
|
|||||||
@ -30,7 +30,7 @@ public enum SqlConnector {
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
private String value;
|
private final String value;
|
||||||
|
|
||||||
SqlConnector(String value) {
|
SqlConnector(String value) {
|
||||||
this.value = value;
|
this.value = value;
|
||||||
|
|||||||
@ -26,7 +26,7 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public class StringQueryOrderBy extends QueryOrderBy {
|
public class StringQueryOrderBy extends QueryOrderBy {
|
||||||
|
|
||||||
private String orderBy;
|
private final String orderBy;
|
||||||
|
|
||||||
public StringQueryOrderBy(String orderBy) {
|
public StringQueryOrderBy(String orderBy) {
|
||||||
SqlUtil.keepOrderBySqlSafely(orderBy);
|
SqlUtil.keepOrderBySqlSafely(orderBy);
|
||||||
|
|||||||
@ -42,7 +42,7 @@ public class Row extends LinkedHashMap<String, Object> implements ModifyAttrsRec
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private Set<String> modifyAttrs = new LinkedHashSet<>();
|
private final Set<String> modifyAttrs = new LinkedHashSet<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<String> getModifyAttrs() {
|
public Set<String> getModifyAttrs() {
|
||||||
|
|||||||
@ -53,8 +53,7 @@ public class RowMapperInvoker {
|
|||||||
|
|
||||||
public int[] insertBatch(String tableName, Collection<Row> rows, int batchSize) {
|
public int[] insertBatch(String tableName, Collection<Row> rows, int batchSize) {
|
||||||
int[] results = new int[rows.size()];
|
int[] results = new int[rows.size()];
|
||||||
SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH,true);
|
try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, true)) {
|
||||||
try {
|
|
||||||
RowMapper mapper = sqlSession.getMapper(RowMapper.class);
|
RowMapper mapper = sqlSession.getMapper(RowMapper.class);
|
||||||
int counter = 0;
|
int counter = 0;
|
||||||
int resultsPos = 0;
|
int resultsPos = 0;
|
||||||
@ -73,7 +72,7 @@ public class RowMapperInvoker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (counter != 0){
|
if (counter != 0) {
|
||||||
List<BatchResult> batchResults = sqlSession.flushStatements();
|
List<BatchResult> batchResults = sqlSession.flushStatements();
|
||||||
for (BatchResult batchResult : batchResults) {
|
for (BatchResult batchResult : batchResults) {
|
||||||
int[] updateCounts = batchResult.getUpdateCounts();
|
int[] updateCounts = batchResult.getUpdateCounts();
|
||||||
@ -82,8 +81,6 @@ public class RowMapperInvoker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} finally {
|
|
||||||
sqlSession.close();
|
|
||||||
}
|
}
|
||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,8 +43,8 @@ public class EntityWrapperFactory implements ObjectWrapperFactory {
|
|||||||
|
|
||||||
static class FlexBeanWrapper extends BeanWrapper {
|
static class FlexBeanWrapper extends BeanWrapper {
|
||||||
|
|
||||||
private Object entity;
|
private final Object entity;
|
||||||
private TableInfo tableInfo;
|
private final TableInfo tableInfo;
|
||||||
|
|
||||||
public FlexBeanWrapper(MetaObject metaObject, Object object) {
|
public FlexBeanWrapper(MetaObject metaObject, Object object) {
|
||||||
super(metaObject, object);
|
super(metaObject, object);
|
||||||
|
|||||||
@ -21,7 +21,7 @@ import java.io.Serializable;
|
|||||||
|
|
||||||
public class TableDef implements Serializable {
|
public class TableDef implements Serializable {
|
||||||
|
|
||||||
private String tableName;
|
private final String tableName;
|
||||||
|
|
||||||
public TableDef(String tableName) {
|
public TableDef(String tableName) {
|
||||||
this.tableName = tableName;
|
this.tableName = tableName;
|
||||||
|
|||||||
@ -88,8 +88,8 @@ public class TableInfo {
|
|||||||
private List<IdInfo> primaryKeyList;
|
private List<IdInfo> primaryKeyList;
|
||||||
|
|
||||||
//column 和 java 属性的称的关系映射
|
//column 和 java 属性的称的关系映射
|
||||||
private Map<String, ColumnInfo> columnInfoMapping = new HashMap<>();
|
private final Map<String, ColumnInfo> columnInfoMapping = new HashMap<>();
|
||||||
private Map<String, String> propertyColumnMapping = new HashMap<>();
|
private final Map<String, String> propertyColumnMapping = new HashMap<>();
|
||||||
|
|
||||||
private List<InsertListener> onInsertListeners;
|
private List<InsertListener> onInsertListeners;
|
||||||
private List<UpdateListener> onUpdateListeners;
|
private List<UpdateListener> onUpdateListeners;
|
||||||
@ -809,7 +809,7 @@ public class TableInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Map<Class<?>, List<InsertListener>> insertListenerCache = new ConcurrentHashMap<>();
|
private static final Map<Class<?>, List<InsertListener>> insertListenerCache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public void invokeOnInsertListener(Object entity) {
|
public void invokeOnInsertListener(Object entity) {
|
||||||
List<InsertListener> listeners = MapUtil.computeIfAbsent(insertListenerCache, entityClass, aClass -> {
|
List<InsertListener> listeners = MapUtil.computeIfAbsent(insertListenerCache, entityClass, aClass -> {
|
||||||
@ -823,7 +823,7 @@ public class TableInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Map<Class<?>, List<UpdateListener>> updateListenerCache = new ConcurrentHashMap<>();
|
private static final Map<Class<?>, List<UpdateListener>> updateListenerCache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public void invokeOnUpdateListener(Object entity) {
|
public void invokeOnUpdateListener(Object entity) {
|
||||||
List<UpdateListener> listeners = MapUtil.computeIfAbsent(updateListenerCache, entityClass, aClass -> {
|
List<UpdateListener> listeners = MapUtil.computeIfAbsent(updateListenerCache, entityClass, aClass -> {
|
||||||
@ -837,7 +837,7 @@ public class TableInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static Map<Class<?>, List<SetListener>> setListenerCache = new ConcurrentHashMap<>();
|
private static final Map<Class<?>, List<SetListener>> setListenerCache = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public Object invokeOnSetListener(Object entity, String property, Object value) {
|
public Object invokeOnSetListener(Object entity, String property, Object value) {
|
||||||
List<SetListener> listeners = MapUtil.computeIfAbsent(setListenerCache, entityClass, aClass -> {
|
List<SetListener> listeners = MapUtil.computeIfAbsent(setListenerCache, entityClass, aClass -> {
|
||||||
|
|||||||
@ -19,7 +19,7 @@ import java.util.function.Supplier;
|
|||||||
|
|
||||||
public class TenantManager {
|
public class TenantManager {
|
||||||
|
|
||||||
private static ThreadLocal<Boolean> ignoreFlags = new ThreadLocal<>();
|
private static final ThreadLocal<Boolean> ignoreFlags = new ThreadLocal<>();
|
||||||
|
|
||||||
private static TenantFactory tenantFactory;
|
private static TenantFactory tenantFactory;
|
||||||
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@ import java.util.List;
|
|||||||
|
|
||||||
public class UpdateEntity {
|
public class UpdateEntity {
|
||||||
|
|
||||||
private static ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
|
private static final ReflectorFactory reflectorFactory = new DefaultReflectorFactory();
|
||||||
|
|
||||||
|
|
||||||
public static <T> T of(Class<T> clazz) {
|
public static <T> T of(Class<T> clazz) {
|
||||||
|
|||||||
@ -3,7 +3,7 @@ package com.mybatisflex.coretest;
|
|||||||
import com.mybatisflex.core.dialect.impl.CommonsDialectImpl;
|
import com.mybatisflex.core.dialect.impl.CommonsDialectImpl;
|
||||||
import com.mybatisflex.core.dialect.IDialect;
|
import com.mybatisflex.core.dialect.IDialect;
|
||||||
import com.mybatisflex.core.dialect.KeywordWrap;
|
import com.mybatisflex.core.dialect.KeywordWrap;
|
||||||
import com.mybatisflex.core.dialect.LimitOffsetProcesser;
|
import com.mybatisflex.core.dialect.LimitOffsetProcessor;
|
||||||
import com.mybatisflex.core.query.CPI;
|
import com.mybatisflex.core.query.CPI;
|
||||||
import com.mybatisflex.core.query.QueryWrapper;
|
import com.mybatisflex.core.query.QueryWrapper;
|
||||||
import com.mybatisflex.core.table.TableInfo;
|
import com.mybatisflex.core.table.TableInfo;
|
||||||
@ -49,7 +49,7 @@ public class AccountSqlTester {
|
|||||||
.from(ACCOUNT.as("a"), ARTICLE.as("b"))
|
.from(ACCOUNT.as("a"), ARTICLE.as("b"))
|
||||||
.where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID));
|
.where(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID));
|
||||||
|
|
||||||
IDialect dialect = new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcesser.MYSQL);
|
IDialect dialect = new CommonsDialectImpl(KeywordWrap.NONE, LimitOffsetProcessor.MYSQL);
|
||||||
String sql = dialect.forSelectListByQuery(query);
|
String sql = dialect.forSelectListByQuery(query);
|
||||||
System.out.println(sql);
|
System.out.println(sql);
|
||||||
}
|
}
|
||||||
@ -321,28 +321,28 @@ public class AccountSqlTester {
|
|||||||
String sql1 = dialect1.buildSelectSql(queryWrapper);
|
String sql1 = dialect1.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql1);
|
System.out.println(sql1);
|
||||||
|
|
||||||
IDialect dialect2 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.ORACLE);
|
IDialect dialect2 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.ORACLE);
|
||||||
String sql2 = dialect2.buildSelectSql(queryWrapper);
|
String sql2 = dialect2.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql2);
|
System.out.println(sql2);
|
||||||
|
|
||||||
IDialect dialect3 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.DB2);
|
IDialect dialect3 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.DB2);
|
||||||
String sql3 = dialect3.buildSelectSql(queryWrapper);
|
String sql3 = dialect3.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql3);
|
System.out.println(sql3);
|
||||||
|
|
||||||
IDialect dialect4 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.POSTGRESQL);
|
IDialect dialect4 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.POSTGRESQL);
|
||||||
String sql4 = dialect4.buildSelectSql(queryWrapper);
|
String sql4 = dialect4.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql4);
|
System.out.println(sql4);
|
||||||
|
|
||||||
IDialect dialect5 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.INFORMIX);
|
IDialect dialect5 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.INFORMIX);
|
||||||
String sql5 = dialect5.buildSelectSql(queryWrapper);
|
String sql5 = dialect5.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql5);
|
System.out.println(sql5);
|
||||||
|
|
||||||
IDialect dialect6 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.SYBASE);
|
IDialect dialect6 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.SYBASE);
|
||||||
String sql6 = dialect6.buildSelectSql(queryWrapper);
|
String sql6 = dialect6.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql6);
|
System.out.println(sql6);
|
||||||
|
|
||||||
|
|
||||||
IDialect dialect7 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcesser.FIREBIRD);
|
IDialect dialect7 = new CommonsDialectImpl(KeywordWrap.DOUBLE_QUOTATION, LimitOffsetProcessor.FIREBIRD);
|
||||||
String sql7 = dialect7.buildSelectSql(queryWrapper);
|
String sql7 = dialect7.buildSelectSql(queryWrapper);
|
||||||
System.out.println(sql7);
|
System.out.println(sql7);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -40,7 +40,7 @@ import java.util.Map;
|
|||||||
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
|
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
|
||||||
public class MultiDataSourceAutoConfiguration {
|
public class MultiDataSourceAutoConfiguration {
|
||||||
|
|
||||||
private Map<String, Map<String, String>> dataSourceProperties;
|
private final Map<String, Map<String, String>> dataSourceProperties;
|
||||||
|
|
||||||
|
|
||||||
public MultiDataSourceAutoConfiguration(MybatisFlexProperties properties) {
|
public MultiDataSourceAutoConfiguration(MybatisFlexProperties properties) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user