网站首页 > java教程 正文
本文意在说明java最基础的数据库连接是如何做的,无需了解深入,后续可以使用ORM框架(如mybatis)进行,更方便、快速,想要做数据库深入了解请系统学习数据库理论知识,也可持续关注我,后续会介绍数据库系统性整理的知识
一、SQL基础回顾
SQL(Structured Query Language) 是操作关系型数据库的标准语言,核心操作包括:
- DDL(数据定义语言): 定义表结构(CREATE, ALTER, DROP)
- DML(数据操作语言): 增删改数据(INSERT, DELETE, UPDATE)
- DQL(数据查询语言): 查询数据(SELECT)
- DCL(数据控制语言): 权限管理(GRANT, REVOKE)
常用操作(增删改查)示例:
-- 创建表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
-- 插入数据
INSERT INTO user (name, age) VALUES ("张三", 25);
-- 查询数据
SELECT * FROM user WHERE age > 20;
-- 更新数据
UPDATE user SET age = 30 WHERE id = 1;
-- 删除数据
DELETE FROM user WHERE id = 1;
二、JDBC核心概念
JDBC(Java Database Connectivity) 是Java操作数据库的标准API,允许通过统一的接口访问多种数据库(如MySQL、Oracle)。其核心流程为:
连接数据库 → 执行SQL → 处理结果 → 释放资源。
1. JDBC核心组件
类/接口 | 作用 |
DriverManager | 管理数据库驱动,获取数据库连接(Connection) |
Connection | 表示与数据库的连接,可创建Statement或PreparedStatement |
Statement | 执行静态SQL语句(有SQL注入风险) |
PreparedStatement | 预编译SQL语句,防止SQL注入,支持参数化查询 |
ResultSet | 封装查询结果集,支持遍历和读取数据 |
SQLException | 数据库操作异常 |
2. JDBC开发步骤(以MySQL为例)
步骤1:添加驱动依赖
- Maven项目中添加MySQL驱动:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
步骤2:注册驱动并连接数据库
// JDBC URL格式:jdbc:mysql://主机名:端口/数据库名?参数
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
System.out.println("数据库连接成功!");
} catch (SQLException e) {
e.printStackTrace();
}
注意:JDBC 4.0+ 支持自动加载驱动(无需Class.forName("com.mysql.cj.jdbc.Driver"))。
步骤3:执行SQL语句
- 使用Statement(适用于简单场景):
try (Statement stmt = conn.createStatement()) {
String sql = "INSERT INTO user (name, age) VALUES ('李四', 28)";
int rows = stmt.executeUpdate(sql); // 返回受影响的行数
System.out.println("插入成功,影响行数:" + rows);
}
- 使用PreparedStatement(推荐,防止SQL注入):
String sql = "INSERT INTO user (name, age) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "王五"); // 参数索引从1开始
pstmt.setInt(2, 30);
int rows = pstmt.executeUpdate();
}
步骤4:处理查询结果(ResultSet)
String sql = "SELECT id, name, age FROM user WHERE age > ?";
try (PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 20);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", 姓名: " + name + ", 年龄: " + age);
}
}
3. 事务管理
try (Connection conn = DriverManager.getConnection(url, user, password)) {
conn.setAutoCommit(false); // 关闭自动提交
try {
// 执行多个SQL操作
updateUserAge(conn, 1, 30);
insertUser(conn, "赵六", 25);
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
e.printStackTrace();
}
}
三、JDBC高级应用
1. 数据库连接池
为什么需要连接池:
频繁创建和关闭连接消耗资源,连接池预先创建连接,复用已有连接,提升性能。
常用连接池:
- HikariCP(高性能,Spring Boot默认)
- Druid(阿里开源,支持监控)
HikariCP示例:
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("123456");
HikariDataSource dataSource = new HikariDataSource(config);
try (Connection conn = dataSource.getConnection()) {
// 使用连接操作数据库
}
2. 使用工具类封装JDBC
public class JdbcUtils {
private static DataSource dataSource; // 从连接池获取
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public static void close(ResultSet rs, Statement stmt, Connection conn) {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3. 使用模板模式简化查询
public class JdbcTemplate {
public static <T> T query(String sql, ResultSetHandler<T> handler, Object... params) {
try (Connection conn = JdbcUtils.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
for (int i = 0; i < params.length; i++) {
pstmt.setObject(i + 1, params[i]);
}
ResultSet rs = pstmt.executeQuery();
return handler.handle(rs);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
// 使用示例:查询单个用户
User user = JdbcTemplate.query(
"SELECT * FROM user WHERE id = ?",
rs -> {
if (rs.next()) {
return new User(rs.getInt("id"), rs.getString("name"));
}
return null;
},
1
);
四、常见问题与优化
1. SQL注入问题
- 问题:拼接SQL时,恶意参数可能破坏SQL结构(如' OR 1=1 --)。
- 解决:使用PreparedStatement预编译SQL,避免拼接。
2. 性能优化
- 使用连接池(如HikariCP)减少连接创建开销。
- 批量操作提升效率:
try (PreparedStatement pstmt = conn.prepareStatement("INSERT INTO user (name) VALUES (?)")) {
for (int i = 0; i < 1000; i++) {
pstmt.setString(1, "user" + i);
pstmt.addBatch(); // 添加到批处理
}
pstmt.executeBatch(); // 执行批量插入
}
3. 资源释放
- 使用try-with-resources自动关闭资源(JDK7+支持)。
- 确保Connection、Statement、ResultSet在finally块中关闭。
五、JDBC与ORM框架对比
特性 | JDBC | ORM框架(如MyBatis、Hibernate) |
开发效率 | 手动编写SQL和映射代码,效率低 | 自动映射结果集,提供高级API,效率高 |
可维护性 | SQL嵌入代码中,维护困难 | SQL与代码分离,易于维护 |
性能 | 直接操作数据库,性能高 | 可能因反射和代理带来性能损耗(可优化) |
适用场景 | 简单查询或需要极致性能的场景 | 复杂业务逻辑,快速开发场景 |
总结
- JDBC是Java操作数据库的基石,掌握其核心API和事务管理是后端开发必备技能。
- 连接池和PreparedStatement是优化性能和安全性的关键。
- ORM框架(如MyBatis)在复杂场景中更高效,但JDBC仍是理解底层原理的重要工具。
- 上一篇: HikariCP数据库连接池的性能优化指南
- 下一篇: MySQL数据库性能优化在Java项目中的表现
猜你喜欢
- 2025-05-09 连接池之HikariCP:HikariCP框架设计与功能使用分析(第一部分)
- 2025-05-09 SpringBoot数据库操作的应用(springboot的数据库配置文件)
- 2025-05-09 Java数据库3大隐形陷阱!你的应用为何越跑越慢(附调优代码)
- 2025-05-09 深度剖析HikariCP:Java程序员的数据库利器
- 2025-05-09 Java工程师必知的数据库优化(java数据库工具包)
- 2025-05-09 Java线程池的四种用法与使用场景(java线程池的作用及使用方法)
- 2025-05-09 MySQL系列1:MySQL体系架构(mysql架构设计)
- 2025-05-09 你应该这样去开发接口:Java多线程并行计算
- 2025-05-09 假如面试官让你来设计数据库中间件
- 2025-05-09 Java暗藏杀机!ThreadLocal3大致命坑,90%程序员中招附逃生指南
你 发表评论:
欢迎- 最近发表
-
- 连接池之HikariCP:HikariCP框架设计与功能使用分析(第一部分)
- SpringBoot数据库操作的应用(springboot的数据库配置文件)
- Java数据库3大隐形陷阱!你的应用为何越跑越慢(附调优代码)
- 深度剖析HikariCP:Java程序员的数据库利器
- Java工程师必知的数据库优化(java数据库工具包)
- Java线程池的四种用法与使用场景(java线程池的作用及使用方法)
- MySQL系列1:MySQL体系架构(mysql架构设计)
- 你应该这样去开发接口:Java多线程并行计算
- 假如面试官让你来设计数据库中间件
- Java暗藏杀机!ThreadLocal3大致命坑,90%程序员中招附逃生指南
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)