This commit is contained in:
Looly
2020-04-11 13:08:46 +08:00
parent 73fd3b849f
commit bc486cdac4
207 changed files with 1329 additions and 1355 deletions

View File

@@ -1,12 +1,11 @@
package cn.hutool.db;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
/**
* 线程相关的数据库连接持有器<br>
* 此对象为单例类用于存储线程相关的Connection对象。<br>
@@ -61,7 +60,7 @@ public enum ThreadLocalConnection {
public static class GroupedConnection {
/** 连接的Map考虑到大部分情况是单数据库故此处初始大小1 */
private Map<DataSource, Connection> connMap = new HashMap<>(1, 1);
private final Map<DataSource, Connection> connMap = new HashMap<>(1, 1);
/**
* 获取连接,如果获取的连接为空或者已被关闭,重新创建连接

View File

@@ -1,11 +1,5 @@
package cn.hutool.db.dialect;
import java.sql.Connection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import javax.sql.DataSource;
import cn.hutool.core.util.ClassLoaderUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.dialect.impl.AnsiSqlDialect;
@@ -17,6 +11,11 @@ import cn.hutool.db.dialect.impl.SqlServer2012Dialect;
import cn.hutool.db.dialect.impl.Sqlite3Dialect;
import cn.hutool.log.StaticLog;
import javax.sql.DataSource;
import java.sql.Connection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 方言工厂类
*
@@ -26,35 +25,35 @@ import cn.hutool.log.StaticLog;
public class DialectFactory {
/** JDBC 驱动 MySQL */
public final static String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
public static final String DRIVER_MYSQL = "com.mysql.jdbc.Driver";
/** JDBC 驱动 MySQL在6.X版本中变动驱动类名且使用SPI机制 */
public final static String DRIVER_MYSQL_V6 = "com.mysql.cj.jdbc.Driver";
public static final String DRIVER_MYSQL_V6 = "com.mysql.cj.jdbc.Driver";
/** JDBC 驱动 Oracle */
public final static String DRIVER_ORACLE = "oracle.jdbc.OracleDriver";
public static final String DRIVER_ORACLE = "oracle.jdbc.OracleDriver";
/** JDBC 驱动 Oracle旧版使用 */
public final static String DRIVER_ORACLE_OLD = "oracle.jdbc.driver.OracleDriver";
public static final String DRIVER_ORACLE_OLD = "oracle.jdbc.driver.OracleDriver";
/** JDBC 驱动 PostgreSQL */
public final static String DRIVER_POSTGRESQL = "org.postgresql.Driver";
public static final String DRIVER_POSTGRESQL = "org.postgresql.Driver";
/** JDBC 驱动 SQLLite3 */
public final static String DRIVER_SQLLITE3 = "org.sqlite.JDBC";
public static final String DRIVER_SQLLITE3 = "org.sqlite.JDBC";
/** JDBC 驱动 SQLServer */
public final static String DRIVER_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
public static final String DRIVER_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
/** JDBC 驱动 Hive */
public final static String DRIVER_HIVE = "org.apache.hadoop.hive.jdbc.HiveDriver";
public static final String DRIVER_HIVE = "org.apache.hadoop.hive.jdbc.HiveDriver";
/** JDBC 驱动 Hive2 */
public final static String DRIVER_HIVE2 = "org.apache.hive.jdbc.HiveDriver";
public static final String DRIVER_HIVE2 = "org.apache.hive.jdbc.HiveDriver";
/** JDBC 驱动 H2 */
public final static String DRIVER_H2 = "org.h2.Driver";
public static final String DRIVER_H2 = "org.h2.Driver";
/** JDBC 驱动 Derby */
public final static String DRIVER_DERBY = "org.apache.derby.jdbc.ClientDriver";
public static final String DRIVER_DERBY = "org.apache.derby.jdbc.ClientDriver";
/** JDBC 驱动 Derby嵌入式 */
public final static String DRIVER_DERBY_EMBEDDED = "org.apache.derby.jdbc.EmbeddedDriver";
public static final String DRIVER_DERBY_EMBEDDED = "org.apache.derby.jdbc.EmbeddedDriver";
/** JDBC 驱动 HSQLDB */
public final static String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver";
public static final String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver";
/** JDBC 驱动 达梦7 */
public final static String DRIVER_DM7 = "dm.jdbc.driver.DmDriver";
public static final String DRIVER_DM7 = "dm.jdbc.driver.DmDriver";
private static Map<DataSource, Dialect> dialectPool = new ConcurrentHashMap<>();
private static final Map<DataSource, Dialect> DIALECT_POOL = new ConcurrentHashMap<>();
private DialectFactory() {
}
@@ -150,15 +149,15 @@ public class DialectFactory {
* @return {@link Dialect}方言
*/
public static Dialect getDialect(DataSource ds) {
Dialect dialect = dialectPool.get(ds);
Dialect dialect = DIALECT_POOL.get(ds);
if(null == dialect) {
// 数据源作为锁的意义在于:不同数据源不会导致阻塞,相同数据源获取方言时可保证互斥
//noinspection SynchronizationOnLocalVariableOrMethodParameter
synchronized (ds) {
dialect = dialectPool.get(ds);
dialect = DIALECT_POOL.get(ds);
if(null == dialect) {
dialect = newDialect(ds);
dialectPool.put(ds, dialect);
DIALECT_POOL.put(ds, dialect);
}
}
}

View File

@@ -1,5 +1,8 @@
package cn.hutool.db.ds;
import cn.hutool.core.io.IoUtil;
import javax.sql.DataSource;
import java.io.Closeable;
import java.io.PrintWriter;
import java.sql.Connection;
@@ -7,10 +10,6 @@ import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.logging.Logger;
import javax.sql.DataSource;
import cn.hutool.core.io.IoUtil;
/**
* {@link DataSource} 数据源实现包装,通过包装,提供基本功能外的额外功能和参数持有,包括:
*
@@ -23,8 +22,8 @@ import cn.hutool.core.io.IoUtil;
*/
public class DataSourceWrapper implements DataSource, Closeable, Cloneable {
private DataSource ds;
private String driver;
private final DataSource ds;
private final String driver;
/**
* 包装指定的DataSource

View File

@@ -17,7 +17,7 @@ public class DbSetting {
/** 默认的数据库连接配置文件路径 */
public final static String DEFAULT_DB_CONFIG_PATH = "config/db.setting";
private Setting setting;
private final Setting setting;
/**
* 构造

View File

@@ -1,11 +1,11 @@
package cn.hutool.db.ds.pooled;
import cn.hutool.db.DbUtil;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import cn.hutool.db.DbUtil;
/**
* 池化
* @author Looly
@@ -13,7 +13,7 @@ import cn.hutool.db.DbUtil;
*/
public class PooledConnection extends ConnectionWraper{
private PooledDataSource ds;
private final PooledDataSource ds;
private boolean isClosed;
public PooledConnection(PooledDataSource ds) throws SQLException {

View File

@@ -1,11 +1,5 @@
package cn.hutool.db.ds.pooled;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Queue;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.thread.ThreadUtil;
@@ -13,6 +7,11 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.db.DbRuntimeException;
import cn.hutool.db.ds.simple.AbstractDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Queue;
/**
* 池化数据源
*
@@ -24,7 +23,7 @@ public class PooledDataSource extends AbstractDataSource {
private Queue<PooledConnection> freePool;
private int activeCount; // 活跃连接数
private DbConfig config;
private final DbConfig config;
/**
* 获得一个数据源
@@ -79,7 +78,7 @@ public class PooledDataSource extends AbstractDataSource {
*/
public PooledDataSource(DbConfig config) {
this.config = config;
freePool = new LinkedList<PooledConnection>();
freePool = new LinkedList<>();
int initialSize = config.getInitialSize();
try {
while (initialSize-- > 0) {
@@ -146,7 +145,7 @@ public class PooledDataSource extends AbstractDataSource {
}
@Override
synchronized public void close() throws IOException {
synchronized public void close() {
if (CollectionUtil.isNotEmpty(this.freePool)) {
for (PooledConnection pooledConnection : freePool) {
pooledConnection.release();
@@ -157,7 +156,7 @@ public class PooledDataSource extends AbstractDataSource {
}
@Override
protected void finalize() throws Throwable {
protected void finalize() {
IoUtil.close(this);
}

View File

@@ -1,11 +1,11 @@
package cn.hutool.db.handler;
import cn.hutool.db.Entity;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import cn.hutool.db.Entity;
/**
* Entity对象处理器只处理第一条数据
*
@@ -16,7 +16,7 @@ public class EntityHandler implements RsHandler<Entity>{
private static final long serialVersionUID = -8742432871908355992L;
/** 是否大小写不敏感 */
private boolean caseInsensitive;
private final boolean caseInsensitive;
/**
* 创建一个 EntityHandler对象

View File

@@ -1,12 +1,12 @@
package cn.hutool.db.handler;
import cn.hutool.db.Entity;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import cn.hutool.db.Entity;
/**
* 结果集处理类 处理出的结果为Entity列表
* @author loolly
@@ -16,7 +16,7 @@ public class EntityListHandler implements RsHandler<List<Entity>>{
private static final long serialVersionUID = -2846240126316979895L;
/** 是否大小写不敏感 */
private boolean caseInsensitive;
private final boolean caseInsensitive;
/**
* 创建一个 EntityListHandler对象

View File

@@ -1,11 +1,11 @@
package cn.hutool.db.handler;
import cn.hutool.db.Entity;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedHashSet;
import cn.hutool.db.Entity;
/**
* 结果集处理类 处理出的结果为Entity列表结果不能重复按照Entity对象去重
* @author loolly
@@ -15,7 +15,7 @@ public class EntitySetHandler implements RsHandler<LinkedHashSet<Entity>>{
private static final long serialVersionUID = 8191723216703506736L;
/** 是否大小写不敏感 */
private boolean caseInsensitive;
private final boolean caseInsensitive;
/**
* 创建一个 EntityHandler对象

View File

@@ -1,11 +1,11 @@
package cn.hutool.db.handler;
import java.sql.ResultSet;
import java.sql.SQLException;
import cn.hutool.db.Entity;
import cn.hutool.db.PageResult;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 分页结果集处理类 处理出的结果为PageResult
*
@@ -14,11 +14,11 @@ import cn.hutool.db.PageResult;
public class PageResultHandler implements RsHandler<PageResult<Entity>> {
private static final long serialVersionUID = -1474161855834070108L;
private PageResult<Entity> pageResult;
private final PageResult<Entity> pageResult;
/**
* 是否大小写不敏感
*/
private boolean caseInsensitive;
private final boolean caseInsensitive;
/**
* 创建一个 EntityHandler对象<br>

View File

@@ -4,7 +4,10 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* JDBC中字段类型枚举
*
* @author Clinton Begin
* @see java.sql.Types
*/
public enum JdbcType {
ARRAY(java.sql.Types.ARRAY), //
@@ -60,10 +63,10 @@ public enum JdbcType {
this.typeCode = code;
}
private static Map<Integer, JdbcType> codeMap = new ConcurrentHashMap<>(100, 1);
private static final Map<Integer, JdbcType> CODE_MAP = new ConcurrentHashMap<>(100, 1);
static {
for (JdbcType type : JdbcType.values()) {
codeMap.put(type.typeCode, type);
CODE_MAP.put(type.typeCode, type);
}
}
@@ -74,7 +77,7 @@ public enum JdbcType {
* @return {@link JdbcType}
*/
public static JdbcType valueOf(int code) {
return codeMap.get(code);
return CODE_MAP.get(code);
}
}

View File

@@ -21,8 +21,8 @@ public class Table implements Serializable, Cloneable {
/** 注释 */
private String comment;
/** 主键字段名列表 */
private Set<String> pkNames = new LinkedHashSet<String>();
private Map<String, Column> columns = new LinkedHashMap<>();
private Set<String> pkNames = new LinkedHashSet<>();
private final Map<String, Column> columns = new LinkedHashMap<>();
public static Table create(String tableName) {
return new Table(tableName);

View File

@@ -14,7 +14,7 @@ public enum TableType {
ALIAS("ALIAS"),
SYNONYM("SYNONYM");
private String value;
private final String value;
/**
* 构造

View File

@@ -1,13 +1,14 @@
package cn.hutool.db.nosql.mongo;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.RuntimeUtil;
import cn.hutool.setting.Setting;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.setting.Setting;
/**
* MongoDB工厂类用于创建
* @author looly
@@ -19,16 +20,11 @@ public class MongoFactory {
private final static String GROUP_SEPRATER = ",";
/** 数据源池 */
private static Map<String, MongoDS> dsMap = new ConcurrentHashMap<>();
private static final Map<String, MongoDS> DS_MAP = new ConcurrentHashMap<>();
// JVM关闭前关闭MongoDB连接
static {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
MongoFactory.closeAll();
}
});
RuntimeUtil.addShutdownHook(MongoFactory::closeAll);
}
// ------------------------------------------------------------------------ Get DS start
@@ -41,11 +37,11 @@ public class MongoFactory {
*/
public static MongoDS getDS(String host, int port) {
final String key = host + ":" + port;
MongoDS ds = dsMap.get(key);
MongoDS ds = DS_MAP.get(key);
if (null == ds) {
// 没有在池中加入之
ds = new MongoDS(host, port);
dsMap.put(key, ds);
DS_MAP.put(key, ds);
}
return ds;
@@ -60,11 +56,11 @@ public class MongoFactory {
*/
public static MongoDS getDS(String... groups) {
final String key = ArrayUtil.join(groups, GROUP_SEPRATER);
MongoDS ds = dsMap.get(key);
MongoDS ds = DS_MAP.get(key);
if (null == ds) {
// 没有在池中加入之
ds = new MongoDS(groups);
dsMap.put(key, ds);
DS_MAP.put(key, ds);
}
return ds;
@@ -77,7 +73,7 @@ public class MongoFactory {
* @return MongoDB连接
*/
public static MongoDS getDS(Collection<String> groups) {
return getDS(groups.toArray(new String[groups.size()]));
return getDS(groups.toArray(new String[0]));
}
/**
@@ -89,11 +85,11 @@ public class MongoFactory {
*/
public static MongoDS getDS(Setting setting, String... groups) {
final String key = setting.getSettingPath() + GROUP_SEPRATER + ArrayUtil.join(groups, GROUP_SEPRATER);
MongoDS ds = dsMap.get(key);
MongoDS ds = DS_MAP.get(key);
if (null == ds) {
// 没有在池中加入之
ds = new MongoDS(setting, groups);
dsMap.put(key, ds);
DS_MAP.put(key, ds);
}
return ds;
@@ -107,7 +103,7 @@ public class MongoFactory {
* @return MongoDB连接
*/
public static MongoDS getDS(Setting setting, Collection<String> groups) {
return getDS(setting, groups.toArray(new String[groups.size()]));
return getDS(setting, groups.toArray(new String[0]));
}
// ------------------------------------------------------------------------ Get DS ends
@@ -115,11 +111,11 @@ public class MongoFactory {
* 关闭全部连接
*/
public static void closeAll() {
if(CollectionUtil.isNotEmpty(dsMap)){
for(MongoDS ds : dsMap.values()) {
if(CollectionUtil.isNotEmpty(DS_MAP)){
for(MongoDS ds : DS_MAP.values()) {
ds.close();
}
dsMap.clear();
DS_MAP.clear();
}
}
}

View File

@@ -1,37 +1,40 @@
package cn.hutool.db.sql;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import cn.hutool.core.clone.CloneSupport;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.StrSpliter;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.CharUtil;
import cn.hutool.core.util.StrUtil;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* 条件对象<br>
*
* @author Looly
*
* @author Looly
*/
public class Condition extends CloneSupport<Condition> {
/**
* SQL中 LIKE 语句查询方式<br>
*
* @author Looly
*
* @author Looly
*/
public enum LikeType {
/** 以给定值开头拼接后的SQL "value%" */
/**
* 以给定值开头拼接后的SQL "value%"
*/
StartWith,
/** 以给定值开头拼接后的SQL "%value" */
/**
* 以给定值开头拼接后的SQL "%value"
*/
EndWith,
/** 包含给定值拼接后的SQL "%value%" */
/**
* 包含给定值拼接后的SQL "%value%"
*/
Contains
}
@@ -44,21 +47,31 @@ public class Condition extends CloneSupport<Condition> {
private static final String VALUE_NULL = "NULL";
/** 字段 */
/**
* 字段
*/
private String field;
/** 运算符(大于号,小于号,等于号 like 等) */
/**
* 运算符(大于号,小于号,等于号 like 等)
*/
private String operator;
/** 值 */
/**
* 值
*/
private Object value;
/** 是否使用条件值占位符 */
/**
* 是否使用条件值占位符
*/
private boolean isPlaceHolder = true;
/** between firstValue and secondValue */
/**
* between firstValue and secondValue
*/
private Object secondValue;
/**
* 解析为Condition
*
* @param field 字段名
*
* @param field 字段名
* @param expression 表达式或普通值
* @return Condition
*/
@@ -67,6 +80,7 @@ public class Condition extends CloneSupport<Condition> {
}
// --------------------------------------------------------------- Constructor start
/**
* 构造
*/
@@ -75,7 +89,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 构造
*
*
* @param isPlaceHolder 是否使用条件值占位符
*/
public Condition(boolean isPlaceHolder) {
@@ -84,7 +98,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 构造,使用等于表达式(运算符是=
*
*
* @param field 字段
* @param value 值
*/
@@ -95,10 +109,10 @@ public class Condition extends CloneSupport<Condition> {
/**
* 构造
*
* @param field 字段
*
* @param field 字段
* @param operator 运算符(大于号,小于号,等于号 like 等)
* @param value 值
* @param value
*/
public Condition(String field, String operator, Object value) {
this.field = field;
@@ -108,9 +122,9 @@ public class Condition extends CloneSupport<Condition> {
/**
* 构造
*
* @param field 字段
* @param value 值
*
* @param field 字段
* @param value
* @param likeType {@link LikeType}
*/
public Condition(String field, String value, LikeType likeType) {
@@ -121,6 +135,7 @@ public class Condition extends CloneSupport<Condition> {
// --------------------------------------------------------------- Constructor end
// --------------------------------------------------------------- Getters and Setters start
/**
* @return 字段
*/
@@ -130,7 +145,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 设置字段名
*
*
* @param field 字段名
*/
public void setField(String field) {
@@ -140,7 +155,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 获得运算符<br>
* 大于号,小于号,等于号 等
*
*
* @return 运算符
*/
public String getOperator() {
@@ -150,7 +165,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 设置运算符<br>
* 大于号,小于号,等于号 等
*
*
* @param operator 运算符
*/
public void setOperator(String operator) {
@@ -159,7 +174,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 获得值
*
*
* @return 值
*/
public Object getValue() {
@@ -168,7 +183,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 设置值,不解析表达式
*
*
* @param value 值
*/
public void setValue(Object value) {
@@ -177,8 +192,8 @@ public class Condition extends CloneSupport<Condition> {
/**
* 设置值
*
* @param value 值
*
* @param value
* @param isParse 是否解析值表达式
*/
public void setValue(Object value, boolean isParse) {
@@ -190,7 +205,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 是否使用条件占位符
*
*
* @return 是否使用条件占位符
*/
public boolean isPlaceHolder() {
@@ -199,7 +214,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 设置是否使用条件占位符
*
*
* @param isPlaceHolder 是否使用条件占位符
*/
public void setPlaceHolder(boolean isPlaceHolder) {
@@ -218,7 +233,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 是否IN条件
*
*
* @return 是否IN条件
* @since 4.0.1
*/
@@ -228,7 +243,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 是否IS条件
*
*
* @return 是否IS条件
* @since 4.0.1
*/
@@ -238,7 +253,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 检查值是否为null如果为null转换为 "IS NULL"形式
*
*
* @return this
*/
public Condition checkValueNull() {
@@ -276,7 +291,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 转换为条件字符串,并回填占位符对应的参数值
*
*
* @param paramValues 参数列表,用于回填占位符对应参数值
* @return 条件字符串
*/
@@ -297,7 +312,7 @@ public class Condition extends CloneSupport<Condition> {
if (isPlaceHolder() && false == isOperatorIs()) {
// 使用条件表达式占位符,条件表达式并不适用于 IS NULL
conditionStrBuilder.append(" ?");
if(null != paramValues) {
if (null != paramValues) {
paramValues.add(this.value);
}
} else {
@@ -310,19 +325,20 @@ public class Condition extends CloneSupport<Condition> {
}
// ----------------------------------------------------------------------------------------------- Private method start
/**
* 构建BETWEEN语句中的值部分<br>
* 开头必须加空格,类似:" ? AND ?" 或者 " 1 AND 2"
*
*
* @param conditionStrBuilder 条件语句构建器
* @param paramValues 参数集合,用于参数占位符对应参数回填
* @param paramValues 参数集合,用于参数占位符对应参数回填
*/
private void buildValuePartForBETWEEN(StringBuilder conditionStrBuilder, List<Object> paramValues) {
// BETWEEN x AND y 的情况,两个参数
if (isPlaceHolder()) {
// 使用条件表达式占位符
conditionStrBuilder.append(" ?");
if(null != paramValues) {
if (null != paramValues) {
paramValues.add(this.value);
}
} else {
@@ -335,7 +351,7 @@ public class Condition extends CloneSupport<Condition> {
if (isPlaceHolder()) {
// 使用条件表达式占位符
conditionStrBuilder.append(" ?");
if(null != paramValues) {
if (null != paramValues) {
paramValues.add(this.secondValue);
}
} else {
@@ -347,9 +363,9 @@ public class Condition extends CloneSupport<Condition> {
/**
* 构建IN语句中的值部分<br>
* 开头必须加空格,类似:" (?,?,?)" 或者 " (1,2,3,4)"
*
*
* @param conditionStrBuilder 条件语句构建器
* @param paramValues 参数集合,用于参数占位符对应参数回填
* @param paramValues 参数集合,用于参数占位符对应参数回填
*/
private void buildValuePartForIN(StringBuilder conditionStrBuilder, List<Object> paramValues) {
conditionStrBuilder.append(" (");
@@ -361,12 +377,9 @@ public class Condition extends CloneSupport<Condition> {
valuesForIn = StrUtil.split((CharSequence) value, ',');
} else {
valuesForIn = Arrays.asList(Convert.convert(String[].class, value));
if (null == valuesForIn) {
valuesForIn = CollUtil.newArrayList(Convert.toStr(value));
}
}
conditionStrBuilder.append(StrUtil.repeatAndJoin("?", valuesForIn.size(), ","));
if(null != paramValues) {
if (null != paramValues) {
paramValues.addAll(valuesForIn);
}
} else {
@@ -461,7 +474,7 @@ public class Condition extends CloneSupport<Condition> {
/**
* 去掉包围在字符串两端的单引号或双引号
*
*
* @param value 值
* @return 去掉引号后的值
*/
@@ -474,15 +487,15 @@ public class Condition extends CloneSupport<Condition> {
int from = 0;
int to = value.length();
char startChar = value.charAt(0);
char endChar = value.charAt(to - 1);
char endChar = value.charAt(value.length() - 1);
if (startChar == endChar) {
if ('\'' == startChar || '"' == startChar) {
from = 1;
to = to - 1;
to--;
}
}
if (from == 0 && to == value.length()) {
if (from == 0) {
// 并不包含,返回原值
return value;
}

View File

@@ -1,12 +1,12 @@
package cn.hutool.db.sql;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.StrUtil;
/**
* 使用命名占位符的SQL例如select * from table where field1=:name1<br>
* 支持的占位符格式为:
@@ -22,7 +22,7 @@ import cn.hutool.core.util.StrUtil;
public class NamedSql {
private String sql;
private List<Object> params;
private final List<Object> params;
/**
* 构造

View File

@@ -70,8 +70,8 @@ public class SqlFormatter {
boolean afterInsert = false;
int inFunction = 0;
int parensSinceSelect = 0;
private LinkedList<Integer> parenCounts = new LinkedList<>();
private LinkedList<Boolean> afterByOrFromOrSelects = new LinkedList<>();
private final LinkedList<Integer> parenCounts = new LinkedList<>();
private final LinkedList<Boolean> afterByOrFromOrSelects = new LinkedList<>();
int indent = 1;
@@ -273,14 +273,13 @@ public class SqlFormatter {
}
if (this.inFunction > 0) {
this.inFunction -= 1;
out();
} else {
if (!this.afterByOrSetOrFromOrSelect) {
this.indent -= 1;
newline();
}
out();
}
out();
this.beginLine = false;
}

View File

@@ -1,5 +1,12 @@
package cn.hutool.db.sql;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.DbRuntimeException;
import cn.hutool.db.Entity;
import cn.hutool.db.sql.Condition.LikeType;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
@@ -12,13 +19,6 @@ import java.sql.SQLException;
import java.util.List;
import java.util.Map.Entry;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.DbRuntimeException;
import cn.hutool.db.Entity;
import cn.hutool.db.sql.Condition.LikeType;
/**
* SQL相关工具类包括相关SQL语句拼接等
*
@@ -105,7 +105,7 @@ public class SqlUtil {
*/
public static String buildLikeValue(String value, LikeType likeType, boolean withLikeKeyword) {
if (null == value) {
return value;
return null;
}
StringBuilder likeValue = StrUtil.builder(withLikeKeyword ? "LIKE " : "");

View File

@@ -1,15 +1,15 @@
package cn.hutool.db.sql;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map.Entry;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Editor;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Entity;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map.Entry;
/**
* 包装器<br>
* 主要用于字段名的包装(在字段名的前后加字符,例如反引号来避免与数据库的关键字冲突)
@@ -135,7 +135,7 @@ public class Wrapper {
return fields;
}
return Arrays.asList(wrap(fields.toArray(new String[fields.size()])));
return Arrays.asList(wrap(fields.toArray(new String[0])));
}
/**

View File

@@ -58,7 +58,7 @@ public enum TransactionLevel {
SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);
/** 事务级别对应Connection中的常量值 */
private int level;
private final int level;
TransactionLevel(int level) {
this.level = level;

View File

@@ -22,7 +22,7 @@ import java.util.List;
*/
public class CRUDTest {
private static Db db = Db.use("test");
private static final Db db = Db.use("test");
@Test
public void findIsNullTest() throws SQLException {

View File

@@ -1,16 +1,15 @@
package cn.hutool.db;
import java.sql.SQLException;
import java.util.List;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.db.handler.EntityListHandler;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import java.sql.SQLException;
import java.util.List;
/**
* SqlRunner线程安全测试
@@ -31,17 +30,14 @@ public class ConcurentTest {
@Test
public void findTest() {
for(int i = 0; i < 10000; i++) {
ThreadUtil.execute(new Runnable() {
@Override
public void run() {
List<Entity> find;
try {
find = db.find(CollectionUtil.newArrayList("name AS name2"), Entity.create("user"), new EntityListHandler());
} catch (SQLException e) {
throw new DbRuntimeException(e);
}
Console.log(find);
ThreadUtil.execute(() -> {
List<Entity> find;
try {
find = db.find(CollectionUtil.newArrayList("name AS name2"), Entity.create("user"), new EntityListHandler());
} catch (SQLException e) {
throw new DbRuntimeException(e);
}
Console.log(find);
});
}

View File

@@ -1,11 +1,9 @@
package cn.hutool.db;
import java.sql.SQLException;
import org.junit.Ignore;
import org.junit.Test;
import cn.hutool.core.lang.func.VoidFunc1;
import java.sql.SQLException;
/**
* 事务性数据库操作单元测试
@@ -30,11 +28,6 @@ public class SessionTest {
@Test
@Ignore
public void txTest() throws SQLException {
Session.create("test").tx(new VoidFunc1<Session>() {
@Override
public void call(Session session) throws SQLException {
session.update(Entity.create().set("age", 78), Entity.create("user").set("name", "unitTestUser"));
}
});
Session.create("test").tx(session -> session.update(Entity.create().set("age", 78), Entity.create("user").set("name", "unitTestUser")));
}
}