ToB企服应用市场:ToB评测及商务社交产业平台
标题:
JDBC 完全指南:掌握 Java 数据库交互的核心技术
[打印本页]
作者:
九天猎人
时间:
11 小时前
标题:
JDBC 完全指南:掌握 Java 数据库交互的核心技术
JDBC 完全指南:掌握 Java 数据库交互的核心技术
一、JDBC 是什么?为什么它如此重要?
JDBC(Java Database Connectivity)是 Java 语言中用于连接和操纵关系型数据库的尺度 API。它允许开辟者通过同一的接口访问差异的数据库(如 MySQL、Oracle、PostgreSQL 等),而无需关心底层数据库的详细实现。 JDBC是学习Mybatis的前提,Mybatis是JDBC的简化,清楚认识到jdbc的流程,才能更好理解Mybatis。Mybatis来日诰日准时更新。
JDBC 的核心代价
跨数据库兼容性
:同一套代码适配多种数据库(通过更换驱动即可)。
简化开辟
:封装数据库协议细节,开辟者专注于业务逻辑。
性能可控
:支持从原生 SQL 操纵到连接池优化等多层调优。
二、JDBC 架构与核心组件
JDBC 的架构分为两层:
应用程序层
:开辟者编写的 Java 代码。
驱动层
:数据库厂商提供的 JDBC 驱动(如 mysql-connector-java)。
核心接口与类
组件
作用
DriverManager管理数据库驱动,建立与数据库的连接Connection表现与数据库的会话,用于管理事务和创建语句对象Statement执行静态 SQL 语句(如 SELECT, INSERT)PreparedStatement预编译 SQL 语句,防止 SQL 注入,提升性能CallableStatement调用数据库存储过程ResultSet封装查询结果集,支持遍历和读取数据
三、JDBC 工作流程详解
6 步完成数据库操纵
1. 注册驱动(可选)
从 JDBC 4.0 开始,支持主动驱动加载,无需手动调用 Class.forName()。
// 旧方式(JDBC 3.0)
Class.forName("com.mysql.cj.jdbc.Driver");
// JDBC 4.0+ 自动加载驱动(需驱动 JAR 包含 META-INF/services/java.sql.Driver 文件)
复制代码
2. 建立连接
通过 DriverManager.getConnection() 获取 Connection 对象。
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 使用连接执行操作
}
复制代码
3. 创建 Statement
根据需求选择 Statement 或 PreparedStatement。
// 静态 SQL(存在 SQL 注入风险)
Statement stmt = conn.createStatement();
// 预编译 SQL(推荐)
String sql = "INSERT INTO users(name, email) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
复制代码
4. 执行 SQL
查询
:executeQuery() 返回 ResultSet。
更新
:executeUpdate() 返回受影响的行数。
// 插入数据
pstmt.setString(1, "Alice");
pstmt.setString(2, "alice@example.com");
int rows = pstmt.executeUpdate();
System.out.println("插入行数: " + rows);
// 查询数据
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
复制代码
5. 处置惩罚结果集
遍历 ResultSet 并读取数据。
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
System.out.println(id + ", " + name);
}
复制代码
6. 关闭资源
使用
try-with-resources
主动关闭资源(Java 7+)。
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery()) {
// 操作代码
} catch (SQLException e) {
e.printStackTrace();
}
复制代码
四、PreparedStatement vs Statement:为什么前者更优秀?
对比项
StatementPreparedStatement
SQL 注入风险
高(直接拼接 SQL)低(参数化查询)
性能
每次执行需编译 SQL预编译一次,重复使用服从高
可读性
字符串拼接复杂参数占位符(?)清楚易读
示例:PreparedStatement 防 SQL 注入
String input = "admin'; DROP TABLE users;--";
// 错误方式(Statement)
String sql = "SELECT * FROM users WHERE name = '" + input + "'";
// 实际 SQL: SELECT * FROM users WHERE name = 'admin'; DROP TABLE users;--'
// 正确方式(PreparedStatement)
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?");
pstmt.setString(1, input); // 参数会被安全处理
复制代码
五、事务管理:包管数据一致性
通过 Connection 对象控制事务:
try (Connection conn = DriverManager.getConnection(url, user, password)) {
conn.setAutoCommit(false); // 关闭自动提交
// 执行多个操作
updateAccount(conn, "A", -100);
updateAccount(conn, "B", 100);
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
}
复制代码
关键方法
:
setAutoCommit(boolean):启用/禁用主动提交。
commit():提交事务。
rollback():回滚事务。
六、连接池:提升性能的关键
为什么必要连接池?
频繁创建/关闭连接开销大。
连接池预先创建并管理连接,复用连接镌汰延迟。
常用连接池库
HikariCP
:高性能,Spring Boot 默认选择。
Apache DBCP
:稳定但性能一般。
C3P0
:功能丰富,但较老旧。
HikariCP 示例配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(10);
try (HikariDataSource dataSource = new HikariDataSource(config);
Connection conn = dataSource.getConnection()) {
// 使用连接
}
复制代码
七、异常处置惩罚与最佳实践
1. 处置惩罚 SQLException
捕获并记录异常,避免直接忽略。
使用 SQLException.getErrorCode() 获取数据库特定错误码。
2. 最佳实践
始终使用 PreparedStatement
:防止 SQL 注入。
使用 try-with-resources
:确保资源释放。
合理设置连接池参数
:如最大连接数、超时时间。
日记记录 SQL 操纵
:便于调试和审计。
八、进阶:JdbcTemplate 与 ORM 框架
1. Spring JdbcTemplate
简化 JDBC 样板代码:
@Autowired
private JdbcTemplate jdbcTemplate;
public List<User> getUsers() {
return jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
return user;
});
}
复制代码
2. ORM 框架(如 MyBatis、Hibernate)
MyBatis
:通过 XML/注解映射 SQL,灵活性强。
Hibernate
:全主动 ORM,得当复杂对象模子。
九、完整示例:JDBC CRUD 操纵
public class JdbcDemo {
private static final String URL = "jdbc:mysql://localhost:3306/mydb";
private static final String USER = "root";
private static final String PASSWORD = "123456";
public static void main(String[] args) {
// 插入用户
insertUser("Bob", "bob@example.com");
// 查询用户
List<User> users = getUsers();
users.forEach(System.out::println);
}
public static void insertUser(String name, String email) {
String sql = "INSERT INTO users(name, email) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, name);
pstmt.setString(2, email);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static List<User> getUsers() {
List<User> users = new ArrayList<>();
String sql = "SELECT * FROM users";
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql)) {
while (rs.next()) {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
users.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}
}
复制代码
**十、总结
核心要点回顾
JDBC 是 Java 操纵数据库的尺度,通过驱动实现跨数据库兼容。
PreparedStatement 比 Statement 更安全高效。
事务和连接池是提升性能与稳定性的关键。
掌握 JDBC,您已买通 Java 与数据库的桥梁!
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4