前言
上篇博客说到JDBC连接数据库的步骤,其中涉及到一个很重要的对象,就是Statement。它是Java执行数据库操作的一个重要步骤,可以执行一些简单的SQL语句,从而完成对数据库的操作。它有两个子接口,分别是PreparedStatement和CallableStatement。
Statement
Statement用于执行静态SQL语句,并返回它所生成结果的对象。在默认情况下,同一时间每个Statement对象只能打开一个ResultSet对象。因此,如果读取一个ResultSet对象,与读取另一个交叉,则两个对象必须由不同的Statement对象生成。
Statement有许多数据库操作的方法,包括关闭,执行查询,执行更改等。不同的方法会有不同重写,传入不同的参数,得到不同的结果。就像咱们写的SQLHelper,里面有不同的执行方法,查询就有执行sql语句和执行存储过程等。
void | |
void | cancel()如果 DBMS 和驱动程序都支持中止 SQL 语句,则取消此 Statement 对象。 |
void | clearBatch()清空此 Statement 对象的当前 SQL 命令列表。 |
void | clearWarnings()清除在此 Statement 对象上报告的所有警告。 |
void | close()立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。 |
boolean | |
boolean | execute(String sql, int autoGeneratedKeys)执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于获取。 |
boolean | execute(String sql, int[] columnIndexes)执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。 |
boolean | execute(String sql, String[] columnNames)执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。 |
int[] | executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。 |
executeQuery(String sql)执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。 | |
int | executeUpdate(String sql)执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。 |
int | executeUpdate(String sql, int autoGeneratedKeys)执行给定的 SQL 语句,并用给定标志通知驱动程序由此 Statement 生成的自动生成键是否可用于获取。 |
int | executeUpdate(String sql, int[] columnIndexes)执行给定的 SQL 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。 |
int | executeUpdate(String sql, String[] columnNames)执行给定的 SQL 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。 |
getConnection()获取生成此 Statement 对象的 Connection 对象。 | |
|
PreparedStatement
getArray(String parameterName)以 Java 编程语言中ARRAY对象的形式检索 JDBC ARRAY 参数的值。 | |
byte | getByte(int parameterIndex)以Java编程语言中byte的形式检索指定的JDBC TINYINT参数的值。 |
byte | getByte(String parameterName)以Java编程语言中byte值的形式检索 JDBC TINYINT 参数的值。 |
void | setString(String parameterName, String x)将指定参数设置为给定 Java String 值。 |
void | setDate(String parameterName, Date x)将指定参数设置为给定 java.sql.Date 值。 |
void | setDate(String parameterName, Date x, Calendar cal)使用给定的 Calendar 对象将指定参数设置为给定 java.sql.Date 值。 |
void | setDouble(String parameterName, double x)将指定参数设置为给定 Java double 值。 |
void | setFloat(String parameterName, float x)将指定参数设置为给定 Java float 值。 |
void | |
void | setLong(String parameterName, long x)将指定参数设置为给定 Java long 值。 |
|
CallableStatement
实例
/**
* 添加分销商或区域
* @param clientOrRegion
*/
public void addClientOrRegion(Client clientOrRegion) {
StringBuffer sbSql = new StringBuffer();
//拼写SQL语句
sbSql.append("insert into t_client ( ")
.append("id, pid, client_level_id, ")
.append("name, client_id, bank_acct_no, ")
.append("contact_tel, address, zip_code, ")
.append("is_leaf, is_client) ")
.append("values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ");
Connection conn = null;
PreparedStatement pstmt = null;
try {
//获得数据库连接
conn = DbUtil.getConnection();
//PreparedStatement对象预编译SQL语句
pstmt = conn.prepareStatement(sbSql.toString());
//手动控制事务提交
DbUtil.beginTransaction(conn);
//给SQL语句的参数赋值,赋值的index从1开始一直到最后一个参数。
pstmt.setInt(1, IdGenerator.generate("t_client"));
pstmt.setInt(2, clientOrRegion.getPid());
pstmt.setString(3, clientOrRegion.getClientLevel().getId());
pstmt.setString(4, clientOrRegion.getName());
pstmt.setString(5, clientOrRegion.getClientId());
pstmt.setString(6, clientOrRegion.getBankAcctNo());
pstmt.setString(7, clientOrRegion.getContactTel());
pstmt.setString(8, clientOrRegion.getAddress());
pstmt.setString(9, clientOrRegion.getZipCode());
pstmt.setString(10, clientOrRegion.getIsLeaf());
pstmt.setString(11, clientOrRegion.getIsClient());
//PreparedStatement执行向数据库添加数据的操作
pstmt.executeUpdate();
Client parentClientOrRegion = findClientOrRegionById(clientOrRegion.getPid());
//如果为叶子
if (Constants.YES.equals(parentClientOrRegion.getIsLeaf())) {
//修改为非叶子
modifyIsLeafField(conn, clientOrRegion.getPid(), Constants.NO);
}
//提交事务
DbUtil.commitTransaction(conn);
}catch(Exception e) {
e.printStackTrace();
//回滚事务
DbUtil.rollbackTransaction(conn);
}finally {
//关闭数据库操作的各个对象
DbUtil.close(pstmt);
DbUtil.resetConnection(conn);
DbUtil.close(conn);
}
}
/**
* 删除节点
* @param conn
* @param id
*/
private void delNode(Connection conn, int id) throws SQLException{
//删除的sql语句
String sql = "delete from t_client where id=?";
PreparedStatement pstmt = null;
try{
//PreparedStatement对象预编译Sql语句
pstmt = conn.prepareStatement(sql);
//PreparedStatement对象给SQL语句参数赋值
pstmt.setInt(1, id);
//PreparedStatement对象执行删除数据库的操作
pstmt.executeUpdate();
}finally{
DbUtil.close(pstmt);
}
}
/**
* 根据分销商代码查询
* @param clientId
* @return 存在返回true,否则返回false
*/
public boolean findClientByClientId(String clientId) {
//查询的SQL语句
String sql = "select count(*) from t_client where client_id=?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
boolean flag = false;
try {
conn = DbUtil.getConnection();
//PreparedStatement对象预编译SQL语句
pstmt = conn.prepareStatement(sql);
//给SQL语句的参数赋值,赋值的index从1开始一直到最后一个参数。
pstmt.setString(1, clientId);
//PreparedStatement对象查询数据库,得到一个ResultSet,然后遍历ResultSet得到想要的实体
rs = pstmt.executeQuery();
rs.next();
return rs.getInt(1) > 0 ? true : false;
}catch(SQLException e) {
e.printStackTrace();
}finally {
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);
}
return flag;
}
/**
* 修改isLeaf字段
* @param conn
* @param id
* @param leaf Y/N
*/
private void modifyIsLeafField(Connection conn, int id, String leaf)
throws SQLException {
//更新的SQL语句
String sql = "update t_client set is_leaf=? where id=?";
PreparedStatement pstmt = null;
try {
conn = DbUtil.getConnection();
//PreparedStatement对象预编译SQL语句
pstmt = conn.prepareStatement(sql);
//给SQL语句的参数赋值,赋值的index从1开始一直到最后一个参数。
pstmt.setString(1, leaf);
pstmt.setInt(2, id);
//PreparedStatement对象更新数据库
pstmt.executeUpdate();
} finally {
DbUtil.close(pstmt);
}
}