当前位置:首页 > 问答 > 正文

Java连接数据库怎么搞,顺便说说删数据那点事儿到底咋操作比较好

主要整理自《Java核心技术卷II》第4章“数据库编程”、CSDN博客园多篇高赞实践文章以及Oracle官方JDBC教程的核心思路)

直接上干货,Java连数据库就像用手机加别人微信——得先有个连接,然后才能聊天(操作数据),核心就两步:建立连接、执行操作,删数据这事儿得小心,别手滑把家给拆了。

连接数据库:准备三样东西

Java连接数据库怎么搞,顺便说说删数据那点事儿到底咋操作比较好

  1. 找对驱动包:数据库不是Java亲生的,得有个翻译官,MySQL就用mysql-connector-java.jar,Oracle就用ojdbc.jar,这东西得下载下来扔进项目里(比如Maven项目在pom.xml里写个依赖),告诉Java:“喂,翻译官在这儿!”(来源:Maven中央仓库说明文档)
  2. 拼接待机号码:连接数据库需要个地址字符串,叫JDBC URL,格式像这样:jdbc:mysql://localhost:3306/你的数据库名?useSSL=false&serverTimezone=UTC,别怕长,就是告诉Java:“数据库在本地(localhost)的3306端口,名字叫这个,用UTF-8聊天,别整SSL加密那些麻烦事儿。”(来源:MySQL官方文档)
  3. 准备账号密码:就是数据库的用户名和密码,跟登录网站一样。

具体连接代码(以MySQL为例):

// 1. 加载驱动(新版本Java其实可以省略这行,但写上保险)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 拼接待机号码(URL)
String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=Asia/Shanghai";
String user = "root";
String password = "123456";
// 3. 正式建立连接
try (Connection conn = DriverManager.getConnection(url, user, password)) {
    System.out.println("数据库连接成功!");
    // 后面所有操作都写在这个大括号里
} catch (Exception e) {
    e.printStackTrace();
}

(代码逻辑参考自Oracle官方JDBC教程基础示例)

这里用了try-with-resources语法,像个自动管家——无论操作成功失败,它都会帮你自动关闭连接,避免内存泄漏,这是现在最推荐的写法。

Java连接数据库怎么搞,顺便说说删数据那点事儿到底咋操作比较好

删数据那点事儿:重点在“稳”和“准”

删数据最怕什么?一怕删错,二怕删一半断电出bug,所以核心原则是:精确定位,事务兜底

  1. 精确定位:WHERE条件绝不能省 删之前必须明确告诉数据库删哪条。DELETE FROM 表名 WHERE 条件,这个WHERE就是保险栓,比如删用户:“DELETE FROM users WHERE id = 10086”,删之前最好先用SELECT查一下:“SELECT * FROM users WHERE id = 10086”,确认是不是那条“倒霉蛋”。 (来源:《SQL必知必会》第15章关于DELETE的警告)

    Java连接数据库怎么搞,顺便说说删数据那点事儿到底咋操作比较好

  2. 软删除是护身符 如果数据宝贵,最好别真删,给表加个字段,比如is_deleted,默认是0,删数据时只是把这个字段改成1(UPDATE操作),查数据时加上WHERE is_deleted = 0,这样数据还在硬盘里躺着,万一要恢复还能捞回来,很多公司规范都要求重要数据必须软删除。(来源:CSDN博客园《数据库设计中的软删除实践》高赞回答)

  3. 用事务保平安 如果要删多条相关联的数据(比如删用户顺带删他的订单),必须开启事务,事务就像打包快递——要么全部成功发出,要么全部取消,代码长这样:

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    // 关闭自动提交,开启事务
    conn.setAutoCommit(false);
    // 第一条删除:删用户
    String sql1 = "DELETE FROM users WHERE id = ?";
    try (PreparedStatement stmt1 = conn.prepareStatement(sql1)) {
        stmt1.setInt(1, 10086);  // 用问号占位,安全防注入
        stmt1.executeUpdate();
    }
    // 第二条删除:删订单
    String sql2 = "DELETE FROM orders WHERE user_id = ?";
    try (PreparedStatement stmt2 = conn.prepareStatement(sql2)) {
        stmt2.setInt(1, 10086);
        stmt2.executeUpdate();
    }
    // 都没问题?正式提交!
    conn.commit();
    System.out.println("数据删除成功!");
} catch (Exception e) {
    e.printStackTrace();
    // 出错了?全部撤销!
    if (conn != null) {
        try {
            conn.rollback();
            System.out.println("操作已回滚!");
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

(事务处理模式参考自《Java核心技术卷II》4.4节)

关键点:

  • conn.setAutoCommit(false):关掉自动提交,不然每句SQL都直接生效,出事来不及拦。
  • PreparedStatement:一定要用这个代替Statement,它会把参数和SQL指令分开放,彻底防止SQL注入攻击(比如黑客输入' OR '1'='1这种恶意参数)。
  • conn.commit():手动确认提交。
  • conn.rollback():在catch里回滚,就像紧急刹车。

连接数据库是体力活,按步骤走就行,删数据是技术活更是责任心活——能软删不硬删,用WHERE精准定位,多步操作必加事务,正式环境删数据前,最好找同事double-check,或者先备份再操作,毕竟代码跑了还能改,数据删了哭都来不及。