Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
cn.hutool.db.sql.SqlExecutor Maven / Gradle / Ivy
Go to download
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。
package cn.hutool.db.sql;
import cn.hutool.core.collection.ArrayIter;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.lang.func.Func1;
import cn.hutool.db.DbUtil;
import cn.hutool.db.StatementUtil;
import cn.hutool.db.handler.RsHandler;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Map;
/**
* SQL执行器,全部为静态方法,执行查询或非查询的SQL语句
* 此方法为JDBC的简单封装,与数据库类型无关
*
* @author loolly
*
*/
public class SqlExecutor {
/**
* 执行非查询语句
* 语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL,使用name做为占位符,例如:name
* @param paramMap 参数Map
* @return 影响的行数
* @throws SQLException SQL执行异常
* @since 4.0.10
*/
public static int execute(Connection conn, String sql, Map paramMap) throws SQLException {
final NamedSql namedSql = new NamedSql(sql, paramMap);
return execute(conn, namedSql.getSql(), namedSql.getParams());
}
/**
* 执行非查询语句
* 语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param params 参数
* @return 影响的行数
* @throws SQLException SQL执行异常
*/
public static int execute(Connection conn, String sql, Object... params) throws SQLException {
PreparedStatement ps = null;
try {
ps = StatementUtil.prepareStatement(false, conn, sql, params);
return ps.executeUpdate();
} finally {
DbUtil.close(ps);
}
}
/**
* 执行调用存储过程
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param params 参数
* @return 如果执行后第一个结果是ResultSet,则返回true,否则返回false。
* @throws SQLException SQL执行异常
*/
public static boolean call(Connection conn, String sql, Object... params) throws SQLException {
CallableStatement call = null;
try {
call = StatementUtil.prepareCall(conn, sql, params);
return call.execute();
} finally {
DbUtil.close(call);
}
}
/**
* 执行调用存储过程
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param params 参数
* @return ResultSet
* @throws SQLException SQL执行异常
* @since 4.1.4
*/
public static ResultSet callQuery(Connection conn, String sql, Object... params) throws SQLException {
return StatementUtil.prepareCall(conn, sql, params).executeQuery();
}
/**
* 执行非查询语句,返回主键
* 发查询语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param paramMap 参数Map
* @return 主键
* @throws SQLException SQL执行异常
* @since 4.0.10
*/
public static Long executeForGeneratedKey(Connection conn, String sql, Map paramMap) throws SQLException {
final NamedSql namedSql = new NamedSql(sql, paramMap);
return executeForGeneratedKey(conn, namedSql.getSql(), namedSql.getParams());
}
/**
* 执行非查询语句,返回主键
* 发查询语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param params 参数
* @return 主键
* @throws SQLException SQL执行异常
*/
public static Long executeForGeneratedKey(Connection conn, String sql, Object... params) throws SQLException {
PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = StatementUtil.prepareStatement(true, conn, sql, params);
ps.executeUpdate();
rs = ps.getGeneratedKeys();
if (rs != null && rs.next()) {
try {
return rs.getLong(1);
} catch (SQLException e) {
// 可能会出现没有主键返回的情况
}
}
return null;
} finally {
DbUtil.close(ps);
DbUtil.close(rs);
}
}
/**
* 批量执行非查询语句
* 语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param paramsBatch 批量的参数
* @return 每个SQL执行影响的行数
* @throws SQLException SQL执行异常
* @deprecated 重载导致编译器无法区分
*/
@Deprecated
public static int[] executeBatch(Connection conn, String sql, Object[]... paramsBatch) throws SQLException {
return executeBatch(conn, sql, new ArrayIter<>(paramsBatch));
}
/**
* 批量执行非查询语句
* 语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sql SQL
* @param paramsBatch 批量的参数
* @return 每个SQL执行影响的行数
* @throws SQLException SQL执行异常
*/
public static int[] executeBatch(Connection conn, String sql, Iterable paramsBatch) throws SQLException {
PreparedStatement ps = null;
try {
ps = StatementUtil.prepareStatementForBatch(conn, sql, paramsBatch);
return ps.executeBatch();
} finally {
DbUtil.close(ps);
}
}
/**
* 批量执行非查询语句
* 语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sqls SQL列表
* @return 每个SQL执行影响的行数
* @throws SQLException SQL执行异常
* @since 4.5.6
*/
public static int[] executeBatch(Connection conn, String... sqls) throws SQLException {
return executeBatch(conn, new ArrayIter<>(sqls));
}
/**
* 批量执行非查询语句
* 语句包括 插入、更新、删除
* 此方法不会关闭Connection
*
* @param conn 数据库连接对象
* @param sqls SQL列表
* @return 每个SQL执行影响的行数
* @throws SQLException SQL执行异常
* @since 4.5.6
*/
public static int[] executeBatch(Connection conn, Iterable sqls) throws SQLException {
Statement statement = null;
try {
statement = conn.createStatement();
for (String sql : sqls) {
statement.addBatch(sql);
}
return statement.executeBatch();
} finally {
DbUtil.close(statement);
}
}
/**
* 执行查询语句,例如:select * from table where field1=:name1
* 此方法不会关闭Connection
*
* @param 处理结果类型
* @param conn 数据库连接对象
* @param sql 查询语句,使用参数名占位符,例如:name
* @param rsh 结果集处理对象
* @param paramMap 参数对
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 4.0.10
*/
public static T query(Connection conn, String sql, RsHandler rsh, Map paramMap) throws SQLException {
final NamedSql namedSql = new NamedSql(sql, paramMap);
return query(conn, namedSql.getSql(), rsh, namedSql.getParams());
}
/**
* 执行查询语句
* 此方法不会关闭Connection
*
* @param 处理结果类型
* @param conn 数据库连接对象
* @param sqlBuilder SQL构建器,包含参数
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 5.5.3
*/
public static T query(Connection conn, SqlBuilder sqlBuilder, RsHandler rsh) throws SQLException {
return query(conn, sqlBuilder.build(), rsh, sqlBuilder.getParamValueArray());
}
/**
* 执行查询语句
* 此方法不会关闭Connection
*
* @param 处理结果类型
* @param conn 数据库连接对象
* @param sql 查询语句
* @param rsh 结果集处理对象
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
*/
public static T query(Connection conn, String sql, RsHandler rsh, Object... params) throws SQLException {
PreparedStatement ps = null;
try {
ps = StatementUtil.prepareStatement(false, conn, sql, params);
return executeQuery(ps, rsh);
} finally {
DbUtil.close(ps);
}
}
/**
* 执行自定义的{@link PreparedStatement},结果使用{@link RsHandler}处理
* 此方法主要用于自定义场景,如游标查询等
*
* @param 处理结果类型
* @param conn 数据库连接对象
* @param statementFunc 自定义{@link PreparedStatement}创建函数
* @param rsh 自定义结果集处理
* @return 结果
* @throws SQLException SQL执行异常
* @since 5.7.17
*/
public static T query(Connection conn, Func1 statementFunc, RsHandler rsh) throws SQLException {
PreparedStatement ps = null;
try {
ps = statementFunc.call(conn);
return executeQuery(ps, rsh);
} catch (Exception e) {
if(e instanceof SQLException){
throw (SQLException) e;
}
throw ExceptionUtil.wrapRuntime(e);
} finally {
DbUtil.close(ps);
}
}
// -------------------------------------------------------------------------------------- Execute With PreparedStatement
/**
* 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。
* INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。
* executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。
* 对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。
* 此方法不会关闭PreparedStatement
*
* @param ps PreparedStatement对象
* @param params 参数
* @return 影响的行数
* @throws SQLException SQL执行异常
*/
public static int executeUpdate(PreparedStatement ps, Object... params) throws SQLException {
StatementUtil.fillParams(ps, params);
return ps.executeUpdate();
}
/**
* 可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。
* 如果执行后第一个结果是ResultSet,则返回true,否则返回false。
* 此方法不会关闭PreparedStatement
*
* @param ps PreparedStatement对象
* @param params 参数
* @return 如果执行后第一个结果是ResultSet,则返回true,否则返回false。
* @throws SQLException SQL执行异常
*/
public static boolean execute(PreparedStatement ps, Object... params) throws SQLException {
StatementUtil.fillParams(ps, params);
return ps.execute();
}
/**
* 执行查询语句
* 此方法不会关闭PreparedStatement
*
* @param 处理结果类型
* @param ps PreparedStatement
* @param rsh 结果集处理对象
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
*/
public static T query(PreparedStatement ps, RsHandler rsh, Object... params) throws SQLException {
StatementUtil.fillParams(ps, params);
return executeQuery(ps, rsh);
}
/**
* 执行查询语句并关闭PreparedStatement
*
* @param 处理结果类型
* @param ps PreparedStatement
* @param rsh 结果集处理对象
* @param params 参数
* @return 结果对象
* @throws SQLException SQL执行异常
*/
public static T queryAndClosePs(PreparedStatement ps, RsHandler rsh, Object... params) throws SQLException {
try {
return query(ps, rsh, params);
} finally {
DbUtil.close(ps);
}
}
// -------------------------------------------------------------------------------------------------------------------------------- Private method start
/**
* 执行查询
*
* @param ps {@link PreparedStatement}
* @param rsh 结果集处理对象
* @return 结果对象
* @throws SQLException SQL执行异常
* @since 4.1.13
*/
private static T executeQuery(PreparedStatement ps, RsHandler rsh) throws SQLException {
ResultSet rs = null;
try {
rs = ps.executeQuery();
return rsh.handle(rs);
} finally {
DbUtil.close(rs);
}
}
// -------------------------------------------------------------------------------------------------------------------------------- Private method end
}