JDBC连接数据库中的Statement对象

18 篇文章 2 订阅

前言


    上篇博客说到JDBC连接数据库的步骤,其中涉及到一个很重要的对象,就是Statement。它是Java执行数据库操作的一个重要步骤,可以执行一些简单的SQL语句,从而完成对数据库的操作。它有两个子接口,分别是PreparedStatement和CallableStatement。


Statement


    Statement用于执行静态SQL语句,并返回它所生成结果的对象。在默认情况下,同一时间每个Statement对象只能打开一个ResultSet对象。因此,如果读取一个ResultSet对象,与读取另一个交叉,则两个对象必须由不同的Statement对象生成。


    Statement有许多数据库操作的方法,包括关闭,执行查询,执行更改等。不同的方法会有不同重写,传入不同的参数,得到不同的结果。就像咱们写的SQLHelper,里面有不同的执行方法,查询就有执行sql语句和执行存储过程等。

 void

addBatch(String sql)将给定的 SQL 命令添加到此 Statement 对象的当前命令列表中。

 void

cancel()如果 DBMS 和驱动程序都支持中止 SQL 语句,则取消此 Statement 对象。

 void

clearBatch()清空此 Statement 对象的当前 SQL 命令列表。

 void

clearWarnings()清除在此 Statement 对象上报告的所有警告。

 void

close()立即释放此 Statement 对象的数据库和 JDBC 资源,而不是等待该对象自动关闭时发生此操作。

 boolean

execute(String sql)执行给定的 SQL 语句,该语句可能返回多个结果。

 boolean

execute(String sql, int autoGeneratedKeys)执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序所有自动生成的键都应该可用于获取。

 boolean

execute(String sql, int[] columnIndexes)执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。

 boolean

execute(String sql, String[] columnNames)执行给定的 SQL 语句(该语句可能返回多个结果),并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。

 int[]

executeBatch()将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

 ResultSet

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 语句,并通知驱动程序在给定数组中指示的自动生成的键应该可用于获取。

 Connection

getConnection()获取生成此 Statement 对象的 Connection 对象。



PreparedStatement


    PreparedStatement是Statement的一个子接口,它的含义是预编译的SQL语句对象,也就是说是已经“准备好”的语句。SQL语句被预编译后,存在PreparedStatement对象中,然后可以使用该对象高效的多次执行该语句。

    PreparedStatement对象可以执行带参数的SQL语句,也就是说,该对象可以给SQL语句中的参数赋值。它有各种set方法,可以给不同数据类型的参数进行赋值。  

 Array

getArray(int i) Java 编程语言中Array对象的形式检索指定的JDBC ARRAY参数的值。

 Array

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

setInt(String parameterName, int x)将指定参数设置为给定 Java int 值。

 void

setLong(String parameterName, long x)将指定参数设置为给定 Java long 值。



CallableStatement


    CallableStatement是Statement的另外一个接口,用于执行存储过程的接口。JDBC API提供了一个存储过程SQL转义语法,该语法允许对所有RDBMS 使用标准方式调用存储过程。此转义语法有一个包含结果参数的形式和一个不包含结果参数的形式。如果使用结果参数,则必须将其注册为 OUT型参数。其他参数可用于输入、输出或同时用于二者。参数是根据编号按顺序引用的,第一个参数的编号是 1。

    CallableStatement的方法和PreparedStatement的方法类似,这里就不赘述了。

实例


1、添加实体

/**
 * 添加分销商或区域
 * @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);
	}
}

2、删除实体

/**
 * 删除节点
 * @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);
	}
}

3、查询实体

/**
 * 根据分销商代码查询
 * @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;
}

4、更新实体

/**
 * 修改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);	
	}
}

总结


     创建Statement是JDBC连接数据库的一个重要步骤,执行不同的SQL语句有不同的接口,PreparedStatement用于执行简单的增删改查的SQL语句,CallableStatement则用于执行存储过程。每一个对象中都有许多对数据库的操作方法,常用的上面表中已经列出 ,不常用的可以看一下帮助文档。Statement对象就像ADO.NET中的Command对象,作用差不多,也提供各种操作数据库的方法。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值