JDBC

  • JDBC(Java DateBase Connectivty),就是使用Java语言操作关系型数据库的一套API
  • 本质:
    • Sun公司官方定义的一套操作所有关系型数据库的规范,即接口
    • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
    • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

入门程序

  • 需求:基于JDBC,执行UPDATE语句(UPDATE user SET age = 25 WHERE id = 1)
  • 步骤:
    • 准备工作:创建Maven项目,引入依赖;准备数据库表user
    • 代码实现:编写JDBC程序,操作数据库
1
2
3
4
5
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. 获取连接
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
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");

// 5. 释放资源
statement.close();
connection.close();

基本的流程:注册驱动 => 建立连接 => 获取SQL执行对象 => 执行SQL语句 => 释放资源

查询数据

  • 需求:基于JDBC执行如下select语句,将查询结果封装到User对象中
  • SQL:SELECT * FROM user WHERE username = ‘daqiao’ AND password = ‘123456’

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@Test
public void testSelect() throws ClassNotFoundException, SQLException {
// 1. 注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");

// 2. 获取连接
String url = "jdbc:mysql://localhost:3306/web01";
String username = "root";
String password = "1234";
Connection connection = DriverManager.getConnection(url,username,password);

// 3. 获取SQL语句执行对象
String sql = "SELECT * FROM user WHERE username = ? AND password = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1,"daqiao");
statement.setString(2,"123456");

// 4. 执行SQL
ResultSet resultSet = statement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String uname = resultSet.getString("username");
String passwd = resultSet.getString("password");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
User user = new User(id,uname,passwd,name,age);
System.out.println(user);
// 输出结果:User{id=1, username='daqiao', password='123456', name='大乔', age=25}
}

// 5. 释放资源
statement.close();
connection.close();
}

sql语句中的?表示占位符,可以动态的变更查询条件。此时statement变为prepareStatement,通过setString(第n个占位符,替换内容)替换占位符

ResultSet可以把它看作是一个迭代器,通过迭代器中的方法获取查询返回的数据

预编译SQL

静态SQL:

1
2
Statement statement = connection.createStatement();
int i = statement.executeUpdate("UPDATE user SET age = 25 WHERE id = 1");

预编译SQL:

1
2
3
4
PreparedStatement statement = connection.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?")
statement.setString(1,"daqiao");
statement.setString(2,"123456");
ResultSet resultSet = statement.executeQuery();
  • 优势一:可以防止SQL注入,更安全
    • SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法
  • 优势二:性能更高

预编译SQL