MySQL数据库干货_27——PreparedStatement的使用(重点)

PreparedStatement的使用(重点)

PreparedStatement对象简介

继承自 Statement 接口,由 preparedStatement方法创建。PreparedStatement具有预编译SQL语句能力,所以PreparedStatement 对象比 Statement 对象的效率更高,由于实现了动态的参数绑定,所以可以防止 SQL 注入,所以我们一般都使用 PreparedStatement。

PreparedStatement对象的特点:

  • PreparedStatement 接口继承 Statement 接口
  • PreparedStatement 效率高于 Statement
  • PreparedStatement 支持动态绑定参数
  • PreparedStatement 具备 SQL 语句预编译能力
  • 使用 PreparedStatement 可防止出现 SQL 注入问题

PreparedStatement 的预编译能力

语句的执行步骤

  • 语法和语义解析
  • 优化 sql 语句,制定执行计划
  • 执行并返回结果

但是很多情况,我们的一条 sql 语句可能会反复执行,或者每次执行的时候只有个别的值不同(比如 select 的 where 子句值不同,update 的 set 子句值不同,insert 的 values 值不同)。 如果每次都需要经过上面的词法语义解析、语句优化、制定执行计划等,则效率就明显不行 了。所谓预编译语句就是将这类语句中的值用占位符替代,可以视为将 sql 语句模板化或者说参数化预编译语句的优势在于:一次编译、多次运行,省去了解析优化等过程;此外预编译语 句能防止 sql 注入

通过PreparedStatement添加数据

/**
 * PreparedStatement使用的测试类
 */
public class PreparedStatementTest {
  /**
   * 添加用户
   */
  public void insertUsers(String username,int userage){
    Connection connection = null;
    PreparedStatement ps = null;
    try{
      //获取数据库连接
      connection = JdbcUtils.getConnection();
      //定义Sql。?是PreparedStatement对象中的绑定参数的占位符。问号的位置是从1开始计数的
      String sql = "insert into users values(default,?,?)";
      //创建PreparedStatement对象
      ps = connection.prepareStatement(sql);
      //完成参数的绑定
      ps.setString(1,username);
      ps.setInt(2,userage);
      int i = ps.executeUpdate();
      System.out.println(i);
     }catch(Exception e){
      e.printStackTrace();
     }finally{
      JdbcUtils.closeResource(ps,connection);
     }
   }
}

通过PreparedStatement修改数据

/**
     * 通过PreparedStatement对数据库表更新数据
     */
    public void updateByUserId(int userid,String username,int userage){
        Connection connection=null;
        PreparedStatement preparedStatement=null;
        try{
            //获取数据库连接
            connection=JdbcUtils.getConnection();
            //获取PreparedStatement对象
            preparedStatement=connection.prepareStatement("update users set userName=?,userAge=? where userid=?");
            //对参数进行动态绑定
            preparedStatement.setString(1,username);
            preparedStatement.setInt(2,userage);
            preparedStatement.setInt(3,userid);
            //执行sql语句
            int i = preparedStatement.executeUpdate();
            System.out.println(i);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JdbcUtils.closeResource(preparedStatement,connection);
        }
    }

通过PreparedStatement删除数据

 /**
   * 根据用户ID删除指定用户
   */
  public void deleteUsersById(int userid){
      Connection conn = null;
      PreparedStatement ps = null;
    try{
      //获取数据库连接对象
      conn = JdbcUtils.getConnection();
      //创建PreparedStatement对象
      ps = conn.prepareStatement("delete from users where userid = ? ");
      //绑定参数
      ps.setInt(1,userid);
      int i = ps.executeUpdate();
      System.out.println(i);
     }catch (Exception e){
      e.printStackTrace();
     }finally{
      JdbcUtils.closeResource(ps,conn);
     }
   }

posted @ 2023-11-14 08:50  Gjq-  阅读(83)  评论(0编辑  收藏  举报  来源