• JDBC占位符


    占位符的使用

    Statement 接口的两个问题:
      第一个问题: 使用 Statement 接口 对象发送的 sql 语句需要再数据库进行一次编译之后成为指令才能执行,
                每条 sql 语句都需要编译一次, 这样是很慢的.
      第二个问题: 使用 Statement 接口 操作的 sql 语句需要使用字符串的拼接方式实现,
              这样的方式可能存在 sql 注入的安全风险并且拼接字符串比较麻烦.

    对比 Statement 接口, PreparedStatement 接口的优点:
      1.使用该接口操作的 sql 语句会先预先编译成指令在发送给数据库, 数据库就执行指令即可, 这样就提高了一定速度,
      2.该接口可以避开 sql 需要使用字符串拼接的方式, 从而解决 sql 注入的安全风险,
      而是使用 占位符 (?) 来代替原来的字符串拼接.

    Demo:实现无密码登录
    不使用 sql 字符串拼接, 而是使用占位符来实现

     1 public class TestMysql1 {
     2     //取得连接
     3     private static Connection conn =ConnectionUitl.getConnection();
     4     
     5     public static void main(String[] args) {
     6         selectLogin("smith","1234");
     7     }
     8     /**
     9      *     实现登录
    10      * @param name    用户名
    11      * @param password    密码
    12      * @return
    13      */
    14     public static boolean selectLogin(String name, String password) {
    15         String sql = "SELECT * FROM myuser WHERE username=? AND password=?";
    16         System.out.println(sql);
    17         
    18         try {
    19             PreparedStatement pst = conn.prepareStatement(sql);
    20             //为占位符设置具体内容
    21             pst.setString(1, name);
    22             pst.setString(2, password);
    23             //发送 sql 语句
    24             ResultSet rst = pst.executeQuery();
    25             if (rst.next()) {
    26                 System.out.println("登录成功!");
    27             } else {
    28                 System.out.println("用户名或密码错误!");
    29             }
    30         } catch (SQLException e) {
    31             e.printStackTrace();
    32         }
    33         return false;
    34     }
    35 }

    Demo: 插入数据 (使用占位符)

     1 public class TestMysql2 {
     2     //取得连接
     3     private static Connection conn =ConnectionUitl.getConnection();
     4     
     5     public static void main(String[] args) {
     6         Emp emp = new Emp();
     7         emp.setEmpno(1009);
     8         emp.setEname("李四");
     9         emp.setJob("职员");
    10         emp.setMgr(8965);
    11         emp.setSal(10.00);
    12         emp.setComm(900.0);
    13         emp.setHiredate(new Date());
    14         emp.setDeptno(40);
    15         System.out.println(insertEmp(emp));
    16     }
    17     /**
    18      *     插入雇员信息的方法
    19      * @return
    20      */
    21     public static int insertEmp(Emp emp) {
    22         //定义出 sql 语句
    23         String sql = "INSERT INTO emp(empno,ename,job,sal,hiredate,mgr,comm,deptno)"
    24                 +" VALUES(?,?,?,?,?,?,?,?)";
    25         
    26         try {
    27             //使用连接对象取得发送 sql 语句的对象 (PreparedStatement 接口对象)
    28             PreparedStatement pst = conn.prepareStatement(sql);
    29             //设置占位符的内容
    30             pst.setInt(1, emp.getEmpno());
    31             pst.setString(2,emp.getEname());
    32             pst.setString(3,emp.getJob());
    33             pst.setDouble(4,emp.getSal());
    34             pst.setDate(5,new java.sql.Date(emp.getHiredate().getTime()));
    35             pst.setInt(6,emp.getMgr());
    36             pst.setDouble(7,emp.getComm());
    37             pst.setInt(8,emp.getDeptno());
    38             //执行 sql 语句
    39             return pst.executeUpdate();
    40         } catch (SQLException e) {
    41             e.printStackTrace();
    42         } finally {
    43             ConnectionUitl.close(conn);
    44         }
    45         return 0;
    46     }
    47 }
  • 相关阅读:
    用Python发生RestFul API POST和GET请求
    C# 8.0中的新功能
    A股数据分析之收集数据:股票列表和股价
    A股数据分析之收集数据:公司详细信息
    VS 2019中修改C#语言版本
    Weak Event Manager
    在WPF中使用MVVM的方式关闭窗口
    C# GDI绘制仪表盘(纯代码实现)
    C#中实现文件拖放打开的方法
    C#设置自定义文件图标实现双击启动
  • 原文地址:https://www.cnblogs.com/yslf/p/10731951.html
Copyright © 2020-2023  润新知