Java建表sql语句

Posted

技术标签:

【中文标题】Java建表sql语句【英文标题】:Java create table sql statement 【发布时间】:2020-12-15 13:25:17 【问题描述】:

我想用这种方法创建一个新的 mysql 表。 数据库连接工作正常。 我做了很多这样的工作声明,但是这个,创建一个表是行不通的。 所以错误必须在这几行代码中。 在底部我添加了错误消息。

 public void createNewTable()
        DatabaseConnection connectNow = new DatabaseConnection();
        Connection connectDb = connectNow.getConnection();
        String tableName = "users";
        try 
               String createTable = "CREATE TABLE ? (firstname varchar(30), lastname varchar(30), tel integer" +
                "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
            PreparedStatement myStmt = connectDb.prepareStatement(createTable);
            myStmt.setString(1, tableName);
            myStmt.executeUpdate();
         catch (Exception e) 
            e.printStackTrace();
            e.getCause();
        

    






 Illegal operation on empty result set.
    java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near ''users' (firstname varchar(30), 
lastname varchar(30), tel integer, email varchar' at line 1

【问题讨论】:

【参考方案1】:

数据库对象名称(包括表名称),不能绑定到占位符。您必须对表名进行硬编码或使用字符串连接。以下将起作用:

try 
    String sql = "CREATE TABLE users (firstname varchar(30), lastname varchar(30), tel integer, " +
                 "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
    PreparedStatement myStmt = connectDb.prepareStatement(sql);
    myStmt.executeUpdate();

catch (Exception e) 
    e.printStackTrace();
    e.getCause();

【讨论】:

谢谢你的回答 :) 但是像这样我对 SQL 注入不安全吗? 不,相反,该语句的外部输入为零,因此它是 100% 免受 SQL 注入的安全。从外部传入表名是不寻常的。我并不是说没有这样的用例,只是在你的情况下它可能表明存在设计问题。 你说得对。但从长远来看,我计划用另一种方法的输入值替换“用户”。这就是我使用准备好的声明的原因。有什么办法可以做到这一点并且仍然可以安全地免受 SQL 注入? 如果这确实是您的要求,那么您将不得不自己消除输入名称。这意味着确保它没有空格,是单个“单词”,并且不是 SQL 关键字等。它仍然存在风险。 好的,非常感谢您的帮助:)。还有一个问题:您的代码示例正在运行,但为什么我会收到此错误消息:“Illegal operation on empty result set.”?【参考方案2】:

您在telemail 列之间缺少,。正如 Tim 在评论中提到的,您应该在 sql 语句本身中使用表名。

你的sql语句应该是

String createTable = "CREATE TABLE your_table_name (firstname varchar(30), lastname varchar(30), tel integer, " + -- added , at the end
                "email varchar(40), arrive_stamp timestamp, quit_stamp timestamp)";
        

【讨论】:

以上是关于Java建表sql语句的主要内容,如果未能解决你的问题,请参考以下文章

在线数据库表(sql语句)生成java实体类工具 - 参考手册

Oracle数据库建表语句连续执行的问题

点评阿里JAVA手册之MySQL数据库 (建表规约索引规约SQL语句ORM映射)

Excel导入数据批量生产建表sql语句

用sql语句建表

oracle建表语句