【Java学习】JDBC的Statements

经过DriverManagerConnection,咱们得到了与数据库链接以后,咱们就要与数据库进行交互了,用Java语言与数据库进行交互就须要用到JDBC的Statement,CallableStatement,PreparedStatement
首先这些都是接口!不能由他们直接建立对象。这三个有不少的共同点。html

PreparedStatement 继承了Statement接口,至关于扩展了一些功能。java

建立对象

这三个在使用以前都须要Connection建立他们的对象。
虽然都是由Connection对象来调用方法来建立,可是他们的方法仍是不同的。mysql

如下 conn表明着数据库的链接sql

建立Statement对象:

conn.createStatement()数据库

值得注意的是,这个方法不接受任何参数。oracle

建立PreparedStatement

conn.preparedStatement(SQL)yii

这个SQL是预编译的语句,用?,来占位。例如:函数

String SQL = "Update Employees SET age = ? WHERE id = ?";

这个之后是经过setXXX()方法来进行输入的。若是忘记绑定,就会输出SQLException。
例如:setString(1,"0880");其中第一个参数是要填充的位置,从1开始,第二个是填充的值。code

建立CallableStatement对象

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;

能够发现这里面有三个参数类型,INOUTINOUT
首先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!");
    }

}

通过这个就很明了了。

执行SQL语句

建完以上的Statement对象、CallableStatement对象、PreparedStatement对象。咱们就须要经过他们执行Sql语句,和数据库进行交互了!!!

这三个大致是相同的。

Statement对象

三个方法:
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对象

因为PreparedStatement对象,在建立对象的过程当中就已经传入了sql语句,并经过SetXXX()方法传入了参数。因此Statemetn的三个方法对PreparedStatement都适用,而且都没有参数。execute() executeQuery() executeUpdate()

CallableStatement对象

暂时还不清楚,不过笔者认为,应该是使用excute()就能够了。

关闭链接

使用close()函数,便可。

参考资料

JDBC的Statement...

相关文章
相关标签/搜索