JDBC详解系列(四)之建立Stament和执行SQL语句
2018-01-12 12:30
417 查看
建立Stament
在获得连接之后,我们就可以跟数据库进行交互了。在JDBC中,我们发送SQL语句到数据库这些操作时通过Stament,Preparement,CallableStatement这几个对象进行的。
一.Stament
Stament是一个接口,其具体实现由供应商所提供。调用方法:Statement stmt = null; try { stmt = conn.createStatement( ); stmt.executeXXX(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
Stament对象执行静态SQL语句,并返回相应结果。因此,其不接收参数。在执行完毕之后务必将打开的连接关闭,这是一个好的习惯。
二.PreparedStatement
PreparedStatement 接口扩展了 Statement 接口,大多数情况下PreparedStatement 中的SQL语句已经被预编译过,因而当其执行时,只需DBMS运行SQL语句,而不必先编译。调用方法:PreparedStatement pstmt = null; try { String SQL = "Update Employees SET age = ? WHERE id = ?"; pstmt = conn.prepareStatement(SQL); pstmt .setXXX(); ... pstmt.executeXXX(); . . . } catch (SQLException e) { . . . } finally { . . . }
PreparedStatement在创建对象时对SQL进行了预编译。参数都被用 ? 符号表示,这是已知的参数标记。在执行 SQL 语句之前,必须赋予每一个参数确切的数值。通过setXXX()来设定参数,其中 XXX 表示你希望绑定到输入参数的 Java 数据类型。每个参数标记映射它的序号位置。第一标记表示位置 1 ,下一个位置为 2 等等。这种方法不同于 Java 数组索引,它是从 0 开始的。
三.CallableStatement
CallableStatement 对象是用来调用数据库的存储过程的。调用方法:CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt = conn.prepareCall (SQL); stmt.setInt(1, empID); stmt.registerOutParameter(2, java.sql.Types.VARCHAR); stmt.execute(); . . . } catch (SQLException e) { . . . } finally { . . . }
有三种类型的参数有:IN,OUT 和 INOUT。PreparedStatement 对象只使用 IN 参数。CallableStatement 对象可以使用所有的三个参数。CallableStatement 也是通过 setXXX() 方法绑定对应的 Java 数据类型。使用 OUT 和 INOUT 参数时,你就必须使用额外的 CallableStatement 方法 - registerOutParameter()。 registerOutParameter() 方法绑定 JDBC 数据类型,该数据是存储过程返回的值。CallableStatement 的 getXXX ()方法将获取返回的参数值,()内的参数与registerOutParameter相对应。
四.总结
存储过程使用的必然是CallableStatement了。而Stament和PreparedStament之间使用时还是需要有所取舍的。1.Stament不接受参数,其有可能会被SQL注入。但其开销比较小;每次执行SQL语句,数据库都要对SQL语句进行编译,从0开始执行。在只进行一次或少量查询并返回结果时,其效率高于PreparedStament。但无法防止SQL注入。
2.PreparedStatement是预编译的,当执行时,DBMS只需要运行SQL语句,而无需先编译再执行。所以当在我们处理批量的时候,使用PreparedStatement可以大大的提高效率。同时,也可以防止SQL注入。
3.虽然Stament在数量少时进行SQL语句开销小,但其存在SQL注入的问题。因此,我们在用户可以更改SQL输入的地方,如WEB等,应该使用PreparedStatement。任何不经过PreparedStatement处理的情况下,用户的所有输入都不应该传递给SQL语句。
执行SQL语句
我们可以查看Stement接口的方法:我们可以看到总共就三种类型:
方法 | 作用 |
---|---|
execute() | 主要在存储过程和动态SQL语句中使用 |
executeUpdate() | 对应INSERT,UPDATE 或 DELETE 语句 |
executeQuery() | 对应SELECT,查询专用 |
相关文章推荐
- JDBC详解系列(四)之建立Stament和执行SQL语句
- JDBC系列:(3)使用PreparedStatement执行sql语句
- com.microsoft.sqlserver.jdbc.SQLServerException: 必须执行该语句才能获得结果
- JDBC学习笔记(四):执行SQL语句(Statement与PreparedStatement)
- 如何获取某个sql语句的执行计划系列三---格式化trace 文件
- JDBC PreparedStatement高级特性:批量执行sql语句
- SQL语句执行过程详解
- 使用sql语句建立与删除链接服务器及执行数据库操作
- JDBC之执行SQL语句
- SQL语句执行过程详解
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题
- MySQL执行SQL语句过程详解
- 如何在MyEclipse中建立sql文件,并执行语句?
- JDBC中执行多个SQL语句事例
- 关于No Dialect mapping for JDBC type :-9 hibernate执行原生sql语句问题
- java基础巩固---jdbc接口PreparedStatement执行sql语句
- [疯狂Java]JDBC:PreparedStatement预编译执行SQL语句
- 使用JDBC连接数据库并且调用存储过程和执行SQL语句
- PowerDesigner15在win7-64位系统下对MySQL 进行反向工程以及建立物理模型产生SQL语句步骤图文傻瓜式详解
- SQL语句执行过程详解