Java Database Connectivity(JDBC)是用于在Java应用程序中连接和操作数据库的API。它允许Java程序与各种关系型数据库进行交互,如MySQL、Oracle、PostgreSQL等。下面详细介绍JDBC的一些重要概念和常用方法。
一、JDBC 概述
JDBC API 提供了一种标准方法,使得Java应用程序可以通过SQL访问数据库。它包含两个核心部分:
1、JDBC API:定义了Java程序如何访问数据库的接口。
2、JDBC Driver:实现了JDBC API,每个数据库厂商都需要提供自己的JDBC驱动程序来实现这些接口。
二、常用的 JDBC 类和接口
1、DriverManager:
- 主要用于管理一组 JDBC 驱动程序。
getConnection(String url, String username, String password)
:用于建立数据库连接。
2、Connection:
- 表示与数据库的连接。
createStatement()
:创建一个Statement
对象用于执行 SQL 语句。prepareStatement(String sql)
:创建一个PreparedStatement
对象,用于执行预编译的 SQL 语句,提高性能和安全性。
3、Statement:
- 用于执行静态 SQL 语句。
executeQuery(String sql)
:执行查询操作,返回一个ResultSet
对象。executeUpdate(String sql)
:执行 INSERT、UPDATE 或 DELETE 操作,返回更新的行数。execute(String sql)
:执行任何 SQL 语句,返回一个 boolean 值表示是否有结果集。
4、PreparedStatement:
- 继承自
Statement
,预编译 SQL 语句,提高执行效率,防止 SQL 注入攻击。 setXXX(int parameterIndex, XXX value)
:为预编译的 SQL 语句设置参数,例如setString
、setInt
等方法。
5、ResultSet:
- 表示查询结果集。
next()
:将光标移动到下一行,并返回是否存在下一行。getString(int columnIndex)
、getInt(int columnIndex)
等方法用于获取当前行的列数据。
三、JDBC 使用流程
1、加载数据库驱动:使用 Class.forName(driverClassName)
加载数据库驱动。
2、建立连接:使用 DriverManager.getConnection(url, username, password)
建立数据库连接。
3、创建Statement或PreparedStatement:根据需求创建 Statement
或 PreparedStatement
对象。
4、执行SQL语句:通过 executeQuery
、executeUpdate
等方法执行 SQL 操作。
5、处理结果:通过 ResultSet
获取查询结果并进行处理。
6、释放资源:在不再需要时关闭 ResultSet
、Statement
、Connection
等对象,释放数据库连接。
import java.sql.*;
public class JDBCTest {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 建立连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo", "root", "123456");
// 创建 Statement
stmt = conn.createStatement();
// 执行查询
rs = stmt.executeQuery("SELECT * FROM users");
// 处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println("id: " + id + ", name: " + name);
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
// 释放资源
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
四、JdbcTemplate
JdbcTemplate
是 Spring 框架中用于简化 JDBC 操作的重要类,它封装了常见的 JDBC 操作,提供了多种方法来执行查询、更新和批处理等操作。以下是 JdbcTemplate
常用的方法及其简要说明:
1、queryForObject(查询操作)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
@Autowired
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public String findUserNameById(int userId) {
String sql = "SELECT name FROM users WHERE id = ?";
String name = jdbcTemplate.queryForObject(sql, String.class, userId);
return name;
}
}
2、update(更新操作)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
@Autowired
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void updateUserName(int userId, String newName) {
String sql = "UPDATE users SET name = ? WHERE id = ?";
jdbcTemplate.update(sql, newName, userId);
}
}
3、batchUpdate(批量更新)
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
@Repository
public class UserRepository {
private final JdbcTemplate jdbcTemplate;
@Autowired
public UserRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void insertUsers(List<User> users) {
String sql = "INSERT INTO users (id, name) VALUES (?, ?)";
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
User user = users.get(i);
ps.setInt(1, user.getId());
ps.setString(2, user.getName());
}
@Override
public int getBatchSize() {
return users.size();
}
});
}
}