【问题标题】:Failed to insert data into mysql using java使用java将数据插入mysql失败
【发布时间】:2018-11-12 20:59:12
【问题描述】:

我尝试使用 java 代码将数据插入 mysql 数据库。我在数据库中建立了一个用户表。用户表有 4 个字段:id、用户名、密码和地址。

mysql> desc user;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| username | varchar(32) | YES  |     | NULL    |                |
| password | varchar(64) | YES  |     | NULL    |                |
| address  | varchar(64) | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

这是我的 java 代码。

    Connection conn = null;
    PreparedStatement stmt = null;
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        String url = "jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC";
        String mysqlUserName = "root";
        String mysqlPassword = "123456";
        conn = DriverManager.getConnection(url, mysqlUserName, mysqlPassword);
        String sql = "INSERT INTO user(username,password,address) VALUES (?,?,?)";
        stmt = conn.prepareStatement(sql);
        stmt.setString(1,"11dsa1");
        stmt.setString(2,"111");
        stmt.setString(3,"111");
        stmt.close();
        conn.close();
    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        try {
            if (conn!=null)
                conn.close();
        }catch (SQLException e){

        }
        try {
            if (stmt!=null)
                stmt.close();
        }catch (SQLException e){

        }
    }

未发生错误。 但是我的数据库中没有数据。

mysql> select * from user; 
Empty set (0.01 sec)

但是我可以通过 shell 插入数据。

mysql> insert into user(username,password,address) values ("aaa","aaa","aaa");
Query OK, 1 row affected (0.09 sec)

mysql> select * from user;
+----+----------+----------+---------+
| id | username | password | address |
+----+----------+----------+---------+
| 22 | aaa      | aaa      | aaa     |
+----+----------+----------+---------+
1 row in set (0.00 sec)

但是id是22而不是1!

其实我之前已经运行了这个java代码21次。我的理解是这段java代码可以将数据插入mysql,但会立即从数据库中删除数据。 我真的无法理解这种荒谬的情况

【问题讨论】:

  • 不处理就不要捕获异常
  • 你永远不会执行准备好的语句
  • 使用 try-with-resources 而不是在 finally 中关闭 Statement 和 Connection
  • 如果在 finally 中关闭语句,则不能在 try 块中关闭它
  • @Jens 感谢您的评论。我会遵守这些规则。

标签: java mysql database jdbc


【解决方案1】:

你没有忘记实际执行语句吗?

在关闭它之前,只需输入stmt.executeUpdate() 就可以了

String sql = "INSERT INTO user(username,password,address) VALUES (?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setString(1,"11dsa1");
stmt.setString(2,"111");
stmt.setString(3,"111");
stmt.executeUpdate()

我还建议您在 finally 块中关闭准备好的语句,或者如果您使用 java 7+,请查看如何将准备好的语句与 try-with-resources here 一起使用。此外,如果您在 finally 块中关闭连接,为什么还要在 try 块中关闭它(最后一个命令)?这绝对是多余的。

一般来说,保持代码整洁可以让您更好地阅读它,从而更好地发现可能存在的问题。

【讨论】:

  • 感谢您的建议。其实我在使用mybatis的时候是无法向mysql插入数据的。然后我写了这个脚本来测试我的数据库链接是否正常。但是我忘了添加 stmt.executeUpdate() 行。根据您的建议,我检查了我之前使用 mybatis 的代码。果然,我忘了加行sqlSession.commit()。
  • 很明显,您的代码试图快速检查某些内容。只是为了强调一点,我仍然相信我对清晰代码的评论是有效的,因为当人们尝试某事时。通常我们会在不清楚这个“东西”是如何工作的或者它是否工作的时候尝试一些东西。我认为已经不够清楚的事情,所以一些东西还隐藏在一个不清楚的代码下。
  • 我还打算写你的代码只有在你为 mysql 启用自动提交的情况下才能工作,否则你需要明确提交,但后来我决定这超出了你的问题的主题.没猜对,对不起,伙计:)
【解决方案2】:

解决方案:

在您的stmt.close() 之前添加这个..

stmt.executeUpdate();

它应该工作!

建议:

另外,如果您使用的是高于 6 的 Java 版本,您应该尝试使用资源方法,以更智能的方式管理关键资源。 !!

【讨论】:

  • executeupdate 必须在 语句关闭之前调用。不是之后。来自javadocThrows: SQLException - if a database access error occurs; this method is called on a closed PreparedStatement or the SQL statement returns a ResultSet object
  • 感谢@Jens 对preparedStaement 的更正,但仔细看,我说的高于6。
  • @user9887555 这是给投反对票的用户,而不是给你 :),作为一项社区工作,对反对票发表评论同样重要,所以我请他们解释他们的投票。 meta.stackexchange.com/questions/135/…
【解决方案3】:

stmt.close(); 之前,添加此stmt.executeupdate();,因为您应该更新您的表,然后您应该更新您的查询。

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 2019-11-17
    • 2018-01-17
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多