diff --git a/CHANGELOG.md b/CHANGELOG.md
index fdd19a094..0042e17dd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,12 +3,13 @@
-------------------------------------------------------------------------------------------------------------
-# 5.5.3 (2020-12-05)
+# 5.5.3 (2020-12-06)
### 新特性
* 【core 】 IdcardUtil增加行政区划83(issue#1277@Github)
* 【core 】 multipart中int改为long,解决大文件上传越界问题(issue#I27WZ3@Gitee)
* 【core 】 ListUtil.page增加检查(pr#224@Gitee)
+* 【db 】 Db增加使用sql的page方法(issue#247@Gitee)
### Bug修复
* 【cache 】 修复Cache中get重复misCount计数问题(issue#1281@Github)
diff --git a/hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java b/hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java
index 2bfe00ee3..1da457b75 100644
--- a/hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java
+++ b/hutool-core/src/main/java/cn/hutool/core/net/URLEncoder.java
@@ -26,7 +26,7 @@ public class URLEncoder implements Serializable {
// --------------------------------------------------------------------------------------------- Static method start
/**
- * 默认{@link URLEncoder}
+ * 默认URLEncoder
* 默认的编码器针对URI路径编码,定义如下:
*
*
@@ -38,7 +38,7 @@ public class URLEncoder implements Serializable {
public static final URLEncoder DEFAULT = createDefault();
/**
- * 用于查询语句的{@link URLEncoder}
+ * 用于查询语句的URLEncoder
* 编码器针对URI路径编码,定义如下:
*
*
@@ -53,7 +53,7 @@ public class URLEncoder implements Serializable {
public static final URLEncoder QUERY = createQuery();
/**
- * 全编码的{@link URLEncoder}
+ * 全编码的URLEncoder
*
* 0x2A, 0x2D, 0x2E, 0x30 to 0x39, 0x41 to 0x5A, 0x5F, 0x61 to 0x7A as-is
* '*', '-', '.', '0' to '9', 'A' to 'Z', '_', 'a' to 'z' 不编码
@@ -63,7 +63,7 @@ public class URLEncoder implements Serializable {
public static final URLEncoder ALL = createAll();
/**
- * 创建默认{@link URLEncoder}
+ * 创建默认URLEncoder
* 默认的编码器针对URI路径编码,定义如下:
*
*
@@ -72,7 +72,7 @@ public class URLEncoder implements Serializable {
* sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
*
*
- * @return {@link URLEncoder}
+ * @return URLEncoder
*/
public static URLEncoder createDefault() {
final URLEncoder encoder = new URLEncoder();
@@ -102,7 +102,7 @@ public class URLEncoder implements Serializable {
}
/**
- * 创建用于查询语句的{@link URLEncoder}
+ * 创建用于查询语句的URLEncoder
* 编码器针对URI路径编码,定义如下:
*
*
@@ -114,7 +114,7 @@ public class URLEncoder implements Serializable {
*
* 详细见:https://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
*
- * @return {@link URLEncoder}
+ * @return URLEncoder
*/
public static URLEncoder createQuery() {
final URLEncoder encoder = new URLEncoder();
@@ -133,7 +133,7 @@ public class URLEncoder implements Serializable {
}
/**
- * 创建{@link URLEncoder}
+ * 创建URLEncoder
* 编码器针对URI路径编码,定义如下:
*
*
@@ -144,7 +144,7 @@ public class URLEncoder implements Serializable {
*
* 详细见:https://www.w3.org/TR/html5/forms.html#application/x-www-form-urlencoded-encoding-algorithm
*
- * @return {@link URLEncoder}
+ * @return URLEncoder
*/
public static URLEncoder createAll() {
final URLEncoder encoder = new URLEncoder();
diff --git a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java
index 86a05ba3b..21eaad316 100644
--- a/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java
+++ b/hutool-db/src/main/java/cn/hutool/db/AbstractDb.java
@@ -12,6 +12,7 @@ import cn.hutool.db.sql.Condition;
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.Wrapper;
@@ -660,7 +661,7 @@ public abstract class AbstractDb implements Serializable {
* @return 复合条件的结果数
* @throws SQLException SQL执行异常
*/
- public int count(Entity where) throws SQLException {
+ public long count(Entity where) throws SQLException {
Connection conn = null;
try {
conn = this.getConnection();
@@ -670,6 +671,23 @@ public abstract class AbstractDb implements Serializable {
}
}
+ /**
+ * 结果的条目数
+ *
+ * @param selectSql 查询SQL语句
+ * @return 复合条件的结果数
+ * @throws SQLException SQL执行异常
+ */
+ public long count(CharSequence selectSql) throws SQLException {
+ Connection conn = null;
+ try {
+ conn = this.getConnection();
+ return runner.count(conn, selectSql);
+ } finally {
+ this.closeConnection(conn);
+ }
+ }
+
/**
* 分页查询
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
@@ -777,25 +795,59 @@ public abstract class AbstractDb implements Serializable {
}
}
+ /**
+ * 分页查询
+ *
+ * @param 结果对象类型
+ * @param sql SQL构建器,可以使用{@link SqlBuilder#of(CharSequence)} 包装普通SQL
+ * @param page 分页对象
+ * @param rsh 结果集处理对象
+ * @return 结果对象
+ * @throws SQLException SQL执行异常
+ * @since 5.5.3
+ */
+ public T page(CharSequence sql, Page page, RsHandler rsh) throws SQLException {
+ Connection conn = null;
+ try {
+ conn = this.getConnection();
+ return runner.page(conn, SqlBuilder.of(sql), page, rsh);
+ } finally {
+ this.closeConnection(conn);
+ }
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param sql SQL语句字符串
+ * @param page 分页对象
+ * @return 结果对象
+ * @throws SQLException SQL执行异常
+ * @since 5.5.3
+ */
+ public PageResult page(CharSequence sql, Page page) throws SQLException {
+ Connection conn = null;
+ try {
+ conn = this.getConnection();
+ return runner.page(conn, SqlBuilder.of(sql), page);
+ } finally {
+ this.closeConnection(conn);
+ }
+ }
+
/**
* 分页查询
* 查询条件为多个key value对表示,默认key = value,如果使用其它条件可以使用:where.put("key", " > 1"),value也可以传Condition对象,key被忽略
*
* @param fields 返回的字段列表,null则返回所有字段
* @param where 条件实体类(包含表名)
- * @param page 分页对象
- * @param numPerPage 每页条目数
+ * @param pageNumber 页码
+ * @param pageSize 每页结果数
* @return 结果对象
* @throws SQLException SQL执行异常
*/
- public PageResult page(Collection fields, Entity where, int page, int numPerPage) throws SQLException {
- Connection conn = null;
- try {
- conn = this.getConnection();
- return runner.page(conn, fields, where, page, numPerPage);
- } finally {
- this.closeConnection(conn);
- }
+ public PageResult page(Collection fields, Entity where, int pageNumber, int pageSize) throws SQLException {
+ return page(fields, where, new Page(pageNumber, pageSize));
}
/**
diff --git a/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java b/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java
index 2ba3e908b..ffe6dedd1 100644
--- a/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java
+++ b/hutool-db/src/main/java/cn/hutool/db/DaoTemplate.java
@@ -326,7 +326,7 @@ public class DaoTemplate {
* @return 数量
* @throws SQLException SQL执行异常
*/
- public int count(Entity where) throws SQLException{
+ public long count(Entity where) throws SQLException{
return db.count(fixEntity(where));
}
diff --git a/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java b/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java
new file mode 100644
index 000000000..799ce1d31
--- /dev/null
+++ b/hutool-db/src/main/java/cn/hutool/db/DialectRunner.java
@@ -0,0 +1,298 @@
+package cn.hutool.db;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.dialect.Dialect;
+import cn.hutool.db.dialect.DialectFactory;
+import cn.hutool.db.handler.NumberHandler;
+import cn.hutool.db.handler.RsHandler;
+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.Wrapper;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+public class DialectRunner implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private Dialect dialect;
+ /**
+ * 是否大小写不敏感(默认大小写不敏感)
+ */
+ protected boolean caseInsensitive = GlobalDbConfig.caseInsensitive;
+
+ /**
+ * 构造
+ *
+ * @param dialect 方言
+ */
+ public DialectRunner(Dialect dialect) {
+ this.dialect = dialect;
+ }
+
+ /**
+ * 构造
+ *
+ * @param driverClassName 驱动类名,用于识别方言
+ */
+ public DialectRunner(String driverClassName) {
+ this(DialectFactory.newDialect(driverClassName));
+ }
+
+ //---------------------------------------------------------------------------- CRUD start
+ /**
+ * 批量插入数据
+ * 批量插入必须严格保持Entity的结构一致,不一致会导致插入数据出现不可预知的结果
+ * 此方法不会关闭Connection
+ *
+ * @param conn 数据库连接
+ * @param records 记录列表,记录KV必须严格一致
+ * @return 插入行数
+ * @throws SQLException SQL执行异常
+ */
+ public int[] insert(Connection conn, Entity... records) throws SQLException {
+ checkConn(conn);
+ if (ArrayUtil.isEmpty(records)) {
+ return new int[]{0};
+ }
+
+ PreparedStatement ps = null;
+ try {
+ if(1 == records.length){
+ //单条单独处理
+ ps = dialect.psForInsert(conn, records[0]);
+ return new int[]{ps.executeUpdate()};
+ }
+
+ // 批量
+ ps = dialect.psForInsertBatch(conn, records);
+ return ps.executeBatch();
+ } finally {
+ DbUtil.close(ps);
+ }
+ }
+
+ /**
+ * 插入数据
+ * 此方法不会关闭Connection
+ *
+ * @param conn 数据库连接
+ * @param record 记录
+ * @return 主键列表
+ * @throws SQLException SQL执行异常
+ */
+ public T insert(Connection conn, Entity record, RsHandler generatedKeysHandler) throws SQLException {
+ checkConn(conn);
+ if (CollUtil.isEmpty(record)) {
+ throw new SQLException("Empty entity provided!");
+ }
+
+ PreparedStatement ps = null;
+ try {
+ ps = dialect.psForInsert(conn, record);
+ ps.executeUpdate();
+ if(null == generatedKeysHandler){
+ return null;
+ }
+ return StatementUtil.getGeneratedKeys(ps, generatedKeysHandler);
+ } finally {
+ DbUtil.close(ps);
+ }
+ }
+
+ /**
+ * 删除数据
+ * 此方法不会关闭Connection
+ *
+ * @param conn 数据库连接
+ * @param where 条件
+ * @return 影响行数
+ * @throws SQLException SQL执行异常
+ */
+ public int del(Connection conn, Entity where) throws SQLException {
+ checkConn(conn);
+ if (CollUtil.isEmpty(where)) {
+ //不允许做全表删除
+ throw new SQLException("Empty entity provided!");
+ }
+
+ PreparedStatement ps = null;
+ try {
+ ps = dialect.psForDelete(conn, Query.of(where));
+ return ps.executeUpdate();
+ } finally {
+ DbUtil.close(ps);
+ }
+ }
+
+ /**
+ * 更新数据
+ * 此方法不会关闭Connection
+ *
+ * @param conn 数据库连接
+ * @param record 记录
+ * @param where 条件
+ * @return 影响行数
+ * @throws SQLException SQL执行异常
+ */
+ public int update(Connection conn, Entity record, Entity where) throws SQLException {
+ checkConn(conn);
+ if (CollUtil.isEmpty(record)) {
+ throw new SQLException("Empty entity provided!");
+ }
+ if (CollUtil.isEmpty(where)) {
+ //不允许做全表更新
+ throw new SQLException("Empty where provided!");
+ }
+
+ //表名可以从被更新记录的Entity中获得,也可以从Where中获得
+ String tableName = record.getTableName();
+ if (StrUtil.isBlank(tableName)) {
+ tableName = where.getTableName();
+ record.setTableName(tableName);
+ }
+
+ final Query query = new Query(SqlUtil.buildConditions(where), tableName);
+ PreparedStatement ps = null;
+ try {
+ ps = dialect.psForUpdate(conn, record, query);
+ return ps.executeUpdate();
+ } finally {
+ DbUtil.close(ps);
+ }
+ }
+
+ /**
+ * 查询
+ * 此方法不会关闭Connection
+ *
+ * @param 结果对象类型
+ * @param conn 数据库连接对象
+ * @param query {@link Query}
+ * @param rsh 结果集处理对象
+ * @return 结果对象
+ * @throws SQLException SQL执行异常
+ */
+ public T find(Connection conn, Query query, RsHandler rsh) throws SQLException {
+ checkConn(conn);
+ Assert.notNull(query, "[query] is null !");
+ return SqlExecutor.queryAndClosePs(dialect.psForFind(conn, query), rsh);
+ }
+
+ /**
+ * 获取结果总数,生成类似于select count(1) from XXX wher XXX=? and YYY=?
+ *
+ * @param conn 数据库连接对象
+ * @param where 查询条件
+ * @return 复合条件的结果数
+ * @throws SQLException SQL执行异常
+ */
+ public long count(Connection conn, Entity where) throws SQLException {
+ checkConn(conn);
+ return SqlExecutor.queryAndClosePs(dialect.psForCount(conn, Query.of(where)), new NumberHandler()).longValue();
+ }
+
+ /**
+ * 分页查询
+ * 此方法不会关闭Connection
+ *
+ * @param 结果对象类型
+ * @param conn 数据库连接对象
+ * @param query 查询条件(包含表名)
+ * @param rsh 结果集处理对象
+ * @return 结果对象
+ * @throws SQLException SQL执行异常
+ */
+ public T page(Connection conn, Query query, RsHandler rsh) throws SQLException {
+ checkConn(conn);
+ if (null == query.getPage()) {
+ return this.find(conn, query, rsh);
+ }
+
+ return SqlExecutor.queryAndClosePs(dialect.psForPage(conn, query), rsh);
+ }
+
+ /**
+ * 分页查询
+ * 此方法不会关闭Connection
+ *
+ * @param 结果对象类型
+ * @param conn 数据库连接对象
+ * @param sqlBuilder SQL构建器,可以使用{@link SqlBuilder#of(CharSequence)} 包装普通SQL
+ * @param page 分页对象
+ * @param rsh 结果集处理对象
+ * @return 结果对象
+ * @throws SQLException SQL执行异常
+ * @since 5.5.3
+ */
+ public T page(Connection conn, SqlBuilder sqlBuilder, Page page, RsHandler rsh) throws SQLException {
+ checkConn(conn);
+ if (null == page) {
+ return SqlExecutor.query(conn, sqlBuilder, rsh);
+ }
+
+ return SqlExecutor.queryAndClosePs(dialect.psForPage(conn, sqlBuilder, page), rsh);
+ }
+ //---------------------------------------------------------------------------- CRUD end
+
+ //---------------------------------------------------------------------------- Getters and Setters start
+
+ /**
+ * 设置是否在结果中忽略大小写
+ * 如果忽略,则在Entity中调用getXXX时,字段值忽略大小写,默认忽略
+ *
+ * @param caseInsensitive 否在结果中忽略大小写
+ * @since 5.2.4
+ */
+ public void setCaseInsensitive(boolean caseInsensitive) {
+ this.caseInsensitive = caseInsensitive;
+ }
+
+ /**
+ * @return SQL方言
+ */
+ public Dialect getDialect() {
+ return dialect;
+ }
+
+ /**
+ * 设置SQL方言
+ *
+ * @param dialect 方言
+ */
+ public void setDialect(Dialect dialect) {
+ this.dialect = dialect;
+ }
+
+ /**
+ * 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突
+ *
+ * @param wrapperChar 包装字符,字符会在SQL生成时位于表名和字段名两边,null时表示取消包装
+ */
+ public void setWrapper(Character wrapperChar) {
+ setWrapper(new Wrapper(wrapperChar));
+ }
+
+ /**
+ * 设置包装器,包装器用于对表名、字段名进行符号包装(例如双引号),防止关键字与这些表名或字段冲突
+ *
+ * @param wrapper 包装器,null表示取消包装
+ */
+ public void setWrapper(Wrapper wrapper) {
+ this.dialect.setWrapper(wrapper);
+ }
+ //---------------------------------------------------------------------------- Getters and Setters end
+
+ //---------------------------------------------------------------------------- Private method start
+ private void checkConn(Connection conn) {
+ Assert.notNull(conn, "Connection object must be not null!");
+ }
+ //---------------------------------------------------------------------------- Private method start
+}
diff --git a/hutool-db/src/main/java/cn/hutool/db/Page.java b/hutool-db/src/main/java/cn/hutool/db/Page.java
index d53b6bc99..8841ee4a3 100644
--- a/hutool-db/src/main/java/cn/hutool/db/Page.java
+++ b/hutool-db/src/main/java/cn/hutool/db/Page.java
@@ -9,26 +9,44 @@ import java.util.Arrays;
/**
* 分页对象
- *
- * @author Looly
*
+ * @author Looly
*/
public class Page implements Serializable {
private static final long serialVersionUID = 97792549823353462L;
public static final int DEFAULT_PAGE_SIZE = 20;
- /** 页码,0表示第一页 */
+ /**
+ * 页码,0表示第一页
+ */
private int pageNumber;
- /** 每页结果数 */
+ /**
+ * 每页结果数
+ */
private int pageSize;
- /** 排序 */
+ /**
+ * 排序
+ */
private Order[] orders;
+ /**
+ * 创建Page对象
+ *
+ * @param pageNumber 页码,0表示第一页
+ * @param pageSize 每页结果数
+ * @return Page
+ * @since 5.5.3
+ */
+ public static Page of(int pageNumber, int pageSize) {
+ return new Page(pageNumber, pageSize);
+ }
+
// ---------------------------------------------------------- Constructor start
+
/**
* 构造,默认第0页,每页{@value #DEFAULT_PAGE_SIZE} 条
- *
+ *
* @since 4.5.16
*/
public Page() {
@@ -37,9 +55,9 @@ public class Page implements Serializable {
/**
* 构造
- *
+ *
* @param pageNumber 页码,0表示第一页
- * @param pageSize 每页结果数
+ * @param pageSize 每页结果数
*/
public Page(int pageNumber, int pageSize) {
this.pageNumber = Math.max(pageNumber, 0);
@@ -48,18 +66,19 @@ public class Page implements Serializable {
/**
* 构造
- *
+ *
* @param pageNumber 页码,0表示第一页
- * @param pageSize 每页结果数
- * @param order 排序对象
+ * @param pageSize 每页结果数
+ * @param order 排序对象
*/
public Page(int pageNumber, int pageSize, Order order) {
this(pageNumber, pageSize);
- this.orders = new Order[] { order };
+ this.orders = new Order[]{order};
}
// ---------------------------------------------------------- Constructor start
// ---------------------------------------------------------- Getters and Setters start
+
/**
* @return 页码,0表示第一页
*/
@@ -69,7 +88,7 @@ public class Page implements Serializable {
/**
* 设置页码,0表示第一页
- *
+ *
* @param pageNumber 页码
*/
public void setPageNumber(int pageNumber) {
@@ -87,7 +106,7 @@ public class Page implements Serializable {
/**
* 设置每页结果数
- *
+ *
* @param pageSize 每页结果数
* @deprecated 使用 {@link #setPageSize(int)} 代替
*/
@@ -105,7 +124,7 @@ public class Page implements Serializable {
/**
* 设置每页结果数
- *
+ *
* @param pageSize 每页结果数
*/
public void setPageSize(int pageSize) {
@@ -121,7 +140,7 @@ public class Page implements Serializable {
/**
* 设置排序
- *
+ *
* @param orders 排序
*/
public void setOrder(Order... orders) {
@@ -130,7 +149,7 @@ public class Page implements Serializable {
/**
* 设置排序
- *
+ *
* @param orders 排序
*/
public void addOrder(Order... orders) {
@@ -162,7 +181,7 @@ public class Page implements Serializable {
* 页码:2,每页10 =》 [21, 30]
* 。。。
*
- *
+ *
* @return 第一个数为开始位置,第二个数为结束位置
*/
public int[] getStartEnd() {
diff --git a/hutool-db/src/main/java/cn/hutool/db/Session.java b/hutool-db/src/main/java/cn/hutool/db/Session.java
index 8b3a223e8..23cff582d 100644
--- a/hutool-db/src/main/java/cn/hutool/db/Session.java
+++ b/hutool-db/src/main/java/cn/hutool/db/Session.java
@@ -31,7 +31,7 @@ public class Session extends AbstractDb implements Closeable {
/**
* 创建默认数据源会话
*
- * @return {@link Session}
+ * @return Session
* @since 3.2.3
*/
public static Session create() {
@@ -42,7 +42,7 @@ public class Session extends AbstractDb implements Closeable {
* 创建会话
*
* @param group 分组
- * @return {@link Session}
+ * @return Session
* @since 4.0.11
*/
public static Session create(String group) {
@@ -53,7 +53,7 @@ public class Session extends AbstractDb implements Closeable {
* 创建会话
*
* @param ds 数据源
- * @return {@link Session}
+ * @return Session
*/
public static Session create(DataSource ds) {
return new Session(ds);
diff --git a/hutool-db/src/main/java/cn/hutool/db/SqlConnRunner.java b/hutool-db/src/main/java/cn/hutool/db/SqlConnRunner.java
index ac428c8b7..212a4090b 100644
--- a/hutool-db/src/main/java/cn/hutool/db/SqlConnRunner.java
+++ b/hutool-db/src/main/java/cn/hutool/db/SqlConnRunner.java
@@ -1,26 +1,21 @@
package cn.hutool.db;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.StrUtil;
import cn.hutool.db.dialect.Dialect;
import cn.hutool.db.dialect.DialectFactory;
import cn.hutool.db.handler.EntityListHandler;
+import cn.hutool.db.handler.HandleHelper;
import cn.hutool.db.handler.NumberHandler;
import cn.hutool.db.handler.PageResultHandler;
import cn.hutool.db.handler.RsHandler;
import cn.hutool.db.sql.Condition.LikeType;
import cn.hutool.db.sql.Query;
-import cn.hutool.db.sql.SqlExecutor;
+import cn.hutool.db.sql.SqlBuilder;
import cn.hutool.db.sql.SqlUtil;
-import cn.hutool.db.sql.Wrapper;
import javax.sql.DataSource;
-import java.io.Serializable;
import java.sql.Connection;
-import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
@@ -32,15 +27,9 @@ import java.util.List;
*
* @author Luxiaolei
*/
-public class SqlConnRunner implements Serializable {
+public class SqlConnRunner extends DialectRunner {
private static final long serialVersionUID = 1L;
- private Dialect dialect;
- /**
- * 是否大小写不敏感(默认大小写不敏感)
- */
- protected boolean caseInsensitive = GlobalDbConfig.caseInsensitive;
-
/**
* 实例化一个新的SQL运行对象
*
@@ -79,7 +68,7 @@ public class SqlConnRunner implements Serializable {
* @param dialect 方言
*/
public SqlConnRunner(Dialect dialect) {
- this.dialect = dialect;
+ super(dialect);
}
/**
@@ -88,35 +77,12 @@ public class SqlConnRunner implements Serializable {
* @param driverClassName 驱动类名,,用于识别方言
*/
public SqlConnRunner(String driverClassName) {
- this(DialectFactory.newDialect(driverClassName));
+ super(driverClassName);
}
//------------------------------------------------------- Constructor end
//---------------------------------------------------------------------------- CRUD start
- /**
- * 插入数据
- * 此方法不会关闭Connection
- *
- * @param conn 数据库连接
- * @param record 记录
- * @return 插入行数
- * @throws SQLException SQL执行异常
- */
- public int insert(Connection conn, Entity record) throws SQLException {
- checkConn(conn);
- if (CollUtil.isEmpty(record)) {
- throw new SQLException("Empty entity provided!");
- }
- PreparedStatement ps = null;
- try {
- ps = dialect.psForInsert(conn, record);
- return ps.executeUpdate();
- } finally {
- DbUtil.close(ps);
- }
- }
-
/**
* 插入或更新数据
* 此方法不会关闭Connection
@@ -152,33 +118,16 @@ public class SqlConnRunner implements Serializable {
}
/**
- * 批量插入数据
- * 批量插入必须严格保持Entity的结构一致,不一致会导致插入数据出现不可预知的结果
+ * 插入数据
* 此方法不会关闭Connection
*
- * @param conn 数据库连接
- * @param records 记录列表,记录KV必须严格一致
+ * @param conn 数据库连接
+ * @param record 记录
* @return 插入行数
* @throws SQLException SQL执行异常
*/
- public int[] insert(Connection conn, Entity... records) throws SQLException {
- checkConn(conn);
- if (ArrayUtil.isEmpty(records)) {
- return new int[]{0};
- }
-
- //单条单独处理
- if (1 == records.length) {
- return new int[]{insert(conn, records[0])};
- }
-
- PreparedStatement ps = null;
- try {
- ps = dialect.psForInsertBatch(conn, records);
- return ps.executeBatch();
- } finally {
- DbUtil.close(ps);
- }
+ public int insert(Connection conn, Entity record) throws SQLException {
+ return insert(conn, new Entity[]{record})[0];
}
/**
@@ -191,19 +140,7 @@ public class SqlConnRunner implements Serializable {
* @throws SQLException SQL执行异常
*/
public List