This commit is contained in:
Looly
2023-03-13 05:04:50 +08:00
parent 5b559d19bd
commit 48eec2a8ae
92 changed files with 1487 additions and 651 deletions

View File

@@ -1,23 +1,10 @@
package cn.hutool.db;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.lang.func.SerFunction;
import cn.hutool.db.dialect.Dialect;
import cn.hutool.db.handler.BeanListHandler;
import cn.hutool.db.handler.EntityHandler;
import cn.hutool.db.handler.EntityListHandler;
import cn.hutool.db.handler.NumberHandler;
import cn.hutool.db.handler.ResultSetUtil;
import cn.hutool.db.handler.RsHandler;
import cn.hutool.db.handler.StringHandler;
import cn.hutool.db.sql.Condition;
import cn.hutool.db.handler.*;
import cn.hutool.db.sql.*;
import cn.hutool.db.sql.Condition.LikeType;
import cn.hutool.db.sql.LogicalOperator;
import cn.hutool.db.sql.Query;
import cn.hutool.db.sql.SqlBuilder;
import cn.hutool.db.sql.SqlExecutor;
import cn.hutool.db.sql.SqlUtil;
import cn.hutool.db.sql.QuoteWrapper;
import javax.sql.DataSource;
import java.io.Serializable;

View File

@@ -29,7 +29,7 @@ public class PooledDataSource extends AbstractDataSource {
* 获得一个数据源
*
* @param group 数据源分组
* @return {@link PooledDataSource}
* @return {@code PooledDataSource}
*/
synchronized public static PooledDataSource getDataSource(final String group) {
return new PooledDataSource(group);
@@ -38,7 +38,7 @@ public class PooledDataSource extends AbstractDataSource {
/**
* 获得一个数据源,使用空分组
*
* @return {@link PooledDataSource}
* @return {@code PooledDataSource}
*/
synchronized public static PooledDataSource getDataSource() {
return new PooledDataSource();

View File

@@ -7,7 +7,7 @@ import java.sql.SQLException;
/**
* 结果集处理接口<br>
* 此接口用于实现{@link ResultSet} 转换或映射为用户指定的pojo对象
*
* <p>
* 默认实现有:
* @see EntityHandler
* @see EntityListHandler
@@ -15,13 +15,13 @@ import java.sql.SQLException;
* @see EntitySetHandler
* @see NumberHandler
* @see PageResultHandler
*
*
* @author Luxiaolei
*
*/
@FunctionalInterface
public interface RsHandler<T> extends Serializable{
/**
* 处理结果集<br>
* 结果集处理后不需要关闭

View File

@@ -10,64 +10,177 @@ import java.util.Map;
* @see java.sql.Types
*/
public enum JdbcType {
ARRAY(java.sql.Types.ARRAY), //
BIT(java.sql.Types.BIT), //
TINYINT(java.sql.Types.TINYINT), //
SMALLINT(java.sql.Types.SMALLINT), //
INTEGER(java.sql.Types.INTEGER), //
BIGINT(java.sql.Types.BIGINT), //
FLOAT(java.sql.Types.FLOAT), //
REAL(java.sql.Types.REAL), //
DOUBLE(java.sql.Types.DOUBLE), //
NUMERIC(java.sql.Types.NUMERIC), //
DECIMAL(java.sql.Types.DECIMAL), //
CHAR(java.sql.Types.CHAR), //
VARCHAR(java.sql.Types.VARCHAR), //
LONGVARCHAR(java.sql.Types.LONGVARCHAR), //
DATE(java.sql.Types.DATE), //
TIME(java.sql.Types.TIME), //
TIMESTAMP(java.sql.Types.TIMESTAMP), //
BINARY(java.sql.Types.BINARY), //
VARBINARY(java.sql.Types.VARBINARY), //
LONGVARBINARY(java.sql.Types.LONGVARBINARY), //
NULL(java.sql.Types.NULL), //
OTHER(java.sql.Types.OTHER), //
BLOB(java.sql.Types.BLOB), //
CLOB(java.sql.Types.CLOB), //
BOOLEAN(java.sql.Types.BOOLEAN), //
CURSOR(-10), // Oracle
UNDEFINED(Integer.MIN_VALUE + 1000), //
NVARCHAR(java.sql.Types.NVARCHAR), // JDK6
NCHAR(java.sql.Types.NCHAR), // JDK6
NCLOB(java.sql.Types.NCLOB), // JDK6
STRUCT(java.sql.Types.STRUCT), //
JAVA_OBJECT(java.sql.Types.JAVA_OBJECT), //
DISTINCT(java.sql.Types.DISTINCT), //
REF(java.sql.Types.REF), //
DATALINK(java.sql.Types.DATALINK), //
ROWID(java.sql.Types.ROWID), // JDK6
LONGNVARCHAR(java.sql.Types.LONGNVARCHAR), // JDK6
SQLXML(java.sql.Types.SQLXML), // JDK6
DATETIMEOFFSET(-155), // SQL Server 2008
TIME_WITH_TIMEZONE(2013), // JDBC 4.2 JDK8
TIMESTAMP_WITH_TIMEZONE(2014); // JDBC 4.2 JDK8
public final int typeCode;
/**
* 构造
*
* @param code {@link java.sql.Types} 中对应的值
* {@link java.sql.Types#ARRAY}
*/
JdbcType(final int code) {
this.typeCode = code;
}
ARRAY(java.sql.Types.ARRAY), //
/**
* {@link java.sql.Types#BIT}
*/
BIT(java.sql.Types.BIT), //
/**
* {@link java.sql.Types#TINYINT}
*/
TINYINT(java.sql.Types.TINYINT), //
/**
* {@link java.sql.Types#SMALLINT}
*/
SMALLINT(java.sql.Types.SMALLINT), //
/**
* {@link java.sql.Types#INTEGER}
*/
INTEGER(java.sql.Types.INTEGER), //
/**
* {@link java.sql.Types#BIGINT}
*/
BIGINT(java.sql.Types.BIGINT), //
/**
* {@link java.sql.Types#FLOAT}
*/
FLOAT(java.sql.Types.FLOAT), //
/**
* {@link java.sql.Types#REAL}
*/
REAL(java.sql.Types.REAL), //
/**
* {@link java.sql.Types#DOUBLE}
*/
DOUBLE(java.sql.Types.DOUBLE), //
/**
* {@link java.sql.Types#NUMERIC}
*/
NUMERIC(java.sql.Types.NUMERIC), //
/**
* {@link java.sql.Types#DECIMAL}
*/
DECIMAL(java.sql.Types.DECIMAL), //
/**
* {@link java.sql.Types#CHAR}
*/
CHAR(java.sql.Types.CHAR), //
/**
* {@link java.sql.Types#VARCHAR}
*/
VARCHAR(java.sql.Types.VARCHAR), //
/**
* {@link java.sql.Types#LONGVARCHAR}
*/
LONGVARCHAR(java.sql.Types.LONGVARCHAR), //
/**
* {@link java.sql.Types#DATE}
*/
DATE(java.sql.Types.DATE), //
/**
* {@link java.sql.Types#TIME}
*/
TIME(java.sql.Types.TIME), //
/**
* {@link java.sql.Types#TIMESTAMP}
*/
TIMESTAMP(java.sql.Types.TIMESTAMP), //
/**
* {@link java.sql.Types#BINARY}
*/
BINARY(java.sql.Types.BINARY), //
/**
* {@link java.sql.Types#VARBINARY}
*/
VARBINARY(java.sql.Types.VARBINARY), //
/**
* {@link java.sql.Types#LONGVARBINARY}
*/
LONGVARBINARY(java.sql.Types.LONGVARBINARY), //
/**
* {@link java.sql.Types#NULL}
*/
NULL(java.sql.Types.NULL), //
/**
* {@link java.sql.Types#OTHER}
*/
OTHER(java.sql.Types.OTHER), //
/**
* {@link java.sql.Types#BLOB}
*/
BLOB(java.sql.Types.BLOB), //
/**
* {@link java.sql.Types#CLOB}
*/
CLOB(java.sql.Types.CLOB), //
/**
* {@link java.sql.Types#BOOLEAN}
*/
BOOLEAN(java.sql.Types.BOOLEAN), //
/**
* Oracle Cursor
*/
CURSOR(-10), // Oracle
/**
* UNDEFINED
*/
UNDEFINED(Integer.MIN_VALUE + 1000), //
/**
* {@link java.sql.Types#NVARCHAR}
*/
NVARCHAR(java.sql.Types.NVARCHAR), // JDK6
/**
* {@link java.sql.Types#NCHAR}
*/
NCHAR(java.sql.Types.NCHAR), // JDK6
/**
* {@link java.sql.Types#NCLOB}
*/
NCLOB(java.sql.Types.NCLOB), // JDK6
/**
* {@link java.sql.Types#STRUCT}
*/
STRUCT(java.sql.Types.STRUCT),
/**
* {@link java.sql.Types#JAVA_OBJECT}
*/
JAVA_OBJECT(java.sql.Types.JAVA_OBJECT),
/**
* {@link java.sql.Types#DISTINCT}
*/
DISTINCT(java.sql.Types.DISTINCT),
/**
* {@link java.sql.Types#REF}
*/
REF(java.sql.Types.REF),
/**
* {@link java.sql.Types#BOOLEAN}
*/
DATALINK(java.sql.Types.DATALINK), //
/**
* {@link java.sql.Types#ROWID}
*/
ROWID(java.sql.Types.ROWID), // JDK6
/**
* {@link java.sql.Types#LONGNVARCHAR}
*/
LONGNVARCHAR(java.sql.Types.LONGNVARCHAR), // JDK6
/**
* {@link java.sql.Types#SQLXML}
*/
SQLXML(java.sql.Types.SQLXML), // JDK6
/**
* SQL Server 2008 DateTimeOffset
*/
DATETIMEOFFSET(-155), // SQL Server 2008
/**
* Time With TimeZone
*/
TIME_WITH_TIMEZONE(2013), // JDBC 4.2 JDK8
/**
* TimeStamp With TimeZone
*/
TIMESTAMP_WITH_TIMEZONE(2014); // JDBC 4.2 JDK8
// 此处无写操作使用HashMap没有线程安全问题
private static final Map<Integer, JdbcType> CODE_MAP = new HashMap<>(128, 1);
static {
for (final JdbcType type : JdbcType.values()) {
CODE_MAP.put(type.typeCode, type);
CODE_MAP.put(type.value, type);
}
}
@@ -81,4 +194,23 @@ public enum JdbcType {
return CODE_MAP.get(code);
}
private final int value;
/**
* 构造
*
* @param code {@link java.sql.Types} 中对应的值
*/
JdbcType(final int code) {
this.value = code;
}
/**
* 获取枚举值即JDBC字段类型代码
*
* @return 字段类型代码
*/
public int getValue() {
return this.value;
}
}

View File

@@ -67,97 +67,215 @@ public class ResultColumn {
}
}
/**
* 是否自增
*
* @return 是否自增
*/
public boolean isAutoIncrement() {
return autoIncrement;
}
/**
* 是否大小写敏感
*
* @return 是否大小写敏感
*/
public boolean isCaseSensitive() {
return caseSensitive;
}
/**
* 是否可搜索
*
* @return 是否可搜索
*/
public boolean isSearchable() {
return searchable;
}
/**
* 是否为货币
*
* @return 是否为货币
*/
public boolean isCurrency() {
return currency;
}
/**
* 获取null值选项即是否可以为{@code null}
*
* @return null值选项是否可以为{@code null}
*/
public int getNullable() {
return nullable;
}
/**
* 获取列null值选项枚举即是否可以为{@code null}
*
* @return 列null值选项枚举即是否可以为{@code null}
*/
public ColumnNullable getNullableEnum() {
return ColumnNullable.of(getNullable());
}
/**
* 是否为带正负号的数字
*
* @return 是否为带正负号的数字
*/
public boolean isSigned() {
return signed;
}
/**
* 获取正常最大宽度(以字符数计)
*
* @return 正常最大宽度
*/
public int getDisplaySize() {
return displaySize;
}
/**
* 获取列标签
*
* @return 标签
*/
public String getLabel() {
return label;
}
/**
* 获取列名称
*
* @return 列名称
*/
public String getName() {
return name;
}
/**
* 获取表架构名称
*
* @return 表架构名称
*/
public String getSchemaName() {
return schemaName;
}
/**
* 获取小数位数
*
* @return 小数位数
*/
public int getPrecision() {
return precision;
}
/**
* 小数点右侧的位数
*
* @return 小数点右侧的位数
*/
public int getScale() {
return scale;
}
/**
* 获取表名
*
* @return 表名
*/
public String getTableName() {
return tableName;
}
/**
* 获取表的目录名称
*
* @return 表的目录名称
*/
public String getCatalogName() {
return catalogName;
}
/**
* 获取SQL类型
*
* @return SQL类型
*/
public int getType() {
return type;
}
/**
* 获取类型名称
*
* @return 类型名称
*/
public String getTypeName() {
return typeName;
}
/**
* 是否只读(不可写入)
*
* @return 是否只读(不可写入)
*/
public boolean isReadOnly() {
return readOnly;
}
/**
* 是否能够成功在指定列上写入
*
* @return 是否能够成功在指定列上写入
*/
public boolean isWritable() {
return writable;
}
/**
* 写入操作是否将一定成功
*
* @return 写入操作是否将一定成功
*/
public boolean isDefinitelyWritable() {
return definitelyWritable;
}
/**
* 如果调用getObject方法来从列中检索值则返回生成其实例的 Java 类的完全限定名称
*
* @return 包含类的完全限定名称
*/
public String getClassName() {
return className;
}
/**
* 列null值选项
*/
public enum ColumnNullable {
/**
* 列不允许有null
*/
NO_NULLS(ResultSetMetaData.columnNoNulls),
/**
* 列允许有null
*/
NULLABLE(ResultSetMetaData.columnNullable),
/**
* 未知
*/
UNKNOWN(ResultSetMetaData.columnNullableUnknown);
/**
* ResultSetMetaData中的int值转枚举
*
* @param nullable nullable值
* @return ColumnNullable
*/
@@ -173,8 +291,18 @@ public class ResultColumn {
}
final int value;
ColumnNullable(final int value) {
this.value = value;
}
/**
* 获取枚举值即列null值选项代码
*
* @return 列null值选项代码
*/
public int getValue() {
return this.value;
}
}
}