Statement、PreparedStatement 、CallableStatement 区别和联系

三者联系

  1. Statement、PreparedStatement和CallableStatement都是接口(interface)。
  2. Statement继承自Wrapper、PreparedStatement继承自Statement、CallableStatement继承自PreparedStatement。
  3. 三者功能特点:
    • Statement接口提供了执行语句和获取结果的基本方法;
    • PreparedStatement接口添加了处理 IN 参数的方法;
    • CallableStatement接口添加了处理 OUT 参数的方法。

Statement

Statement用于执行不带参数的简单SQL语句,并返回它所生成的结果,每次执行时,数据库都要编译该SQL语句。

PreparedStatement

表示预编译的SQL语句的对象,用于执行带参数的预编译的SQL语句,也可以不带参数。编译一次,执行多次,效率高; 安全性好,有效防止Sql注入等问题。

CallableStatement

提供了用来调用数据库中存储过程的接口,如果有输出参数要注册,说明是输出参数。继承自PreparedStatement,支持带参数的SQL操作。提供了对输出和输入/输出参数(IN/OUT)的支持。不同数据库的存储过程是不可移植的,因此CallableStatement面临移植性差问题。

Statement的使用

  1. 创建Statement对象
    java Statement stmt = connection.creatStatement();
  2. Statement常用方法
    • boolean execute(String sql) 返回boolean类型,在执行sql语句后,如果ResultSet检索到,则返回true,否则返回false。
    • int executeUpdate(String sql) 返回int类型,方法用于执行sql语句,将返回sql语句影响的行数。
    • ResultSet executeQuery(String sql) 执行sql语句,将返回结果集。用ResultSet实例化 result去接收返回集。
  3. 关闭
    java stmt.close(); // 关闭并释放资源。

PreparedStatement的使用

//连接数据库
String sql="insert into userInfo(username.password,gender,age) value(?,?,?,?)";
//可以传入参数
PreparedStatement ps=conn.prepareStatement(String sql);
//调用setXXX系列方法给问号赋值,下标从1开始,代表第一个问号
ps.setString(1,"name");
ps.setInt(2,123456);
ps.setString(3,"男");
ps.setInt(4,25);
//执行插入
ps.executeUpdate();
ps.close();
conn.close();
  1. 常用方法:
    • boolean execute() 在进行数据库或表的创建删除操作时使用。
    • ResultSet executeQuery() 数据查询时使用。
    • int executeUpdate() 数据的插入删除、修改时使用。
  2. 关闭
    java ps.close(); // 关闭并释放资源。

CallableStatement的使用

  1. 创建一个CallableStatement
    存储过程存在的三种参数:IN OUT INOUT
    • IN 创建SQL语句时其参数值是未知的。 使用setXXX()方法将值绑定到IN参数。
    • OUT 由SQL语句返回的参数值。可以使用getXXX()方法从OUT参数中检索值。
    • INOUT 提供输入和输出值的参数。使用setXXX()方法绑定变量并使用getXXX()方法检索值。
  2. 如果存储过程只是IN
    String sql="{call getEmpName (?, ?)}";
    //conn.prepareCall() 与conn.preparedStatement()功能一样
    CallableStatement cstmt=conn.prepareCall(sql);
    cstmt.setString(1,"aaa");
    cstmt.setInt(2,123);
    //发送参数,所有调用存储过程的sql语句都是使用executeQuery方法执行。
    ResultSet rs=cstmt.executeQuery();
    
  3. 如果存储过程是INOUT
    //第一个?是输入参数,第二个?是输出参数 
    String sql = "CALL pro_test2(?,?)"; 
    CallableStatement cstmt=conn.prepareCall(sql); 
    //设置输入参数 
    cstmt=setInt(1,5); 
    //设置输出参数,用registerOutParameter绑定 
    cstmt.registerOutParameter(2,java.sql.Types.VARCHAR); 
    //执行 
    cstmt.executeQuery(); 
    //根据?位置取得数据getXXX()方法只用于存储过程 
    String rs=cstmt.getString(2); 
    
  4. 关闭CallableStatement
    java cstmt.close();

批量查询

    // Statement的Batch使用:  
    Statement stmt  = conn.createStatement();  
    String sql = null;  
    for (int i = 0; i < 20; i++) {  
        sql = "insert into test(id, name)values(" + i + ", " + i + "_name)";  
        stmt.addBatch(sql);  
    }  
    stmt.executeBatch();  
       
    // PreparedStatement的Batch使用:  
    PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES  SET SALARY = ? WHERE ID =?");  
    for (int i = 0; i < length; i++) {  
        pstmt.setBigDecimal(1, param1[i]);  
        pstmt.setInt(2, param2[i]);  
        pstmt.addBatch();  
    }  
    pstmt.executeBatch();  
    ```

你可能感兴趣的:(Statement、PreparedStatement 、CallableStatement 区别和联系)