1.PreparedStatement
SQL注入:SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法。
SQL注入演示
/*
* 用户登录
* */
import com.itheima.pojo.Account;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
public class JDBCDemo06 {
@Test
public void TestLogin() throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//接受用户名和密码(输入的)
String name = "zhangsan";
String pwd = "123";
String sql = "select * from user where username = '"+name+"' and password = '"+pwd+"'";
//获取stmt对象
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//判断是否成功登录
if (rs.next()){
System.out.println("登录成功");
}
else {
System.out.println("登录失败");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
//演示sql注入
@Test
public void TestLogin_Inject() throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//接受用户名和密码(输入的)
String name = "sadffgfgd";
String pwd = "'or'1'='1";
String sql = "select * from user where username = '"+name+"' and password = '"+pwd+"'";
System.out.println(sql);
//获取stmt对象
Statement stmt = conn.createStatement();
//执行sql
ResultSet rs = stmt.executeQuery(sql);
//判断是否成功登录
if (rs.next()){
System.out.println("登录成功");
}
else {
System.out.println("登录失败");
}
//7.释放资源
rs.close();
stmt.close();
conn.close();
}
}
![](https://img-blog.csdnimg.cn/img_convert/07694bc76b92ab309886fa7d804bab3e.png)
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:数据类型﹔如setlnt(参数1,参数2)
参数;
参数1:?的位置编号,从1开始
参数2:?的值
执行SQL
executeUpdate(); / executeQuery(); :不需要再传递sql
再次尝试注入,失败
/*
* API详解
* */
import org.junit.Test;
import java.sql.*;
public class JDBCDemo07_PreparedStatement {
@Test
public void TestLogin() throws Exception{
//1.注册驱动
//Class.forName("com.mysql.jdbc.Driver");
//2.获取链接
String url = "jdbc:mysql://127.0.0.1:3306/test?useSSL=false";
String username = "root";
String password = "1234";
Connection conn = DriverManager.getConnection(url, username, password);
//接受用户名和密码(输入的)
String name = "zhangsan";
String pwd = "'or'1'='1";
String sql = "select * from user where username = ? and password = ?";
//获取pstmt对象
PreparedStatement pstmt = conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setString(2,pwd);
//执行sql
ResultSet rs = pstmt.executeQuery();
//判断是否成功登录
if (rs.next()){
System.out.println("登录成功");
}
else {
System.out.println("登录失败");
}
//7.释放资源
rs.close();
pstmt.close();
conn.close();
}
}
![](https://img-blog.csdnimg.cn/img_convert/d36f726c5d82e00dce557240f3d5438c.png)
原理:将敏感字符进行转义
2.数据库连接池
2.1简介
数据库连接池是个容器,负责分配、管理数据库连掷(Connection)
它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏
好处:
资源重用
提升系统响应速度
避免数据库连接遗漏
![](https://img-blog.csdnimg.cn/img_convert/a58fabf6f7647239df3763dc2712a85e.png)
2.2数据库连接池实现
标准接口:DataSource
官方(SUN)提供的数据库连接池标准接口,由第三方组织实现此接口。
功能:获取连接
Connection getConnection()
常见的数据库连接池:
DBCP
C3P0
Druid
Druid(德鲁伊)
Druid连接池是阿里巴巴开源的数据库连接池项目
功能强大,性能优秀,是Java语言最好的数据库连接池之一
2.3Driud使用步骤
1.导入jar包druid-1.1.12.jar
2.定义配置文件
3.加载配置文件
4.获取数据库连接池对象
5.获取连接
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.sql.Connection;
import java.util.Map;
import java.util.Properties;
/*
* Druid数据库连接池演示
* */
public class DruidDemo {
public static void main(String[] args) throws Exception {
//导入jar包
//定义配置文件
//加载配置文件
Properties prop = new Properties();
prop.load(new FileInputStream("src/druid.properties"));
//获取连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
//获取数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//System.out.println(System.getProperty("user.dir"));
}
}