一、Statement(存在SQL注入问题)
public static void main(String[] args) {// login("lili","123"); login(" 'or' 1=1"," 'or' 1=1"); }public static void login(String name,String pwd){ Connection conn = null; Statement st = null; ResultSet rs = null; try{ conn = jdbcUtils.getConnection(); // 获取数据库连接 st = conn.createStatement(); // 获取SQL的执行对象 String sql="SELECT * FROM userinfo WHERE username='"+name+"' AND password='"+pwd+"';"; System.out.println(sql); rs = st.executeQuery(sql); while (rs.next()){ System.out.println(rs.getString("username")); System.out.println(rs.getString("password")); System.out.println("======================"); } } catch (SQLException throwables) { throwables.printStackTrace(); }finally { jdbcUtils.release(conn,st,rs); } }
二、PreparedStatement(解决SQL注入问题)
public static void main(String[] args) {// login("lili","123"); login("'' or 1=1","'' or 1=1"); }public static void login(String name,String pwd){ Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try{ conn = jdbcUtils.getConnection(); // 获取数据库连接 /* prepareStatement 防止注入的本质,把传递过来的参数当做字符 假设集中存放转义字符,比如说 ' 会被直接转义 */ String sql="SELECT * FROM userinfo WHERE username=? AND password=?"; st = conn.prepareStatement(sql); // 获取SQL的执行对象 st.setString(1,name); st.setString(2,pwd); rs = st.executeQuery(); // 查询完毕会返回一个结果集 while (rs.next()){ System.out.println(rs.getString("username")); System.out.println(rs.getString("password")); System.out.println("======================"); } } catch (SQLException throwables) { throwables.printStackTrace(); }finally { jdbcUtils.release(conn,st,rs); }}