【问题标题】:Creating a Table and insertion data into database not working properly with mysql and java jdbc使用 mysql 和 java jdbc 创建表并将数据插入数据库无法正常工作
【发布时间】:2018-04-22 05:04:38
【问题描述】:

连接类:

我在这里使用了stm.execute,但没有收到错误消息。我也使用了executeUpdate,但我也遇到了错误。

package com.company;
import java.sql.*;
class ConnectionClass {
    private static Connection con = null;
    private static Statement stm = null;
    private  static  ConnectionClass connectionClass;
    public void createConnection() {
      try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mysql", "root", "root");
      }
      catch (Exception e) {
        e.printStackTrace();
      }
    }
    public  void createTable() {
      String Table_Name = "BOOK";
      try {
        stm = con.createStatement();
        DatabaseMetaData dbm = con.getMetaData();
        ResultSet rs =  dbm.getTables(null, null, Table_Name, null);
        if (rs.next()) {
          System.out.println("Table" + Table_Name + "Already created");
        } else {
          String sql = "CREATE TABLE" + Table_Name + "(ID VARCHAR(200), title VARCHAR(200),author varchar(100),publisher varchar(100)";
          stm.executeLargeUpdate(sql);
        }
      } catch (Exception ex) {
        ex.printStackTrace();
      }
    }
    public ConnectionClass() {
      createConnection();
      createTable();
    }
}

主类:

这里我认为主类工作正常。

package com.company;

public class Main {
    public static void main(String[] args) throws Exception {
      ConnectionClass connectionClass = new ConnectionClass();
    }
}

错误:

【问题讨论】:

  • 我知道为什么这个问题被否决了,但我已经投了赞成票。
  • 您使用的是哪个版本的 MySQL Connector/J?
  • 另外,请不要将图像用于错误消息,将异常堆栈跟踪作为文本发布。

标签: java mysql jdbc


【解决方案1】:

executeLargeUpdate 方法是在 Java 8 / JDBC 4.2 中添加的,根据您使用的 MySQL Connector/J 版本中未实现的错误判断。

解决方案很简单:不要使用 API 中的任何 Large 方法,而是使用 executeUpdate,或者 - 在 DML 的情况下更好 - execute。或者,更新到较新版本的 MySQL Connector/J,因为 executeLargeUpdate 在较新版本的 MySQL Connector/J 中实现(例如 5.1.46,但至少为 5.1.37(添加支持的版本))。

您还需要解决语法错误pointed out by Adil

【讨论】:

    【解决方案2】:

    您的查询中有语法错误。您当前的 SQL 查询:

    String sql = "CREATE TABLE" + Table_Name + "(ID VARCHAR(200), title VARCHAR(200),author varchar(100),publisher(100)";
    

    更正的 SQL 查询:

    String sql = "CREATE TABLE" + Table_Name + "(ID VARCHAR(200), title VARCHAR(200),author varchar(100),publisher varchar(100)";
    

    (你要求mysql创建一个列publisher,但是数据类型在哪里?只需指定数据类型就可以了。)

    编辑:

    所以,最后结束这个问题,让我们看看 Ora Docs 对此有什么看法:

    执行大更新:
    default long executeLargeUpdate(String sql) throws SQLException
    

    执行给定的 SQL 语句,可能是 INSERT、UPDATE 或 DELETE 语句或不返回任何内容的 SQL 语句,例如 SQL DDL 语句。 当返回的行数可能超过 Integer.MAX_VALUE - A constant holding the maximum value an int can have, 2^31-1 时,应使用此方法。

    注意:不能在 PreparedStatement 或 CallableStatement 上调用此方法。

    默认实现会抛出 UnsupportedOperationException。从JDK 1.8开始引入该方法

    还要注意文档中所述的上述要点。默认实现是抛出 UnsupportedOperationException。这意味着不同的 JDBC 驱动程序可以有不同的 Statement 类实现。他们可以实现它或不实现它,如果您在第二种情况下调用该方法,该方法将抛出一个UnsupportedOperationException,如文档中所述。

    通过查看此 method 的 oracle 文档,您可以获得有关它的更多信息。所以可能是你使用的驱动版本不支持这种方法,所以请更新到这个驱动的最新版本试试看。

    【讨论】:

    • 它到达了executeLargeUpdate,因为它将执行该语句(如果已实现,则会导致语法错误)。
    • 但是仍然会出现这个问题:在 com.company.ConnectionClass.setBookTable(ConnectionClass.java:69) 在 com.company.ConnectionClass.(ConnectionClass.java:85) 在 com.company .Main.main(Main.java:13)
    猜你喜欢
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多