占位符的使用
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