通过使用 JDBC Statement, CallableStatement 和 PreparedStatement 接口定义的方法和属性,使可以使用 SQL 或 PL/SQL 命令和从数据库接收数据。
接口 | 应用场景 |
---|---|
Statement | 当在运行时使用静态 SQL 语句时(Statement 接口不能接收参数) |
CallableStatement | 当要访问数据库中的存储过程时(CallableStatement 对象的接口还可以接收运行时输入参数) |
PreparedStatement | 当计划多次使用 SQL 语句时(PreparedStatement 接口接收在运行时输入参数) |
1.使用statement
第一步肯定是创建一个 Statement 对象了。我们需要使用 Connection 对象的 createStatement() 方法进行创建。
statement方法:
方法 | 说明 |
---|---|
boolean execute(String SQL) | 如果 ResultSet 对象可以被检索返回布尔值 true,否则返回 false。使用这个方法来执行 SQL DDL 语句,或当需要使用真正的动态 SQL |
int executeUpdate(String SQL) | 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQLDDL(数据定义语言)语句。返回值是一个整数,指示受影响的行数(即更新计数) |
ResultSet executeQuery(String SQL) | 返回 ResultSet 对象。用于产生单个结果集的语句,例如 SELECT 语句 |
例子:
import java.sql.*; public class JdbcTest { // JDBC 驱动器的名称和数据库地址 static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost/EXAMPLE"; static final String USER = "root"; static final String PASS = "";这里为自己的sql的密码 public static void main(String[] args) { Connection conn = null; PreparedStatement stmt = null; try{ //注册 JDBC 驱动器 Class.forName("com.mysql.jdbc.Driver"); //打开连接 System.out.println("Connecting to database..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); //执行查询 System.out.println("Creating statement..."); //这里我们要更改一个同学的年龄,参数待定 String sql = "UPDATE Students set age=? WHERE id=?"; stmt = conn.prepareStatement(sql); //将值绑定到参数,参数从左至右序号为1,2... stmt.setInt(1, 22); // 绑定 age 的值(序号为1) stmt.setInt(2, 1); // 绑定 ID 的值 // 更新 ID 为1的同学的年龄 int rows = stmt.executeUpdate(); System.out.println("被影响的行数 : " + rows ); // 查询所有记录,并显示. sql = "SELECT id, name, age FROM Students"; ResultSet rs = stmt.executeQuery(sql); //处理结果集 while(rs.next()){ //检索 int id = rs.getInt("id"); int age = rs.getInt("age"); String name = rs.getString("name"); //显示 System.out.print("ID: " + id); System.out.print(", Age: " + age); System.out.print(", Name: " + name); System.out.println(); } //清理 rs.close(); 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!"); } }
2.PreparedStatement和CallableStatement
三种类型的参数有:IN,OUT 和 INOUT。
PreparedStatement 对象只使用 IN 参数。
CallableStatement 对象可以使用所有三个
参数 | 描述 |
---|---|
IN | 它的值是在创建 SQL 语句时未知的参数,将 IN 参数传给 CallableStatement 对象是通过 setXXX() 方法完成的 |
OUT | 其值由它返回的 SQL 语句提供的参数。从 OUT 参数的 getXXX() 方法检索值 |
INOUT | 同时提供输入和输出值的参数,绑定的 setXXX() 方法的变量,并使用 getXXX() 方法检索值 |
在 JDBC 中调用存储过程的语法如下所示。注意,方括号表示其间的内容是可选项;方括号本身并不是语法的组成部份。
返回结果参数的过程的语法为:
{? = call 存储过程名[(?, ?, ...)]}
不带参数的存储过程的语法类似:
{call 存储过程名}
创建结果集
try { Statement stmt = conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE,
游标可以向前和向后滚动,但不及时更新,就是如果数据库里的数据修改过,并不在 ResultSet 中反应出来 |
ResultSet.CONCUR_UPDATABLE); } catch(Exception ex) { .... } finally { .... }