SqlExecutor
封装Connection
、PreparedStatement
、ResultSet
接口的底层操作,简化JDBC的使用
/**
*
* SQL执行器,用于执行sql语句,以及处理查询结果
* 这个是核心类,封装Connection、PreparedStatement、ResultSet接口的底层操作,简化JDBC的使用
*
*/
public class SqlExecutor {
/**
* 连接对象,从外部传入,不需要自己生成
*/
private Connection connection;
/**
* 构造方法传入连接对象
* @param connection 连接对象
*/
public SqlExecutor(Connection connection) {
this.connection = connection;
}
/**
* 执行增删改的方法
* @param sql 执行的sql语句
* @param params 可变参数(数组),sql语句中需要设置的参数
* (也是就是sql中的"?")
* @return
*/
public int executeUpdate(String sql, Object...params) {
if(connection == null) {
throw new RuntimeException("Null connection.");
}
if(sql == null) {
throw new RuntimeException("Null SQL statement");
}
//通过connection对象得到一个PreparedStatement对象用于发送sql语句
PreparedStatement ps = null;
try {
//创建PreparedStatement并预编译发送sql
ps = connection.prepareStatement(sql);
//设置参数
setParameters(ps, params);
//执行execute方法返回影响的行数
return ps.executeUpdate();
} catch (SQLException e) {
//将捕获的sql异常抛出去给调用者
throw new RuntimeException("Execute sql error." + e);
} finally {
//关闭Statement
close(ps);
//关闭连接
close();
}
}
/**
* 给sql语句设置参数
* @param ps
* @param params
*/
private void setParameters(PreparedStatement ps, Object[] params) throws SQLException {
int count = 1;
for (Object object : objects) {
//通过setObject方法来设置参数,注意:jdbc的参数是从1开始
preparedStatement.setObject(count, object);
count++;
}
}
/**
* 关闭Statement
* @param st
*/
private void close(Statement st) {
if(st != null) {
try {
st.close();
} catch (SQLException e) {
throw new RuntimeException("Close statement fail.", e);
}
}
}
/**
* 关闭连接对象
*/
private void close() {
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
throw new RuntimeException("Close connection fail.", e);
}
}
}
}