微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 MySQL 在 Java 中获取自动递增的 ID?

如何解决如何使用 MySQL 在 Java 中获取自动递增的 ID?

我正在学习一个教程(客户端系统),试图使用 Java 和数据库 MysqL 制作 CRUD 系统。问题是本教程是用 Java/ORACLE 制作的,因此在将客户端添加数据库的部分中,我遇到了一些错误(我在发布之前一直在搜索解决方案,但我不明白如何使其工作)

这是我的代码

public String agregarCliente(Connection con,Cliente cli)
{
    PreparedStatement pst = null;
    String sql = "INSERT INTO clientes (IDCLIENTE,NOMBRES,APELLIDOS,GENERO) "
            + "VALUES(CLIENTE_SEQ.NEXTVAL,?,?)";
    try 
    {
        pst = con.prepareStatement(sql);
        pst.setString(1,cli.getNombres());
        pst.setString(2,cli.getApellidos());
        pst.setString(3,cli.getGenero()+"");
        mensaje = "CLIENTE GUARDADO CORRECTAMENTE";
        pst.execute();
        pst.close();
    } 
    catch (sqlException e) 
    {
        // REST OF THE CODE
    }
    return mensaje;
}

我必须用什么来替换 CLIENTE_SEQ.NEXTVAL ?我无法在 MysqL 中创建序列,也不知道如何获取最新的客户端 ID。考虑 IDCLIENTE 声明为自动递增。

Client Table

如果我只留下 3 个问号 " + "VALUES(?,?)"; " 我得到

 Column count doesn't match value count at row 1

如果我在表格中留下 3 个问号和 3 个值

String sql = "INSERT INTO clientes (NOMBRES,GENERO) "
        + "VALUES(?,?)";

它说客户端已成功添加,但是当我从客户端中选择 * 时;它说它是空的:S

解决方法

最简单的方法就是停止这样做:

String sql = "INSERT INTO clientes (NOMBRES,APELLIDOS,GENERO) "
            + "VALUES(?,?,?)";

SQL 中的列可以有一个“默认”。当您在表中插入新行时,您根本没有包含的任何列都会获得此默认值。这就是为什么 INSERT 语句甚至允许您首先编写列名 - 从技术上讲,您不必这样做,您可以只编写 INSERT INTO clientes VALUES(?,?); - 但这需要您提供所有值,并且大多数 SQL 表都有一个自动递增的主键列,您不想在此处包含该列,因此很少使用并且(正确地)很少出现在 SQL 教程中.

自动自动递增主键总是设置为默认值,本地等效于“给我这个序列的下一个值并递增它”。这就是您所需要的。

当然,一个缺点是您现在不知道您刚刚插入的行的 ID 是什么

对此有解决方案。一般而言,您在这里所做的是原始 JDBC,这不是一个好主意:JDBC 对于“最终用户”来说是一个可怕的 API。这或多或少是设计造成的(JDBC 很旧,从来没有帮助,但大多数情况下,它旨在以一种简单的方式为 JDBC 驱动程序构建者公开任何数据库引擎具有的每个功能,因为目标是成为粘合剂,并且对你来说并不是一个特别好的 API)。使用 JDBIJOOQ,它们是基于 JDBC 构建的好用的库;它们仍然是基于 SQL 的,不像例如Hibernate/JPA 最好被认为是一个面向对象的非 SQL 数据库持久性系统,作为实现细节,您永远不应该混淆,它恰好将内容存储到基于 SQL 的数据库中。

但是,如果您必须:

运行执行命令后:

try (ResultSet gen = pst.getGeneratedKeys()) {
    // voila
}

您可以读取生成的密钥的结果集。

请注意,您的代码轻微损坏并泄漏了资源。使用 ARM(我在上面使用的 try(stuff) {} 构造称为自动资源管理:ARM),就像我在上面对每个资源所做的那样。对于数据库,它是所有资源:Connection 是,PreparedStatement 是,ResultSet 也是! (不过,至少,如果您关闭一个连接,它会关闭您从中创建的所有内容,因此理论上您可以仅 ARM 连接,但它更适合 ARM all 3。

JDBI 和 JOOQ 再次让所有这些事情变得更简单。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?