SQLyog基本操作(十五)-PreparedStatement对象测试insert、delete、update、select、解决SQL注入问题

10.7 PreparedStatement对象

  可以防止SQL注入问题,效率高,本质:把传递进来的参数当做字符。

10.7.1 测试insert

 package com.study.lesson;
 
 import utils.JdbcUtils;
 
 import java.sql.Connection;
 import java.util.Date;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 
 /**
  * 测试insert
  */
 public class JdbcDemo07 {
     public static void main(String[] args) {
         //属性信息
         Connection cn = null;
         PreparedStatement ps = null;
         try {
             //连接驱动,获取数据库
             cn= JdbcUtils.getConnection();
 
             //使用?占位符代替参数
             String sql = "INSERT INTO `users`(`id`,`name`,`password`,`email`,`birthday`)" +
                     "VALUES(?,?,?,?,?)";
 
             //预编译SQL,先写sql,然后不执行
             ps = cn.prepareStatement(sql);
 
             //手动给参数赋值
             ps.setInt(1,4);
             ps.setString(2,"zhuangzhuang");
             ps.setString(3,"159357");
             ps.setString(4,"159357@qq.com");
             /**
              * 注意点:sql.Date 数据库
              *       util.Date Java
              *       new Date().getTime()获取时间戳
              */
             ps.setDate(5,new java.sql.Date(new Date().getTime()));
 
             //执行
             int i = ps.executeUpdate();
             if(i>0){
                 System.out.println("插入成功!");
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(cn,ps,null);
        }
    }
 }
 

输出结果:效果同上

10.7.2 测试delete

 package com.study.lesson;
 
 import utils.JdbcUtils;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 import java.util.Date;
 
 /**
  * 测试delete
  */
 public class JdbcDemo08 {
     public static void main(String[] args) {
         //属性信息
         Connection cn = null;
         PreparedStatement ps = null;
         try {
             //连接驱动,获取数据库
             cn= JdbcUtils.getConnection();
 
             //使用?占位符代替参数
             String sql = "DELETE FROM `users` WHERE `id` = ?";
 
             //预编译SQL,先写sql,然后不执行
             ps = cn.prepareStatement(sql);
 
             //手动给参数赋值
             ps.setInt(1,4);
 
             //执行
             int i = ps.executeUpdate();
             if(i>0){
                 System.out.println("删除成功!");
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(cn,ps,null);
        }
    }
 }
 

输出结果:效果同上

10.7.3 测试update

 package com.study.lesson;
 
 import utils.JdbcUtils;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
 
 /**
  * 测试update
  */
 public class JdbcDemo09 {
     public static void main(String[] args) {
         //属性信息
         Connection cn = null;
         PreparedStatement ps = null;
         try {
             //连接驱动,获取数据库
             cn= JdbcUtils.getConnection();
 
             //使用?占位符代替参数
             String sql = "UPDATE `users` SET `password`=? WHERE `id`=?;";
 
             //预编译SQL,先写sql,然后不执行
             ps = cn.prepareStatement(sql);
 
             //手动给参数赋值
             ps.setString(1,"222222");
             ps.setInt(2,1);
 
             //执行
             int i = ps.executeUpdate();
             if(i>0){
                 System.out.println("更新成功!");
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(cn,ps,null);
        }
    }
 }
 

输出结果:效果同上

10.7.4 测试select

 package com.study.lesson;
 
 import utils.JdbcUtils;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
 /**
  * 测试select
  */
 public class JdbcDemo10 {
     public static void main(String[] args) {
         //属性信息
         Connection cn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         try {
             //连接驱动,获取数据库
             cn= JdbcUtils.getConnection();
 
             //使用?占位符代替参数
             String sql = "SELECT * FROM `users` WHERE `id`=?";
 
             //预编译SQL,先写sql,然后不执行
             ps = cn.prepareStatement(sql);
 
             //手动给参数赋值
             ps.setInt(1,1);
 
             //执行
             rs = ps.executeQuery();
             while (rs.next()){
                 System.out.println(rs.getString("name"));
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             JdbcUtils.release(cn,ps,rs);
        }
    }
 }
 

输出结果:效果同上

10.7.5 解决SQL注入问题

 package com.study.lesson;
 
 import utils.JdbcUtils;
 
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
 /**
  * 解决sql注入问题
  */
 public class JdbcDemo11 {
     public static void main(String[] args) {
         //login("lisi","123456");//正常情况下,当用户名和密码输入正确后,输出用户信息
         //存在是SQL注入问题时,用户名或密码任一输入or'1=1,均会输出所有用户信息,导致信息泄露
 
         //使用PreparedStatement可解决SQL注入问题
         //login("'or'1=1","123456");
         //login("lisi","'or'1=1");
         login("'or'1=1","'or'1=1");
    }
     public static void login(String username,String password){
         //属性信息
         Connection cn = null;
         PreparedStatement ps = null;
         ResultSet rs = null;
         try {
             //获取数据库
             cn = JdbcUtils.getConnection();
             //PreparedStatement防止SQL注入的本质:把传递进来的参数当做字符
             //假设其中存在转义字符,比如说‘会被直接转义
             //SQL语句
             String sql ="SELECT * FROM `users` WHERE `name`= ? AND `password`= ? ";
             //创建PrepareStatement对象,预编译sql语句
             ps = cn.prepareStatement(sql);
             //指定内容
             ps.setString(1,username);
             ps.setString(2,password);
             //获取结果集
             rs = ps.executeQuery();
             //判断是否含有下一个元素
             while (rs.next()){
                 System.out.println(rs.getString("name"));
                 System.out.println(rs.getString("password"));
                 System.out.println();
            }
        } catch (SQLException e) {
             e.printStackTrace();
        } catch (Exception e){
             e.printStackTrace();
        } finally {
             //释放连接资源
             JdbcUtils.release(cn,ps,rs);
        }
    }
 }
 

输出结果:正常输入时,可得到结果;不满足要求时,无输出结果。

 

posted @ 2021-07-14 21:59  Coder_Cui  阅读(495)  评论(0编辑  收藏  举报