JDBC:Java数据库操作基础

一、JDBC概述

Java DataBase Connectivity(JDBC) 是Java语言中用于连接和操作关系型数据库的标准API。通过JDBC,开发者可以轻松实现:

  • 建立/关闭数据库连接

  • 执行SQL语句

  • 处理查询结果集

  • 管理数据库事务

为什么需要JDBC?

不同数据库厂商(MySQL/Oracle/SQL Server)底层实现不同,JDBC通过定义统一接口屏蔽数据库差异,开发者只需掌握一套API即可操作各类数据库。


二、JDBC核心接口与类

类/接口作用
DriverManager管理数据库驱动,建立数据库连接
Connection表示与数据库的连接
Statement执行静态SQL语句
PreparedStatement预编译SQL语句,防止SQL注入
ResultSet封装查询结果集

三、JDBC六步开发流程(附代码实战)

步骤1:创建测试数据库

-- 创建员工表
CREATE TABLE emp (
    empno INT PRIMARY KEY,
    ename VARCHAR(50),
    job VARCHAR(50),
    sal DECIMAL(10,2)
);

-- 插入测试数据
INSERT INTO emp VALUES 
(7369, 'SMITH', 'CLERK', 800),
(7499, 'ALLEN', 'SALESMAN', 1600);

步骤2:项目引入MySQL驱动

  1. 下载MySQL Connector/J

  2. Maven项目添加依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
</dependency>

步骤3:完整CRUD示例

public class JDBCTest {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        
        try {
            // 1. 注册驱动(MySQL5.7+可省略)
            Class.forName("com.mysql.cj.jdbc.Driver");
            
            // 2. 获取连接
            String url = "jdbc:mysql://localhost:3306/test?useSSL=false";
            conn = DriverManager.getConnection(url, "root", "root");
            
            // 3. 预编译SQL
            String sql = "INSERT INTO emp(empno, ename, job, sal) VALUES(?,?,?,?)";
            ps = conn.prepareStatement(sql);
            
            // 4. 设置参数
            ps.setInt(1, 7934);
            ps.setString(2, "MILLER");
            ps.setString(3, "CLERK");
            ps.setDouble(4, 1300);
            
            // 5. 执行更新
            int count = ps.executeUpdate();
            System.out.println("插入" + count + "条记录");
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 6. 释放资源(反向关闭)
            try { if(rs != null) rs.close(); } catch (Exception e) {}
            try { if(ps != null) ps.close(); } catch (Exception e) {}
            try { if(conn != null) conn.close(); } catch (Exception e) {}
        }
    }
}

四、防范SQL注入攻击

什么是SQL注入?

通过构造特殊输入参数篡改SQL语义,例如:

SELECT * FROM users 
WHERE username='admin' AND password='' OR '1'='1';

这将绕过密码验证!

解决方案:PreparedStatement

String sql = "SELECT * FROM users WHERE username=? AND password=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, inputUsername);
ps.setString(2, inputPassword);
ResultSet rs = ps.executeQuery();

优势

  1. 预编译SQL模板

  2. 自动处理特殊字符转义

  3. 提升执行效率(重复执行只需编译一次)


五、事务管理与工具类封装

事务ACID特性实现

try {
    conn.setAutoCommit(false); // 关闭自动提交
    
    // 执行多个SQL操作
    updateAccount(conn, "A", -100);
    updateAccount(conn, "B", 100);
    
    conn.commit(); // 提交事务
} catch (Exception e) {
    conn.rollback(); // 回滚事务
}

工具类DBUtil优化

public class DBUtil {
    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(
            "jdbc:mysql://localhost:3306/test", "root", "root");
    }
    
    public static void close(Connection conn, Statement stmt, ResultSet rs) {
        // 统一关闭资源逻辑
    }
}

六、JDBC核心技巧总结

  1. 资源释放:使用try-with-resources自动关闭(Java7+)

  2. 连接池:生产环境推荐使用Druid/HikariCP

  3. ORM框架:进阶学习MyBatis/JPA

  4. 性能优化:批量处理addBatch()/executeBatch()


附录:常见错误排查

  • 驱动问题No suitable driver found → 检查驱动版本和URL格式

  • 时区问题:添加serverTimezone=Asia/Shanghai参数

  • SSL警告useSSL=false禁用(仅测试环境)

掌握JDBC是Java开发者必备的数据库操作技能!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值