目录
[1.1 JDBC入门程序](#1.1 JDBC入门程序)
[3.1 SQL注入](#3.1 SQL注入)
[3.2 预编译SQL的优势](#3.2 预编译SQL的优势)
一、什么是JDBC?
JDBC:(J ava D ataB ase Connectivity),就是使用Java语言操作关系型数据库的一套API。
本质:
- sun公司官方定义的一套操作所有关系型数据库的规范,即接口。
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包。
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类。
MySQL驱动jar包:
XML
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
1.1 JDBC入门程序
需求:基于JDBC程序,执行update语句。
基于JDBC操作数据库的五步:
- 注册驱动
- 获取数据库的连接
- 获取SQL语句的执行对象
- 执行SQL语句
- 释放资源
javapublic class JdbcTest { @Test public void testUpdate() throws Exception { //1.注册驱动 Class.forName("com.mysql.cj.jdbc.Driver"); //2.获取数据库的连接 String url = "jdbc:mysql://localhost:3306/web01"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password); //3.获取SQL语句执行对象 Statement statement = connection.createStatement(); //4.执行SQL语句 int i = statement.executeUpdate("update user set age = 25 where id = 1"); System.out.println("SQL执行完毕影响到的记录数为:" + i); //5.释放资源 statement.close(); connection.close(); } }
二、JDBC-查询数据
需求:基于JDBC执行如下select语句,将查询结果封装到User对象中。
SQL: select * from user where username = 'daqiao' and password = '123456'
java
@Test
public void testSelect() throws Exception {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取数据库连接
String url = "jdbc:mysql://localhost:3306/web01";
String dbUsername = "root";
String dbPassword = "123456";
Connection connection = DriverManager.getConnection(url, dbUsername, dbPassword);
//3.定义SQL语句(使用占位符)
String sql = "select id,username,password,name,age from user where username = ? and password = ?";
//4.获取预编译SQL语句执行对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.设置参数
preparedStatement.setString(1, "daqiao");
preparedStatement.setString(2, "123456");
//6.执行SQL查询语句
ResultSet resultSet = preparedStatement.executeQuery();
//7.处理结果集
while (resultSet.next()) {
//获取每一列的数据
Integer id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
String name = resultSet.getString("name");
Integer age = resultSet.getInt("age");
//封装到User对象中
User user = new User(id, username, password, name, age);
//输出到控制台
System.out.println(user);
}
//8.释放资源
resultSet.close();
preparedStatement.close();
connection.close();
}
运行结果:

三、预编译SQL
我们在上一个执行查询语句时,使用了预编译的SQL语句,使参数动态传递:
java
//3.定义SQL语句(使用占位符)
String sql = "select id,username,password,name,age from user where username = ? and password = ?";
//4.获取预编译SQL语句执行对象
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.设置参数
preparedStatement.setString(1, "daqiao");
preparedStatement.setString(2, "123456");
3.1 SQL注入
简单来说,SQL 注入就是用户把恶意的 SQL 代码伪装成普通的数据,提交给后台。后台如果没有防备,直接把它拼接到 SQL 语句中去执行,就会导致数据库执行了黑客的指令。
正常情况: 用户输入:张三,密码:123 数据库执行:
sqlSELECT * FROM users WHERE username = '张三' AND password = '123';账号密码匹配,登录成功。
黑客攻击(SQL 注入): 黑客在用户名输入框里输入:
' OR '1'='1在密码框里随便输入:123数据库执行的语句变成了这样:
sqlSELECT * FROM users WHERE username = '' OR '1'='1' AND password = '123';也成功登录了。
3.2 预编译SQL的优势
优势一:更安全,防止SQL注入
当使用预编译时,数据库已经提前解析了 SQL 的语法树。之后传过来的参数,只会被当做纯粹的"字符串"处理,绝对不会被当作 SQL 关键字去执行。

优势二:性能更高
你先发给数据库一个模板:SELECT * FROM users WHERE age = ?。 数据库收到后,立刻进行 解析、优化、编译 (步骤 1、2、3),然后把这份计划缓存在内存中。
