JDBC
- 一、JDBC 是什么?
- 核心功能
- 二、JDBC 开发步骤(固定 7 步)
- 1. 准备工作
- 2. 标准步骤
- 三、核心 API 详解
- 1. DriverManager
- 2. Connection(数据库连接对象)
- 3. Statement / PreparedStatement(执行 SQL)
- 4. ResultSet(结果集)
- 四、连接参数(必须记住)
- 五、基础代码示例(查询)
- 六、增删改查(CRUD)执行方法
- 新增示例
- 七、JDBC 工具类(封装重复代码)
- 使用工具类
- 八、SQL 注入问题
- 九、事务管理
- 手动事务步骤
- 十、数据库连接池(重点)
- 为什么要用连接池?
- 常用连接池
- Druid 连接池使用
- 十一、JDBC 核心总结(面试/考试必背)
一、JDBC 是什么?
JDBC(Java Database Connectivity):Java 数据库连接,是 Java 官方提供的一套操作所有关系型数据库的接口(规范)。
- 不同数据库厂商(MySQL、Oracle、SQLServer)提供实现类(驱动包)
- 我们只需要面向 JDBC 接口编程,不用关心底层数据库差异
核心功能
- 连接数据库
- 执行 SQL 语句
- 处理查询结果
- 关闭资源
二、JDBC 开发步骤(固定 7 步)
1. 准备工作
- 导入数据库驱动包(
mysql-connector-java)- MySQL 5.x:
com.mysql.jdbc.Driver - MySQL 8.x:
com.mysql.cj.jdbc.Driver
- MySQL 5.x:
2. 标准步骤
- 加载驱动(MySQL 5.1.6 之后可省略)
- 获取数据库连接(
Connection) - 获取执行 SQL 的对象(
Statement/PreparedStatement) - 编写 SQL
- 执行 SQL
- 处理结果集(
ResultSet) - 释放资源
三、核心 API 详解
1. DriverManager
- 作用:获取数据库连接
- 常用方法:
DriverManager.getConnection(url,user,password);
2. Connection(数据库连接对象)
- 作用:代表 Java 和数据库的连接通道
- 核心方法:
createStatement():获取普通执行对象prepareStatement(sql):获取预编译执行对象(推荐)setAutoCommit(false):开启事务commit():提交事务rollback():回滚事务
3. Statement / PreparedStatement(执行 SQL)
- Statement:普通执行对象,存在 SQL 注入风险。
- PreparedStatement:预编译对象,安全、高效(企业必用)。
4. ResultSet(结果集)
- 作用:封装查询语句返回的数据
- 常用方法:
next():向下移动一行,有数据返回 truegetXxx(列名/下标):获取数据(getInt/getString/getDate)
四、连接参数(必须记住)
驱动类: MySQL 8.x:com.mysql.cj.jdbc.Driver URL: jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true 用户名:root 密码:自己的数据库密码五、基础代码示例(查询)
importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;publicclassJdbcDemo{publicstaticvoidmain(String[]args)throwsException{// 1. 参数Stringurl="jdbc:mysql:///test?serverTimezone=UTC";Stringuser="root";Stringpassword="123456";// 2. 获取连接Connectionconn=DriverManager.getConnection(url,user,password);// 3. SQLStringsql="SELECT * FROM user WHERE id = ?";// 4. 获取预编译对象PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setInt(1,1);// 给 ? 赋值// 5. 执行查询ResultSetrs=pstmt.executeQuery();// 6. 处理结果while(rs.next()){intid=rs.getInt("id");Stringname=rs.getString("name");System.out.println(id+" : "+name);}// 7. 关闭资源(倒序关)rs.close();pstmt.close();conn.close();}}六、增删改查(CRUD)执行方法
| 方法 | 用途 |
|---|---|
executeQuery() | 查询(SELECT) |
executeUpdate() | 增删改(INSERT/UPDATE/DELETE) |
新增示例
Stringsql="INSERT INTO user(name,age) VALUES(?,?)";PreparedStatementpstmt=conn.prepareStatement(sql);pstmt.setString(1,"张三");pstmt.setInt(2,20);introws=pstmt.executeUpdate();// 受影响行数System.out.println(rows);七、JDBC 工具类(封装重复代码)
实际开发必须封装工具类,避免重复写连接、关闭代码。
importjava.sql.*;publicclassJdbcUtil{privatestaticfinalStringURL="jdbc:mysql:///test?serverTimezone=UTC";privatestaticfinalStringUSER="root";privatestaticfinalStringPASSWORD="123456";// 静态代码块:加载驱动static{try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){e.printStackTrace();}}// 获取连接publicstaticConnectiongetConnection()throwsSQLException{returnDriverManager.getConnection(URL,USER,PASSWORD);}// 关闭资源publicstaticvoidclose(ResultSetrs,Statementstmt,Connectionconn){if(rs!=null){try{rs.close();}catch(SQLExceptione){e.printStackTrace();}}if(stmt!=null){try{stmt.close();}catch(SQLExceptione){e.printStackTrace();}}if(conn!=null){try{conn.close();}catch(SQLExceptione){e.printStackTrace();}}}}使用工具类
Connectionconn=JdbcUtil.getConnection();// ... 执行SQL ...JdbcUtil.close(rs,pstmt,conn);八、SQL 注入问题
- 原因:使用
Statement,把用户输入直接拼接到 SQL 中 - 解决方案:使用
PreparedStatement(预编译)
示例注入:
用户名:' OR '1'='1密码:任意拼接后:
SELECT*FROMuserWHEREusername=''OR'1'='1'ANDpassword='...'直接登录成功!PreparedStatement 可避免。
九、事务管理
JDBC 默认自动提交事务。
手动事务步骤
conn.setAutoCommit(false);开启事务- 执行业务 SQL
- 无异常:
conn.commit(); - 有异常:
conn.rollback();
try{conn.setAutoCommit(false);// 开启// 执行SQL1// 执行SQL2conn.commit();// 提交}catch(Exceptione){conn.rollback();// 回滚}十、数据库连接池(重点)
为什么要用连接池?
- 频繁创建/关闭连接非常消耗资源
- 连接池:预先创建一批连接,重复使用
常用连接池
- Druid(阿里,最常用)
- HikariCP(SpringBoot 默认)
- C3P0
- DBCP
Druid 连接池使用
- 导入 druid 包
- 编写配置文件
druid.properties - 获取连接
配置文件:
driverClassName=com.mysql.cj.jdbc.Driver url=jdbc:mysql:///test?serverTimezone=UTC username=root password=123456 initialSize=5 maxActive=10 maxWait=3000工具类:
importcom.alibaba.druid.pool.DruidDataSourceFactory;importjavax.sql.DataSource;importjava.sql.Connection;importjava.util.Properties;publicclassDruidUtil{privatestaticDataSourceds;static{try{Propertiespro=newProperties();pro.load(DruidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));ds=DruidDataSourceFactory.createDataSource(pro);}catch(Exceptione){e.printStackTrace();}}publicstaticConnectiongetConnection()throwsException{returnds.getConnection();}}十一、JDBC 核心总结(面试/考试必背)
- JDBC 是接口,驱动是实现
- 标准步骤:加载驱动 → 获取连接 → 预处理SQL → 执行 → 处理结果 → 关闭
- PreparedStatement 防SQL注入
- 必须封装工具类
- 事务:开启 → 提交/回滚
- 企业开发必须使用连接池(Druid)
- 资源关闭顺序:ResultSet → Statement → Connection