mysql学习14( PrepareStatement对象 以及 防止SQL注入攻击 )

mysql学习14

  • PrepareStatement对象:

    • 可以防止SQL注入,并且效率更高;

    • st.executeUpdate();

    • executeQuery();

 

  • 代码案例:

    • 新增:st.executeUpdate();


      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Connection;
      import java.util.Date;

      /**
      * 测试
      */
      public class JdbcDemo01 {

         public static void main(String[] args) {

             Connection conn =null;
             PreparedStatement st=null;
             ResultSet rs=null;

             try {
                 conn= JdbcUtils.getConnection();//获取连接

                 /**
                  * 区别:
                  * 1,使用? 占位符代替参数
                  * 2,
                  *
                  */
                 //"INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)VALUES('4','demo','123456','demo@sina.com','1980-12-04')";
                 String sql="INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`)VALUES(?,?,?,?,?)";
                 st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行

                 //手动给参数赋值
                 st.setInt(1,1);
                 st.setString(2,"demo");
                 st.setString(3,"111111");
                 st.setString(4,"demo@sina.com");
                 //注意点: sql.Date():数据库用的
                 //       util.Date():Java用的 new Date().getTime()获得时间戳
                 st.setDate(5,new java.sql.Date(new Date().getTime()));


                 //执行
                 int i=st.executeUpdate();
                 if(i>0){
                     System.out.println("插入成功");
                }

            } catch (SQLException e) {
                 e.printStackTrace();
            }finally {
                 JdbcUtils.release(conn,st,rs);
            }
        }
      }
    • 修改:st.executeUpdate();

      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;

      /**
      * 测试
      */
      public class JdbcDemo03 {
         public static void main(String[] args) {

             Connection conn =null;
             PreparedStatement st=null;
             ResultSet rs=null;

             try {
                 conn= JdbcUtils.getConnection();//获取连接

                 /**
                  * 区别:
                  * 1,使用? 占位符代替参数
                  *
                  */
                 //UPDATE `users` SET `NAME`='deo' WHERE id=4
                 String sql="UPDATE `users` SET `NAME`=? WHERE id=?";
                 st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行

                 //手动给参数赋值
                 st.setString(1,"dee");
                 st.setInt(2,4);

                 //执行
                 int i=st.executeUpdate();
                 if(i>0){
                     System.out.println("修改成功");
                }

            } catch (SQLException e) {
                 e.printStackTrace();
            }finally {
                 JdbcUtils.release(conn,st,rs);
            }

        }
      }
    • 删除:st.executeUpdate();

      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.util.Date;

      /**
      * 测试
      */
      public class JdbcDemo02 {
         public static void main(String[] args) {

             Connection conn =null;
             PreparedStatement st=null;
             ResultSet rs=null;

             try {
                 conn= JdbcUtils.getConnection();//获取连接

                 /**
                  * 区别:
                  * 1,使用? 占位符代替参数
                  *
                  */
                 String sql="delete from users where id =?";
                 st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行

                 //手动给参数赋值
                 st.setInt(1,1);

                 //执行
                 int i=st.executeUpdate();
                 if(i>0){
                     System.out.println("删除成功");
                }

            } catch (SQLException e) {
                 e.printStackTrace();
            }finally {
                 JdbcUtils.release(conn,st,rs);
            }
        }
      }

       

    • 查询:executeQuery();不传递参数

      package com.ljx.demo02;

      import com.ljx.demo01.utils.JdbcUtils;
      import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.sql.SQLException;

      /**
      * 测试
      */
      public class JdbcDemo04 {
         public static void main(String[] args) {


             Connection conn =null;
             PreparedStatement st=null;
             ResultSet rs=null;

             try {
                 conn= JdbcUtils.getConnection();//获取连接

                 /**
                  * 区别:
                  * 1,使用? 占位符代替参数
                  *
                  */
                 //select * from users
                 String sql="select * from users where id=?";
                 st=conn.prepareStatement(sql);//预编译SQL,先写SQL,然后不执行
                 //手动给参数赋值
                 st.setInt(1,4);
                 //执行
                 rs=st.executeQuery();//不传递参数

                 while (rs.next()){
                     System.out.println("name=:"+rs.getString("NAME"));
                     System.out.println("id=:"+rs.getInt("id"));
                     System.out.println("================");
                }
            } catch (SQLException e) {
                 e.printStackTrace();
            }finally {
                 JdbcUtils.release(conn,st,rs);
            }
        }
      }

       

 

  • PrepareStatement对象如何防止SQL注入:

    • 查询SQL匹配:st参数需要单独设置;

    • PrePareStatement防止SQL注入的本质,就是把传递进来的参数当作字符

    • 代码案例:


      /**
      * 测试SQL注入问题:
      */
      public class SQL注入 {
         public static void main(String[] args) {

             //login("dee","123456"); //正常登录
             login(" 'or '1=1"," 'or '1=1 ");//SQL注入

        }

         //登录
         public static void login(String username,String password){
             Connection conn =null;
             PreparedStatement st=null;
             ResultSet rs=null;

             try {
                 conn = JdbcUtils.getConnection();//获取连接
                 //sql需要改动
                 String sql="SELECT * FROM `users` where NAME=? and PASSWORD=?";//PrePareStatement防止SQL注入的本质,就是把传递进来的参数当作字符
                 st=conn.prepareStatement(sql);//预编译SQL,

                 //给预编译SQL赋值
                 st.setString(1,username);
                 st.setString(2,password);

                 rs=st.executeQuery();//执行

                 while (rs.next()){
                     System.out.println("password="+rs.getObject("PASSWORD"));
                     System.out.println("name="+rs.getObject("NAME"));
                     System.out.println("================================");
                }


            } catch (SQLException e) {
                 e.printStackTrace();
            }finally {
                 JdbcUtils.release(conn,st,rs);
            }
        }
      }

 

 

 

 

 

 

 

PreparedStatement 
posted @   gzs1024  阅读(181)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示