com.jchanghong.db.sql.SqlExecutor Maven / Gradle / Ivy
The newest version!
package com.jchanghong.db.sql;
import com.jchanghong.core.collection.ArrayIter;
import com.jchanghong.db.DbUtil;
import com.jchanghong.db.StatementUtil;
import com.jchanghong.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(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(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执行异常
*/
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