目录
SQL注入
1、 什么是SQL注入
2、 避免SQL注入
PreparedStatement【重点】
SQL注入
1、 什么是SQL注入
select * from tb_user where username = '111' and password = '111'select * from tb_user where username = '111' and password = '111' or '1=1'
用户输入的数据中有
SQL关键词
,导致在执行SQL语句时出现一些不正常的情况.这就是SQL注入!
出现SQL注入是很危险
2、 避免SQL注入
问题出现在用户输入数据时,里面有
关键词
,再配合字符串拼接导致
出现SQL注入.所以为了避免SQL注入,可以在用户输入数据到SQL之前,先把SQL语句预编译
,预处理后,JDBC就会知道此SQL需要几个参数,后续再将用户输入的数据给参数填充.这就是PreparedStatement
PreparedStatement【重点】
PreparedStatement是Statement的子接口,用来预处理SQL语句
PreparedStatement使用
先写SQL语句,SQL语句中的参数不能直接拼接,而是使用
?占位
使用ps预处理SQL语句,处理的?号,ps内部就会知道此SQL语句需要几个参数
再动态给?处填充值
执行sql
public class Demo3 {
public static void main(String[] args) throws Exception {
// 1加载驱动// 2获得连接Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");
// 3获得[预处理语句]对象/*** 使用预处理对象有步骤* 1 先写sql,语句中需要拼接参数的地方用?占位* 2 通过连接对象,调用处理语句的方法,传入sql参数,对语句处理后* 获得一个含有处理过sql的语句对象* 3 给处理过的?处赋值* 4 执行*/String sql = "select * from tb_user where username = ? and password = ?";System.out.println("处理前:" + sql );PreparedStatement ps = conn.prepareStatement(sql);System.out.println("处理后:" + ps );// 3 给?赋值ps.setString(1,"uzi");ps.setString(2,"123456");System.out.println("赋值后:" + ps );
// 4执行sql语句ResultSet rs = ps.executeQuery( );// 【特别注意: 不需要再传参数】while(rs.next()) {User user = new User( );user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setPhone(rs.getString("phone"));user.setCreateTime(rs.getDate("create_time"));user.setMoney(rs.getDouble("money"));user.setSex(rs.getInt("sex"));
System.out.println(user );}
// 5关流rs.close();ps.close();conn.close();}
}
使用预处理语句改造登录案例
public class Demo4_login_plus {
public static void main(String[] args) {input();}
// 设计方法完成输入public static void input() {System.out.println("欢迎登录LPL选手管理系统" );Scanner scanner = new Scanner(System.in);System.out.println("请输入用户名:" );String username = scanner.nextLine( );System.out.println("请输入密码:" );String password = scanner.nextLine( );
User user = login(username, password);
if (user != null) {System.out.println("欢迎进入系统:" + user );} else {System.out.println("用户名或密码错误!" );}
}
public static User login(String username,String password){Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;User user = null; // 初始值try {Class.forName("com.mysql.jdbc.Driver");conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/java2311?useSSL=false", "root", "123456");// 1 先写sql,条件写?String sql = "select * from tb_user where username = ? and password = ?";// 2 获得预处理语句对象ps = conn.prepareStatement(sql);// 3 给?赋值ps.setString(1,username);ps.setString(2,password);System.out.println(ps );// 4 执行rs = ps.executeQuery( );while (rs.next()) {user = new User();user.setId(rs.getInt("id"));user.setUsername(rs.getString("username"));user.setPassword(rs.getString("password"));user.setPhone(rs.getString("phone"));user.setCreateTime(rs.getDate("create_time"));user.setMoney(rs.getDouble("money"));user.setSex(rs.getInt("sex"));}} catch (Exception e) {e.printStackTrace();} finally {try {rs.close();ps.close();conn.close();}catch (Exception e) {e.printStackTrace();}}return user;}
}