fix db bug

This commit is contained in:
Looly 2019-09-19 07:38:19 +08:00
parent 334ad373c2
commit 470e8f9633
4 changed files with 65 additions and 111 deletions

View File

@ -12,6 +12,7 @@
### Bug修复
* 【core】 修复DateUtil.offset导致的时区错误问题issue#I1294O@Gitee
* 【core】 修复RuntimeUtil.exec重载导致的问题issue#544@Github
* 【db】 修复StatementUtil.getGeneratedKeys返回主键数量不足问题
-------------------------------------------------------------------------------------------------------------

View File

@ -94,7 +94,7 @@ public abstract class AbstractDb implements Serializable{
* @since 3.2.2
*/
public <T> List<T> query(String sql, Class<T> beanClass, Object... params) throws SQLException {
return query(sql, new BeanListHandler<T>(beanClass), params);
return query(sql, new BeanListHandler<>(beanClass), params);
}
/**
@ -148,8 +148,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return SqlExecutor.query(conn, sql, rsh, params);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -169,8 +167,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return SqlExecutor.execute(conn, sql, params);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -190,8 +186,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return SqlExecutor.executeForGeneratedKey(conn, sql, params);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -210,8 +204,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return SqlExecutor.executeBatch(conn, sql, paramsBatch);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -230,8 +222,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return SqlExecutor.executeBatch(conn, sqls);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -250,8 +240,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.insert(conn, record);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -272,8 +260,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.insertOrUpdate(conn, record, keys);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -293,8 +279,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.insert(conn, records);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -312,8 +296,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.insertForGeneratedKeys(conn, record);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -331,8 +313,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.insertForGeneratedKey(conn, record);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -363,8 +343,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.del(conn, where);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -384,8 +362,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.update(conn, record, where);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -436,8 +412,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.find(conn, fields, where, rsh);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -450,7 +424,6 @@ public abstract class AbstractDb implements Serializable{
* @param fields 返回的字段列表null则返回所有字段
* @param where 条件实体类包含表名
* @return 结果Entity列表
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 4.5.16
*/
@ -474,8 +447,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.find(conn, query, rsh);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -613,8 +584,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.count(conn, where);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -638,8 +607,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.page(conn, fields, where, page, numPerPage, rsh);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -724,8 +691,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.page(conn, fields, where, page, rsh);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -747,8 +712,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.page(conn, fields, where, page, numPerPage);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}
@ -769,8 +732,6 @@ public abstract class AbstractDb implements Serializable{
try {
conn = this.getConnection();
return runner.page(conn, fields, where, page);
} catch (SQLException e) {
throw e;
} finally {
this.closeConnection(conn);
}

View File

@ -101,15 +101,13 @@ public class SqlConnRunner{
try {
ps = dialect.psForInsert(conn, record);
return ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
}
/**
* 插入数据<br>
* 插入或更新数据<br>
* 此方法不会关闭Connection
*
* @param conn 数据库连接
@ -191,8 +189,6 @@ public class SqlConnRunner{
ps = dialect.psForInsert(conn, record);
ps.executeUpdate();
return StatementUtil.getGeneratedKeys(ps);
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
@ -217,8 +213,6 @@ public class SqlConnRunner{
ps = dialect.psForInsert(conn, record);
ps.executeUpdate();
return StatementUtil.getGeneratedKeyOfLong(ps);
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
@ -244,8 +238,6 @@ public class SqlConnRunner{
try {
ps = dialect.psForDelete(conn, query);
return ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
@ -282,8 +274,6 @@ public class SqlConnRunner{
try {
ps = dialect.psForUpdate(conn, record, query);
return ps.executeUpdate();
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
@ -308,8 +298,6 @@ public class SqlConnRunner{
try {
ps = dialect.psForFind(conn, query);
return SqlExecutor.query(ps, rsh);
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
@ -444,8 +432,6 @@ public class SqlConnRunner{
try {
ps = dialect.psForCount(conn, query);
return SqlExecutor.query(ps, new NumberHandler()).intValue();
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(ps);
}
@ -531,7 +517,7 @@ public class SqlConnRunner{
//查询全部
if(null == page){
List<Entity> entityList = this.find(conn, fields, where, new EntityListHandler());
final PageResult<Entity> pageResult = new PageResult<Entity>(0, entityList.size(), entityList.size());
final PageResult<Entity> pageResult = new PageResult<>(0, entityList.size(), entityList.size());
pageResult.addAll(entityList);
return pageResult;
}

View File

@ -24,15 +24,15 @@ import cn.hutool.db.sql.SqlUtil;
/**
* Statement和PreparedStatement工具类
*
*
* @author looly
* @since 4.0.10
*/
public class StatementUtil {
/**
* 填充SQL的参数
*
* @param ps PreparedStatement
*
* @param ps PreparedStatement
* @param params SQL参数
* @return {@link PreparedStatement}
* @throws SQLException SQL执行异常
@ -44,8 +44,8 @@ public class StatementUtil {
/**
* 填充SQL的参数<br>
* 对于日期对象特殊处理传入java.util.Date默认按照Timestamp处理
*
* @param ps PreparedStatement
*
* @param ps PreparedStatement
* @param params SQL参数
* @return {@link PreparedStatement}
* @throws SQLException SQL执行异常
@ -84,15 +84,7 @@ public class StatementUtil {
ps.setObject(paramIndex, param);
}
} else {
final ParameterMetaData pmd = ps.getParameterMetaData();
int sqlType = Types.VARCHAR;
try {
sqlType = pmd.getParameterType(paramIndex);
} catch (SQLException e) {
// ignore
// log.warn("Null param of index [{}] type get failed, by: {}", paramIndex, e.getMessage());
}
ps.setNull(paramIndex, sqlType);
ps.setNull(paramIndex, getTypeOfNull(ps, paramIndex));
}
}
return ps;
@ -100,8 +92,8 @@ public class StatementUtil {
/**
* 创建{@link PreparedStatement}
*
* @param conn 数据库连接
*
* @param conn 数据库连接
* @param sqlBuilder {@link SqlBuilder}包括SQL语句和参数
* @return {@link PreparedStatement}
* @throws SQLException SQL异常
@ -113,9 +105,9 @@ public class StatementUtil {
/**
* 创建{@link PreparedStatement}
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
* @param params "?"对应参数列表
* @return {@link PreparedStatement}
* @throws SQLException SQL异常
@ -127,9 +119,9 @@ public class StatementUtil {
/**
* 创建{@link PreparedStatement}
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
* @param params "?"对应参数列表
* @return {@link PreparedStatement}
* @throws SQLException SQL异常
@ -149,12 +141,12 @@ public class StatementUtil {
}
return fillParams(ps, params);
}
/**
* 创建批量操作的{@link PreparedStatement}
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
* @param paramsBatch "?"对应参数批次列表
* @return {@link PreparedStatement}
* @throws SQLException SQL异常
@ -166,9 +158,9 @@ public class StatementUtil {
/**
* 创建批量操作的{@link PreparedStatement}
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
* @param paramsBatch "?"对应参数批次列表
* @return {@link PreparedStatement}
* @throws SQLException SQL异常
@ -189,9 +181,9 @@ public class StatementUtil {
/**
* 创建{@link CallableStatement}
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
*
* @param conn 数据库连接
* @param sql SQL语句使用"?"做为占位符
* @param params "?"对应参数列表
* @return {@link CallableStatement}
* @throws SQLException SQL异常
@ -210,15 +202,13 @@ public class StatementUtil {
/**
* 获得自增键的值<br>
* 此方法对于Oracle无效
*
*
* @param ps PreparedStatement
* @return 自增键的值
* @throws SQLException SQL执行异常
*/
public static Long getGeneratedKeyOfLong(PreparedStatement ps) throws SQLException {
ResultSet rs = null;
try {
rs = ps.getGeneratedKeys();
public static Long getGeneratedKeyOfLong(Statement ps) throws SQLException {
try(final ResultSet rs = ps.getGeneratedKeys()) {
Long generatedKey = null;
if (rs != null && rs.next()) {
try {
@ -228,34 +218,50 @@ public class StatementUtil {
}
}
return generatedKey;
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(rs);
}
}
/**
* 获得所有主键<br>
*
* 获得所有主键
*
* @param ps PreparedStatement
* @return 所有主键
* @throws SQLException SQL执行异常
*/
public static List<Object> getGeneratedKeys(PreparedStatement ps) throws SQLException {
List<Object> keys = new ArrayList<Object>();
ResultSet rs = null;
int i = 1;
try {
rs = ps.getGeneratedKeys();
if (rs != null && rs.next()) {
keys.add(rs.getObject(i++));
public static List<Object> getGeneratedKeys(Statement ps) throws SQLException {
final List<Object> keys = new ArrayList<>();
try (final ResultSet rs = ps.getGeneratedKeys()) {
if (null != rs) {
int i = 1;
while (rs.next()) {
keys.add(rs.getObject(i++));
}
}
return keys;
} catch (SQLException e) {
throw e;
} finally {
DbUtil.close(rs);
}
}
/**
* 获取null字段对应位置的数据类型<br>
* 有些数据库对于null字段必须指定类型否则会插入报错此方法用于获取其类型如果获取失败使用默认的{@link Types#VARCHAR}
*
* @param ps {@link Statement}
* @param paramIndex 参数位置第一位从1开始
* @return 数据类型默认{@link Types#VARCHAR}
* @since 4.6.7
*/
public static int getTypeOfNull(PreparedStatement ps, int paramIndex) {
int sqlType = Types.VARCHAR;
final ParameterMetaData pmd;
try {
pmd = ps.getParameterMetaData();
sqlType = pmd.getParameterType(paramIndex);
} catch (SQLException ignore) {
// ignore
// log.warn("Null param of index [{}] type get failed, by: {}", paramIndex, e.getMessage());
}
return sqlType;
}
}