什么是JDBC
JDBC(Java DataBase Connectivity,Java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问。
简单说就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
示例1
import java.sql.*;
public class TestJdbc3 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//驱动名
String driverName = "com.mysql.jdbc.Driver";
//连接数据库的url
String url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";
//用户名
String username = "root";
//密码
String password = "root";
//加载驱动
Class.forName(driverName);
//假设用户输入的数据
int stuid = 1;
//SQL语句
String sql = "SELECT * FROM tb_stu WHERE sid=" + stuid;
//建立连接
Connection connection = DriverManager.getConnection(url, username, password);
//System.out.println(connection);
Statement statement = connection.createStatement();
//发送SQL语句
ResultSet resultSet = statement.executeQuery(sql);
//处理结果
while(resultSet.next()) {
int id = resultSet.getInt("sid");
String sname = resultSet.getString("sname");
int sage = resultSet.getInt("sage");
String sgender = resultSet.getString("sgender");
System.out.println(id);
System.out.println(sname);
System.out.println(sage);
System.out.println(sgender);
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}
PreparedStatement
什么是SQL注入
用户输入的数据中有SQL关键字或语法并且参与了SQL语句的编译,导致SQL语句编译后的条件含义为true,一直得到正确的结果。这种现象称为SQL注入
如何避免SQL注入
由于编写的SQL语句是在用户输入数据,整合后再进行编译。所以为了避免SQL注入的问题,我们要使SQL语句在用户输入数据前就已进行编译成完整的SQL语句,再进行填充数据。
使用PreparedStatement。
预编译SQL语句
//SQL语句
String sql = "SELECT * FROM user WHERE username=? AND password=?";
//预编译SQL语句
PreparedStatement statement = connection.prepareStatement(sql);
设置参数
//设置参数
statement.setString(1, n);
statement.setString(2, p);
完整示例
import java.sql.*;
public class TestJdbc5 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//驱动名
String driverName = "com.mysql.jdbc.Driver";
//连接数据库的url
String url = "jdbc:mysql://localhost:3306/mydbjdbc?useSSL=false";
//用户名
String username = "root";
//密码
String password = "root";
//加载驱动
Class.forName(driverName);
//假设用户输入的数据
String n = "abc' OR 1=1 OR '1=1";
String p = "123";
//SQL语句
String sql = "SELECT * FROM user WHERE username=? AND password=?";
//建立连接
Connection connection = DriverManager.getConnection(url, username, password);
//预编译SQL语句
PreparedStatement statement = connection.prepareStatement(sql);
//设置参数
statement.setString(1, n);
statement.setString(2, p);
//发送SQL语句
ResultSet resultSet = statement.executeQuery();
//处理结果
while(resultSet.next()) {
System.out.println(resultSet.getString("username"));
System.out.println(resultSet.getString("password"));
}
//释放资源
resultSet.close();
statement.close();
connection.close();
}
}