SQL注入介绍
-
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
用户登录的本质:执行下面的sql语句
select * from tb_user where username = 'zhangsan' and password = '123';
发生sql注入的本质
解决SQL注入的方法(PreparedStatement预编译SQL)
PreparedStatement作用: 预编译SQL并执行SQL语句
① 获取 PreparedStatement 对象
// SQL语句中的参数值,使用?占位符替代
String sql = "select * from user where username = ? and password = ?";
// 通过Connection对象获得,并传入对应的sql语句
PreparedStatement pstmt = conn.prepareStatement(sql);
② 设置参数值
PreparedStatement对象:setXxx(参数1, 参数2):给?赋值(如果是增删改语句也是通过?来赋值)
Xxx:数据类型;如setInt(参数1, 参数2)
参数:
- 参数1:?的位置编号,从1开始
- 参数2:?的值
③ 执行SQL
executeUpdate();
如果是INSERT、UPDATE或DELETE语句则executeQuery();它返回一个整数,表示执行的行数;不管是那种都不需要再传递sql
//1. 注册驱动Class.forName("com.mysql.jdbc.Driver");//2. 获取连接String url = "jdbc:mysql:///dqlsearch?useSSL=false";String username = "root";String password = "123456";Connection conn = DriverManager.getConnection(url, username, password);// 要查询的具体数据String math_score = "72";String chinese_score = "70";// 定义sqlString sql = "select * from studentscore where chinese_score = ? and math_score = ?";// 获取pstmt对象,同时进行预编译PreparedStatement pstmt = conn.prepareStatement(sql);// 设置?的值pstmt.setString(1, chinese_score);pstmt.setString(2, math_score);// 执行sqlResultSet rs = pstmt.executeQuery();if(rs.next()){System.out.println("找到了");}else{System.out.println("没找到");}// 释放资源rs.close();pstmt.close();conn.close();
数据库连接池简介
- 数据库连接池是个容器,负责分配、管理数据库连接(Connection)
- 它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;
- 释放空间时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接资源浪费
好处:
- 资源重用
- 提升系统响应速度
- 避免数据库连接资源浪费
Driud使用步骤
- 导入jar包druid-1.1.12.jar
- 定义配置文件
- 加载配置文件
- 获取数据库连接池对象
- 获取连接