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 }
原文地址:https://www.cnblogs.com/yslf/p/10731951.html