添加数据问题

添加数据问题

老师,您好!在给goods表添加数据成功后二次运行就会报异常导致程序运行中止,我先知道如何使得添加重复数据程序可以提示已存在并继续执行下去?另外,对数据库表中数据进行增删改查操作后,数据的id能不能重新排序而不会因为删除了中间的一条数据导致id空缺。

下面以我写的代码示例:

import java.sql.*;

/**
 * 对goods表进行CRUD
 */
public class CRUDgoods {

    Connection conn = DButile.getConnection();
    PreparedStatement pstmt = null;
    ResultSet rs = null;

    // 增加数据
    public void create() throws SQLException {
        pstmt = conn.prepareStatement("INSERT INTO goods(id, name, price, desp) VALUES(?, ?, ?, ?)");
        pstmt.setInt(1, 5);
        pstmt.setString(2, "耳机");
        pstmt.setFloat(3, 200f);
        pstmt.setString(4, "蓝牙耳机");

        int ct = pstmt.executeUpdate();
        System.out.println(ct==1? "添加数据成功" : "添加数据失败");
        read();
    }

    // 删除数据
    public void delete() throws SQLException {
        pstmt = conn.prepareStatement("DELETE FROM goods WHERE name=?");
        pstmt.setString(1, "空调");

        int dt = pstmt.executeUpdate();
        System.out.println(dt==1? "删除数据成功" : "删除数据失败");
        read();
    }

    // 修改数据
    public void update() throws SQLException {
        pstmt = conn.prepareStatement("UPDATE goods SET price=? WHERE name=?");
        pstmt.setFloat(1, 1999f);
        pstmt.setString(2, "手机");

        int ut = pstmt.executeUpdate();
        System.out.println(ut==1? "修改数据成功" : "修改数据失败");
        read();
    }

    // 查询数据
    public void read() throws SQLException {
        pstmt = conn.prepareStatement("SELECT * FROM goods");
        rs = pstmt.executeQuery();

        while (rs.next()) {
            Integer id = rs.getInt("id");
            String name = rs.getString("name");
            Float price = rs.getFloat("price");
            String desp = rs.getString("desp");
            System.out.println(id + "-" + name + "-" + price + "-" + desp);
        }
    }

    public static void main(String[] args) {
        CRUDgoods crud = new CRUDgoods();
        try {
            crud.create();
            System.out.println("********************");
            crud.delete();
            System.out.println("********************");
            crud.update();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                DButile.close(crud.conn);
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小小 2022-11-21 13:29:21

同学你好

  1. 建议结合程序运行截图、报错截图来描述问题,以便于问题的准确定位与解答。

  2. 可以使用try...catch语句对异常进行捕获处理,避免出现异常导致程序结束

  3. 为了保证主键的唯一性,设置主键id自增的数据库表删除数据后,自增id也不会自动重新计算的。

  4. 建议选择正确的代码语言后再插入粘贴代码,例如:

    https://img1.sycdn.imooc.com//climg/637b0ca6091aa21501220232.jpg

祝学习愉快~

  • 提问者 hor5 #1

    我的程序运行没有问题,提供的代码只是缺了DButile(conn连接mysql和关闭连接封装内容)。

    我只是想问:如果程序CRUDgoods.java 重复执行对mysql添加已存在的数据,使得程序本身在提示"添加失败"的前提下可以顺利继续执行下去,而不是出现重复添加就报RuntimeException异常中止。这种需求应该通过什么方式实现?

    // DButile.java
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class DButile {
    
        /**
         * 建立mysql数据库连接
         * @return conn
         * @throws SQLException
         */
        public static Connection getConnection() {
            Connection conn = null;
    
            String url = "jdbc:mysql://localhost:3306/jdbcstu?useSSL=false&" +
                    "useUnicode=true&characterEncoding=UTF-8&" +
                    "serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
    
            try {
                return conn = DriverManager.getConnection(url, "root", "ad123456");
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    
        /**
         * 关闭数据库连接
         * @param conn
         * @throws SQLException
         */
        public static void close(Connection conn) throws SQLException {
            if (conn != null && !conn.isClosed()) {
                conn.close();
            }
        }
    }
    // CRUDgoods.java
    import java.sql.*;
    
    /**
     * 对goods表进行CRUD
     */
    public class CRUDgoods {
    
        Connection conn = DButile.getConnection();
        PreparedStatement pstmt = null;
        ResultSet rs = null;
    
        // 增加数据
        public void create() throws SQLException {
            pstmt = conn.prepareStatement("INSERT INTO goods(id, name, price, desp) VALUES(?, ?, ?, ?)");
            pstmt.setInt(1, 5);
            pstmt.setString(2, "耳机");
            pstmt.setFloat(3, 200f);
            pstmt.setString(4, "蓝牙耳机");
    
            int ct = pstmt.executeUpdate();
            System.out.println(ct==1? "添加数据成功" : "添加数据失败");
            read();
        }
    
        // 删除数据
        public void delete() throws SQLException {
            pstmt = conn.prepareStatement("DELETE FROM goods WHERE name=?");
            pstmt.setString(1, "空调");
    
            int dt = pstmt.executeUpdate();
            System.out.println(dt==1? "删除数据成功" : "删除数据失败");
            read();
        }
    
        // 修改数据
        public void update() throws SQLException {
            pstmt = conn.prepareStatement("UPDATE goods SET price=? WHERE name=?");
            pstmt.setFloat(1, 1999f);
            pstmt.setString(2, "手机");
    
            int ut = pstmt.executeUpdate();
            System.out.println(ut==1? "修改数据成功" : "修改数据失败");
            read();
        }
    
        // 查询数据
        public void read() throws SQLException {
            pstmt = conn.prepareStatement("SELECT * FROM goods");
            rs = pstmt.executeQuery();
    
            while (rs.next()) {
                Integer id = rs.getInt("id");
                String name = rs.getString("name");
                Float price = rs.getFloat("price");
                String desp = rs.getString("desp");
                System.out.println(id + "-" + name + "-" + price + "-" + desp);
            }
        }
    
        public static void main(String[] args) {
            CRUDgoods crud = new CRUDgoods();
            try {
                crud.create();
                System.out.println("********************");
                crud.delete();
                System.out.println("********************");
                crud.update();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            } finally {
                try {
                    DButile.close(crud.conn);
                } catch (SQLException e) {
                    throw new RuntimeException(e);
                }
            }
        }
    }

    第一次运行:

    https://img1.sycdn.imooc.com//climg/637af3ff0998f3c306410767.jpg

    第二次运行:(添加重复的数据)

    https://img1.sycdn.imooc.com//climg/637b125f093e70df23690478.jpg

    2022-11-21 13:53:38
  • 好帮手慕小小 回复 提问者 hor5 #2

    同学你好,可以使用try...catch进行异常捕获处理。参考代码如下:

    https://img1.sycdn.imooc.com//climg/637b1a580921c03705720406.jpg

    祝学习愉快~

    2022-11-21 14:28:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师