Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java jdbc创建数据库查询,准备好的语句返回语法错误_Java_Mysql_Jdbc_Prepared Statement - Fatal编程技术网

使用java jdbc创建数据库查询,准备好的语句返回语法错误

使用java jdbc创建数据库查询,准备好的语句返回语法错误,java,mysql,jdbc,prepared-statement,Java,Mysql,Jdbc,Prepared Statement,我试图让Java使用JDBC创建一个数据库,但是我得到了一个语法错误,尽管查询是正确的。例如,如果我将数据库的名称显式写入代码中,它就可以正常工作。这是我的密码: package mysql_manipulator; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class Create { private static fina

我试图让Java使用JDBC创建一个数据库,但是我得到了一个语法错误,尽管查询是正确的。例如,如果我将数据库的名称显式写入代码中,它就可以正常工作。这是我的密码:

package mysql_manipulator;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

public class Create {
    private static final String 
            driver = "com.mysql.jdbc.Driver",
            url = "jdbc:mysql://localhost",
            username = "dylan",
            password = "******";
    private String databaseName;

    public Create (){
        this.databaseName = null;
    }

    public String getDatabaseName() {
        return databaseName;
    }

    public void setDatabaseName(String databaseName) {
        this.databaseName = databaseName;
    }

    public void createDatabase(String databaseName){
        try {
            this.setDatabaseName(databaseName);        
            Class.forName(driver);
            Connection con = DriverManager.getConnection(url,username, 
                password);
            String query = "CREATE DATABASE ?";
            PreparedStatement preparedStmt = con.prepareStatement(query);
            preparedStmt.setString (1,this.getDatabaseName());
            preparedStmt.execute();
            preparedStmt.close();
            con.close();        
        }
        catch (Exception anException){
            System.out.println("Error: " + anException);
        }
    }
}  
我的主课

package mysql_manipulator;

public class Mysql_manipulator {
    public static void main(String[] args) {
        Create myObj = new Create();
        myObj.createDatabase("whatevs");        
    }    
}
错误

Error: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You  have an error in
your SQL syntax; check the manual that corresponds to your  MariaDB server version 
for the right syntax to use near ''whatevs'' at line 1

非常感谢所有知道这为什么不起作用的人——我在网上搜索了很多遍,但都没有结果。

不能将数据库名称作为绑定变量——必须将其嵌入查询文本中。将您的查询改为:

String query = "CREATE DATABASE " + getDatabaseName();
您还可以使用普通的
语句
(而不是
PreparedStatement
)来运行此SQL

Conn = DriverManager.getConnection 
("jdbc:mysql://localhost/?user=root&password=rootpassword"); 
Statement s=Conn.createStatement(); 

int Result=s.executeUpdate("CREATE DATABASE databasename");


不能将数据库名称作为绑定变量--必须将其嵌入查询文本中:
String query=“CREATE database”+getDatabaseName()
;你也可以使用一个简单的
语句来运行这个SQL。真棒-非常感谢Mick。干杯Mick-不知道为什么我自己没有解决这个问题,但你完全正确。有人能解释一下为什么我们不能使用PreparedStatement来创建数据库吗?有什么特别的理由不允许它吗?@itwasntme,prepared语句用于在应用程序生命周期中频繁执行的SQL操作。创建数据库或任何DDL(数据定义语言)操作只应在安装或升级期间执行,因此“准备”语句以供以后使用没有多大用处。此外,这些操作通常不应从用户输入中获取参数,因此也不需要保护SQL注入。