注意:其中的JdbcUtil是我自定义的连接工具类:
package day03.prepare;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import util.JdbcUtil;/** * 关于preparedStatement的案例 * 因为PreparedStatement是继承自statement的; * 同样preparedStatement也可以执行statement中的方法,那些直接拼接,或者直接输入值的 * 但是这样预编译就没有作用了 * * * @author mzy * */public class Demo01 { public static void main(String[] args) { // insert(); // update(); // delete(); select(); } private static void select() { PreparedStatement pstmt = null; Connection conn = null; ResultSet rs = null; // 准备sql String sql = "select * from student where id = ?"; try { // 获取连接 conn = JdbcUtil.getConnection(); pstmt = conn.prepareStatement(sql); // 预编译的作用就是权限和sql语法的检查 pstmt.setInt(1, 10); // id rs = pstmt.executeQuery(); while(rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println(id+", "+name+", "+age); } } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(rs, pstmt, conn); // 关闭Statement的,也支持关闭PreparedStatement } } private static void delete() { // 同 update、insert } private static void update() { PreparedStatement pstmt = null; Connection conn = null; // 准备sql /* * MySQLSyntaxErrorException * String sql = "update ? set name = '乘成' where id = ?"; * * 注意:在预编译的时候,只允许用 ? 占位的地方为参数值(即:等号后面的内容等) * 不能是表名或者其他关键字,不然就会出现:MySQLSyntaxErrorException异常 * 此异常就是代表sql语句有错,在预编译的时候抛出(预编译的作用就是检测语法和权限) * 理解了预编译的检测语法作用,就知道该传入什么样的参数了。 */ String sql = "update student set name = '乘成' where id = ?"; try { // 获取连接 conn = JdbcUtil.getConnection(); // 是connection去prepare一个Statement 给我们的PreparedStatement // 和我们的statement不同,这个prepare的时候是预编译,就要把sql传进去了 // 其中的? 作为占位符 pstmt = conn.prepareStatement(sql); // 预编译的作用就是权限和sql语法的检查 // 在预编译之后,需要执行之前给参数赋值,放在pstmt中 /* * 参数一:位置(从1开始) * 参数二:具体的参数值 */ pstmt.setInt(1, 2); // id // 传入参数之后,再进行执行 int count = pstmt.executeUpdate(); System.out.println(count+"行受影响"); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(pstmt, conn); // 关闭Statement的,也支持关闭PreparedStatement // 因为 Statement是 PreparedStatement的子类 } } private static void insert() { PreparedStatement pstmt = null; Connection conn = null; // 准备sql String sql = "insert into student value(?, ?, ?)"; try { // 获取连接 conn = JdbcUtil.getConnection(); // 是connection去prepare一个Statement 给我们的PreparedStatement // 和我们的statement不同,这个prepare的时候是预编译,就要把sql传进去了 // 其中的? 作为占位符 pstmt = conn.prepareStatement(sql); // 预编译的作用就是权限和sql语法的检查 // 在预编译之后,需要执行之前给参数赋值,放在pstmt中 /* * 参数一:位置(从1开始) * 参数二:具体的参数值 */ pstmt.setInt(1, 10); // id pstmt.setString(2, "陈六"); // name pstmt.setInt(3, 20); // age // 传入参数之后,再进行执行 int count = pstmt.executeUpdate(); System.out.println(count+"行受影响"); } catch (SQLException e) { e.printStackTrace(); } finally { JdbcUtil.close(pstmt, conn); // 关闭Statement的,也支持关闭PreparedStatement // 因为 Statement是 PreparedStatement的子类 } }}