代码之家  ›  专栏  ›  技术社区  ›  Franz Biberkopf

JAVA JDBC:为ID列生成的键在表记录中返回null

  •  0
  • Franz Biberkopf  · 技术社区  · 3 年前

    我不熟悉Java,尤其是JDBC。我正在尝试为GUI开发一个简单的DAO实现,在其中填写面板中的字段,并将数据存储在名为EventList的Oracle DB表中。目前,它适用于类Event(Model)的所有字段,但EventID列除外。

    我试图通过语句生成的键生成一个自动递增整数,但是,尽管我尝试了不同的方法来重新组织saveData2()方法中的“INSERT”查询,但记录仍然为空,并且没有生成键。我做错了什么?每一个提示都将不胜感激!

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.ArrayList;
    
    public class EventDAOImpl implements EventDAO {
    
        @Override
        public void saveData2(Event event) {
            OracleDsSingleton ora =   OracleDsSingleton.getInstance();
            int primKey = 0;
            try {
                Connection connection = ora.getConnection();
                String addQuery = "INSERT INTO EventList(EventName, EventPlace, EventDate, EventDescription, EventCategory) VALUES (?,?,?,?,?)";
                //PreparedStatement ptmt = connection.prepareStatement(addQuery, Statement.RETURN_GENERATED_KEYS); 
    //          ResultSet generatedKey = ptmt.getGeneratedKeys();
    //                      if (generatedKey.next()) {
    //              int key = generatedKey.getInt(1);
    //              System.out.println(key);
    //            }
                String columnNames [] = new String [] {"EventId"};
                
                PreparedStatement ptmt = connection.prepareStatement(addQuery, columnNames);
                
                ptmt.setString(1, event.getName());
                ptmt.setString(2, event.getPlace());
                ptmt.setString(3, event.getDate());
                ptmt.setString(4, event.getDescription());
                ptmt.setString(5, event.getCategory());
                
                //ptmt.executeUpdate();
                            
                if(ptmt.executeUpdate() > 0) {
                    java.sql.ResultSet generatedKey = ptmt.getGeneratedKeys();
                    if (generatedKey.next() ) {
                        event.setEventID(generatedKey.getInt(1));
                    }
                }
                System.out.println("Data successfully added!");
                //System.out.println("Table updated with EventID = " + primKey);
                System.out.println(event.getName());
                
                
            } catch (SQLException e) {
                e.printStackTrace();
            }
            
        }
    }
    

    The GUI-Panel

    The EventList Table-Schema

    The stored datas

    1 回复  |  直到 3 年前
        1
  •  0
  •   rzwitserloot    3 年前

    JDBC标准中的大多数内容都是可选的。星展银行可以免费退货 .getGeneratedKeys() .即使你要求。但你没有,所以,还有希望!

    尝试 con.prepareStatement("SQL HERE", Statement.RETURN_GENERATED_KEYS) 第一但是,如果这不起作用,你将付出更多的努力。运行一个查询,从序列中获取下一个值(为了实现这一点,计算出该序列的名称可能是一项艰巨的工作!),然后明确地插入它。希望事情不必发展到这个地步。

    注:现代数据库设计通常抛弃了自动计数ID的概念,因为让计数器与复制的服务器和jazz保持“同步”是一个巨大的难题。如果你还处在这一切的开始阶段,为什么不遵循现代惯例呢?将ID设为UUID,然后让java生成它。它们不再是连续的值,而是随机生成的长字符串(具有足够的位,即使插入数达到万亿,也仍然比不买票而同时被两个单独的流星和闪电击中而中奖的几率更小)。