经过DriverManager
的Connection
,咱们得到了与数据库链接以后,咱们就要与数据库进行交互了,用Java语言与数据库进行交互就须要用到JDBC的Statement
,CallableStatement
,PreparedStatement
首先这些都是接口!不能由他们直接建立对象。这三个有不少的共同点。html
PreparedStatement 继承了Statement接口,至关于扩展了一些功能。java
这三个在使用以前都须要Connection
建立他们的对象。
虽然都是由Connection对象来调用方法来建立,可是他们的方法仍是不同的。mysql
如下 conn
表明着数据库的链接sql
conn.createStatement()
数据库
值得注意的是,这个方法不接受任何参数。oracle
conn.preparedStatement(SQL)
yii
这个SQL是预编译的语句,用?
,来占位。例如:函数
String SQL = "Update Employees SET age = ? WHERE id = ?";
这个?
之后是经过setXXX()
方法来进行输入的。若是忘记绑定,就会输出SQLException。
例如:setString(1,"0880");
其中第一个参数是要填充的位置,从1开始,第二个是填充的值。code
Callable对象用于执行对数据库存储过程的调用
关于存储过程的相关信息,在另外一篇文章中,虽然没有彻底理解,可是仍是有必定的认识的。
如下代码片断显示了如何建立一个CallableStatement
对象。htm
CallableStatement cstmt = null; try { String strSQL - "{call getEmpName (?,?)}"; cstmt = conn.prepareCall(strSQL); ... } catch (SQLException e) { ... } finally { ... }
这其中,strSQL
表明的是存储过程,带有两个参数占位符。CallableStatement
对象和PreparedStatement
对象同样,在执行语句以前,必须将值绑定到全部参数,不然将跑出一个SQLException
异常。
看一下oracle存储过程:
CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END;
能够发现这里面有三个参数类型,IN
和OUT
和INOUT
首先PreparedStatement对象只是用IN
参数
Callable可使用上面三个参数类型。
更加详细的:
IN:建立SQL语句时其参数值是未知的,使用setXXX()方法将值绑定到IN参数。
OUT:由SQL语句返回的参数值,可使用getXXX()方法从OUT参数中检索值。
INOUT:提供输入和输出的参数。使用setXXX()
方法绑定变量并使用getXXX()方法检索值。
见了上面的三个类型。
【实例】使用CallableStatement的示例。
确保在EMP
数据库中建立了getEmpName()存储过程,可使用Mysql查询来建立。
DELIMITER $$ DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$ CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255)) BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END $$ DELIMITER ;
查询emp数据库的全部存储过程,以下语句:
mysql> select `name` from mysql.proc where db = 'emp' and `type` = 'PROCEDURE'; +------------+ | name | +------------+ | getEmpName | +------------+ 1 row in set (0.00 sec)
而后再编写JDBC代码:
//1. 导包 import java.sql.*; public class JDBCCallableStatement{ //数据库驱动和URL static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EMP"; //数据库用户名和密码 static final String USER = "root"; static final String PASD = "123456"; public static void main(String[] args){ //建立两个对象 Connnection、和 CallableStatement Connection conn = null; CallableStatement stmt = null; //注册驱动(注意跑出错误) try{ Class.forName(JDBC_DRIVER); System.out.println("链接数据库中。。。"); //打开链接 conn = DriverManager.getConnection(DB_URL,USER,PASS); //建立statement对象 String sql = "{call getEmpName(?,?)}"; stmt = conn.prepareCall(sql); //先绑定IN参数,而后绑定OUT参数 int empID = 102; stmt.setInt(1,empID);//将ID设置成102 //由于第二个参数是OUT,因此用register它。 stmt.registerOutParameter(2,java.sql,Types.VARCHAR); //使用excute方法去存储过程 System.out.println("Executing stored procedure"); stmt.execute();//由于在存储过程当中有相应的sql语句,因此至关于给存储过程传入参数后就不须要在为stmt传入参数了。 //执行完毕后,亚欧使用getXXX方法,接收employee name String empName = stmt.getString(2); System.out.println("Emp Name with ID:" + empID+ "is " + empName); //关闭链接。 stmt.close(); conn.close(); }catch (SQLException se){ //se.printStackTrace(); }catch (Exception e){ e.printStackTrace(); }finally{ //最后关闭资源 try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }//什么都作不了 try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } System.out.println("GoodBye!"); } }
通过这个就很明了了。
建完以上的Statement对象、CallableStatement对象、PreparedStatement对象。咱们就须要经过他们执行Sql语句,和数据库进行交互了!!!
这三个大致是相同的。
三个方法:boolean execute (String SQL)
: 若是能够检索到ResultSet对象,则返回一个布尔值true; 不然返回false。使用此方法执行SQLDDL语句或须要使用真正的动态SQL,可以使用于执行建立数据库,建立表的SQL语句等等。
int executeUpdate (String SQL)
: 返回受SQL语句执行影响的行数。使用此方法执行预期会影响多行的SQL语句,例如:INSERT,UPDATE或DELETE语句。
ResultSet executeQuery(String SQL)
:返回一个ResultSet对象。 当您但愿得到结果集时,请使用此方法,就像使用SELECT语句同样。
因为PreparedStatement对象,在建立对象的过程当中就已经传入了sql语句,并经过SetXXX()方法传入了参数。因此Statemetn
的三个方法对PreparedStatement
都适用,而且都没有参数。execute()
executeQuery()
executeUpdate()
暂时还不清楚,不过笔者认为,应该是使用excute()
就能够了。
使用close()
函数,便可。