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】:您在tel
和email
列之间缺少,
。正如 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实体类工具 - 参考手册