Java JDBC 理论笔记(二)

来源:互联网 发布:投资者评估数据库 编辑:程序博客网 时间:2024/04/30 06:02

原:http://hi.baidu.com/zero_spy/ 2011-11-05

三、JDBC执行SQL语句

1、 executeUpdate执行DDL、DML语句 

Statement提供了execute、executeUpdate、executeQuery三种方法执行,下面用executeUpdate来执行DDL、DML语句,executeUpdate执行DDL返回值是0,执行了DML是返回影响后的记录条数。

2、 execute执行SQL语句 

当我们知道SQL语句是完成修改语句时,我们就知道使用executeUpdate语句来完成操作;如果SQL语句是完成查询操作的时候,我们就使用executeQuery来完成。如果我们不知道SQL语句完成什么操作的时候,就可以使用execute方法来完成。当我们使用Statement对象的execute方法执行SQL语句后返回的是boolean值,这就说明该语句能否返回ResultSet对象。那么,如何判断是否是ResultSet对象?方法如下:getResultSet():获取该Statement执行查询语句返回的ResultSet对象getUpdateCount():获取该Statement执行修改语句影响的行数

3、 PrepareStatement执行SQL语句 

对于我们操作数据库的时候,执行某一条SQL语句的时候。只有它的参数不同,而SQL语句相同。我们可以使用占位符来设置我们的参数信息,PrepareStatement中的占位符是?,用?代替参数的位置。insert into table values(?, ‘abc’, ?);占位符仅仅支持PrepareStatement,而Statement不支持占位符。PrepareStatement是预编译SQL语句的,然后将占位符替换成参数。而Statement就不能做到。 PrepareStatement对象也有execute、executeUpdate、executeQuery这三个方法,但这三个方法都无需传递参数。只需用PrepareStatement来设置占位符的参数,通过用setXxxx(index, value)来完成设置参数信息即可。PrepareStatement的效率要比Statement的效率高。PrepareStatement设置参数可以不拼接字符串,而Statement设置参数信息的时候需要手动拼接字符串。拼接字符串容易操作程序错误、可读性降低、维护性升高、程序性能下降。而PrepareStatement直接设置参数信息就降低了编程的复杂度。并且它可以放在SQL注入。因为它是通过setXxx方法进行设置参数信息,而Statement是通过拼接字符串,很容易就造成SQL注入。 综上所述,PrepareStatement比Statement有以下优点:预编译SQL语句,性能更好无需拼接SQL语句,编程更简单可以防止SQL语句注入,安全性更好

4、 CallableStatement调用存储过程 

存储过程的调用可以通过CallableStatement,通过Connection对象的prepareCall方法来创建CallableStatement对象。然后传入存储过程的SQL语句,即可调用存储过程,格式如下:{call proc_name(?, ?, ?)}上面的?是占位符,表示传递的参数。存储过程有传入参数、传出参数。传入参数是程程序必须传入的参数,可以 通过setXxx方法进行设置参数值。而传出参数则需要通过程序进行设置,可以用CallableStatement对象的registerOutParameter方法来注册输出参数,cs.registerOutParameter(3, Types.STRING);设置完毕后,当调用存储过程后要获取输出参数值,可以通过getXxx方法来完成。四、操作结果集(ResultSet)

JDBC是通过ResultSet来管理结果集,操作ResultSet可以通过移动其指针来指向不同的行记录,然后取出当前记录即可。并且ResultSet可以完成更新记录,还提供了ResultSetMetaData来获得对象相关信息。 

1、 可移动、可更新的ResultSet 

前面介绍过ResultSet的相关方法,可以通过一系列的方法来移动记录指针,如:absolute、previous、next、first、last、beforeFirst、afterLast等方法。ResultSet默认是不支持更新的,如果希望ResultSet完成更新操作,必须在创建Statement或PrepareStatement时传入一些参数。Connection对象在创建Statement或PrepareStatement时可以传入两个参数:A、 resultSetType:控制ResultSet的类型,该参数有以下三个值:    a、 ResultSet.TYPE_FORWARD_ONLY该常量控制记录指针只能向前移动。Jdk1.4的默认值    b、 ResultSet.TYPE_SCROLL_INSENSITIVE:该常量控制记录指针自由移动(可滚动结果集),        但底层的数据改变不影响结果集ResultSet的内容    c、 ResultSet.TYPE_SCROLL_SENSITIVE:该常量控制记录指针自由移动,但底层数据的影响会改变结果集ResultSet的内容B、 resultSetConcurrency:控制ResultSet的并发类型,该参数可以接收如下两个值:    a、 ResultSet.CONCUR_READ_ONLY:该常量表示ResultSet是只读并发模式    b、 ResultSet.CONCUR_UPDATABLE:该常量表示ResultSet是更新并发模式通过PrepareStatement、Statement的创建时进行参数设置来创建可滚动、可更新的ResultSet,然后通过rs的updateXxx方法来完成某列的更新值设置,通过updateRow来提交修改。

2、 ResultSet中的二进制Blob数据处理 

Blob类型通常用来存储文件,如:图片、音频、视频文件。将文件转换成二进制保存在数据库中,取出来的时候可以二进制数据恢复成文件。如果要插入图片到数据库,显然不能直接设置SQL参数拼接字符串进行插入。因为二进制常量无法表示。但是将Blob类型数据插入到数据可以用PrepareStatement,通过PrepareStatement对象的setBinaryStatement方法将参数传入到二进制输入流;也可以用Blob对象的getBytes方法直接取出数据。

3、 利用ResultSetMetaData操作ResultSet结果集 

在我们查询数据返回的结果集中,我们不清楚结果集存放的数据类型、数据列数。那样我们就可以用ResultSetMetaData来读取ResultSet的信息。通过ResultSet的getMetaData()的方法可以获取ResultSetMetaData对象。然后可以用ResultSetMetaData对象的方法来操作ResultSet,常用方法如下:int getColumnCount():返回ResultSet的列名数量int getColumnType(int column):返回指定索引的类型String getColumnName(int column):返回指定索引的列名