Java中的Oracle主键生成器

Posted

技术标签:

【中文标题】Java中的Oracle主键生成器【英文标题】:Oracle primary key generator in Java 【发布时间】:2019-11-28 11:44:09 【问题描述】:

我的应用允许用户创建帐户(存储在数据库中)并下订单。 当客户注册自己时,我想生成一个名为 CLIENT_CODE 的主键来识别他,从 x 值开始并以 y 值递增。 (我使用的是 oracle 11g atm) 到目前为止我已经尝试过了:

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt)                                          
        String fname = jTextField9.getText();
        String lname = jTextField10.getText();
        String city = jTextField11.getText();
        String street = jTextField13.getText();
        String number = jTextField14.getText();
        String userClient = jTextField15.getText();
        String pass1 = String.valueOf(jPasswordField5.getPassword());
        String pass2 = String.valueOf(jPasswordField6.getPassword());

        if(verifyFields())
            if(!checkUsername(userClient))
                OraclePreparedStatement ps;
                OracleResultSet rs;
                String registerClient = "insert into CLIENT (FNAME_CL, LNAME, CITY, STREET, NUMBER, MONEY, CLIENT_CODE, USER_CLIENT, PASS) values (?, ?, ?, ?, ?, ?, ?, ?, ?)";

                try 
                    ps = (OraclePreparedStatement) JavaConnectDb.ConnectDb().prepareStatement(registerClient);
                    ps.setString(1, fname);
                    ps.setString(2, lname);
                    ps.setString(3, city);
                    ps.setString(4, street);
                    ps.setString(5, number);
                    ps.setDouble(6, 0.0);
                    ps.setInt(7, ???); <--- here should be the generated primary key
                    ps.setString(8, userClient);
                    ps.setString(9, pass1);

                    if(ps.executeUpdate() != 0)
                        JOptionPane.showMessageDialog(null, "Account created!");
                     else
                        JOptionPane.showMessageDialog(null, "Error: Check your info");
                    
                 catch (SQLException ex) 
                    Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
                


            
        
     

【问题讨论】:

使用 xCLIENT_CODE 开始您的客户端数据库条目,然后在任何未来的客户端条目上,只需检索 CLIENT_CODE b>CLIENT_CODE 在 last(上一个)数据库条目中使用,并将其递增 y @DevilsHnd 不要那样做;如果两个条目(几乎)同时创建,那么它们都将请求最新的CLIENT_CODE,并且都将尝试设置相同的值。您需要一种自动生成唯一值的方法。 【参考方案1】:

不要在 Java 中这样做;使用sequence 处理数据库中的主键值创建:

CREATE SEQUENCE CLIENT__CLIENT_CODE__SEQ
START WITH 1
INCREMENT BY 1

然后只需在INSERT 语句中使用您的序列,并使用RETURNING clause 获取生成的值作为您准备好的语句的OUT 参数。

insert into CLIENT (
  FNAME_CL,
  LNAME,
  CITY,
  STREET,
  NUMBER,
  MONEY,
  CLIENT_CODE,
  USER_CLIENT,
  PASS
) values (
  ?,
  ?,
  ?,
  ?,
  ?,
  ?,
  CLIENT__CLIENT_CODE__SEQ.NEXTVAL,
  ?,
  ?
) RETURNING CLIENT_CODE INTO ?

如果您使用的是 Oracle 12c,那么您可以在表的 CREATE DDL 语句中使用 GENERATED AS IDENTITY 来生成值,而无需创建单独的序列。

【讨论】:

就是这样。非常感谢!

以上是关于Java中的Oracle主键生成器的主要内容,如果未能解决你的问题,请参考以下文章

Oracle序列和主键映射

在java中 主键生成策略(hibernate)都是指的是id的吗

MyBatis-Oracle生成主键,嵌套对象中的List增加

hibernate中的主键生成策略

hibernate中的主键生成策略

mybatis-plus使用Oracle函数生成主键