JDBC
- JDBC(Java DateBase Connectivty),就是使用Java语言操作关系型数据库的一套API
- 本质:
- Sun公司官方定义的一套操作所有关系型数据库的规范,即接口
- 各个数据库厂商去实现这套接口,提供数据库驱动jar包
- 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类
入门程序
- 需求:基于JDBC,执行UPDATE语句(UPDATE user SET age = 25 WHERE id = 1)
- 步骤:
- 准备工作:创建Maven项目,引入依赖;准备数据库表user
- 代码实现:编写JDBC程序,操作数据库
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
示例:
// 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’
示例:
@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:
Statement statement = connection.createStatement();
int i = statement.executeUpdate("UPDATE user SET age = 25 WHERE id = 1");
预编译SQL:
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语句,以达到执行代码对服务器进行攻击的方法
- 优势二:性能更高

许可协议:
CC BY 4.0