zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    AS将一个项目导入到另一个项目中
    Android Studio出现:Cause: unable to find valid certification path to requested target
    小米手机Toast带app名称
    PopupWindow 点击外部区域无法关闭的问题
    EditText inputType类型整理
    Fragment通过接口回调向父Activity传值
    Android selector一些坑
    Installation failed with message Failed to commit install session 634765663 with command cmd package
    旷视上海研究院机器人方向招聘
    语义SLAM的数据关联和语义定位(四)多目标测量概率模型
  • 原文地址:https://www.cnblogs.com/yslf/p/10731951.html
Copyright © 2011-2022 走看看