如何解决如何使用 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 声明为自动递增。
如果我只留下 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)。使用 JDBI 或 JOOQ,它们是基于 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 举报,一经查实,本站将立刻删除。