JDBC Statements, PreparedStatement详解

学习Javaweb的同学都知道在与数据库进行交互的时候,首先都要连接数据库,而大多我们都使用JDBC连接数据库。
JDBC连接数据库大致分四步
第一步,导入JDBC包:使用Java语言的import语句在Java代码开头位置导入所需的类。
第二步,注册JDBC驱动程序:使JVM将所需的驱动程序实现加载到内存中,从而可以满足JDBC请求。
第三步,数据库URL配置:创建一个正确格式化的地址,指向要连接到的数据库(如:MySQL,Oracle等等)。
第四步,创建连接对象:最后,调用DriverManager对象的getConnection()方法来建立实际的数据库连接。

我们重点看看创建对象后与数据库交互的Statement和preparestatement

statement 和preparestatement 接口定义了可用于发送SQLSQL命令,并从数据库接收数据的方法和属性。

statement 用于对数据库进行通用访问,在运行时使用静态SQL语句时很有用。 Statement接口不能接受参数。

statement 实例

在使用Statement对象执行SQL语句之前,需要使用Connection对象的createStatement()方法创建一个Statement对象,如以下示例所示:

Statement stmt = null;
try {
   stmt = conn.createStatement( );
   . . . . .
}
catch (SQLException e) {
   . . . . .
}
finally {
   . . . . .
}

在创建Statement对象后,可以使用它来执行一个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语句一样。

注意,使用完后要关闭资源 stmt.close();

PreparedStatement 实例

preparestatement相比于statement添加了许多的功能 ,此语句可以接收动态的提供参数。

创建PreparedStatement对象
PreparedStatement pstmt = null;
try {
   String SQL = "Update student SET age = ? WHERE id = ?";
   pstmt = conn.prepareStatement(SQL);
   . . .
}
catch (SQLException e) {
   . . .
}
finally {
   . . .
}
JDBC中的所有参数都由 ? 符号作为占位符,这被称为参数标记。 在执行SQL语句之前,必须为每个参数(占位符)提供值。
setXXX()方法将值绑定到参数,其中XXX表示要绑定到输入参数的值的Java数据类型。 如果忘记提供绑定值,则将会抛出一个SQLException。
每个参数标记是它其顺序位置引用。第一个标记表示位置1,下一个位置2等等。 该方法与Java数组索引不同(它不从0开始)。
所有Statement对象与数据库交互的方法(a)execute(),(b)executeQuery()和©executeUpdate()也可以用于PreparedStatement对象。 但是,这些方法被修改为可以使用输入参数的SQL语句。

注意,使用完后也要关闭资源。
statement相比于preparestatement Preparestatement使用更普遍一些,所以我们演示一下Preparestatement。

import java.sql.*;

public class JDBCPreparedStatement {
   // JDBC 驱动民资和地址
   static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
   static final String DB_URL = "jdbc:mysql://localhost/demol";

   //  数据库密码和用户名
   static final String USER = "root";
   static final String PASS = "123456";

   public static void main(String[] args) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try{
      //注册驱动
      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 Employees set age=? WHERE id=?";
      stmt = conn.prepareStatement(sql);

      //为占位符赋值
      stmt.setInt(1, 35);  
      stmt.setInt(2, 102); 

      // 执行操作
      int rows = stmt.executeUpdate();
      System.out.println("Rows impacted : " + rows );

      //获取查询结果
      sql = "SELECT id, first, last, age FROM Employees";
      ResultSet rs = stmt.executeQuery(sql);

      //遍历结果集
      while(rs.next()){
         int id  = rs.getInt("id");
         int age = rs.getInt("age");
         String first = rs.getString("first");
         String last = rs.getString("last");

         System.out.print("ID: " + id);
         System.out.print(", Age: " + age);
         System.out.print(", First: " + first);
         System.out.println(", Last: " + last);
      }
      //关闭资源,记得先开的后关闭
      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!");
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值