无法创建数据库jdbc

时间:2018-05-13 20:47:40

标签: java mysql jdbc

我正在尝试用java jdbc创建一个带有方法的数据库,所以我将数据库的名称类型string作为参数传递给数据库,但我遇到的问题是<你在SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以便在第1行的“代数”附近使用正确的语法

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

public class DbTest {
private Connection connection;
public void createDb(String name) throws SQLException {
    connection = DriverManager.getConnection
            ("jdbc:mysql://localhost/?user=root&password=root");

    String createDbSql = "CREATE DATABASE IF NOT EXISTS ?";
    PreparedStatement createDbStat = connection.prepareStatement(createDbSql);
    createDbStat.setString(1,name);
    createDbStat.executeUpdate();
}

DbTest() {
    try {
        createDb("Algebra");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

public static void main(String[] args) {
    new DbTest();
}
}

2 个答案:

答案 0 :(得分:2)

当您使用createDbStat.setString(1, name);时,它会创建如下查询:

CREATE DATABASE IF NOT EXISTS 'databasename'
//----------------------------^____________^

这是一个错误的语法,正确的应该是:

CREATE DATABASE IF NOT EXISTS databasename

解决您的问题,您可以使用:

String createDbSql = String.format("CREATE DATABASE IF NOT EXISTS `%s`", name);
//                                                                ^^^^
PreparedStatement createDbStat = connection.prepareStatement(createDbSql);
//createDbStat.setString(1,name); no need for this
createDbStat.executeUpdate();

出于安全原因

出于安全原因,为了避免SQL注入,请确保您的数据库名称与此匹配:

if(name.matches("^[a-zA-Z_][a-zA-Z0-9_]*$")){
   //Correct name
}

有关详细信息,请阅读此Check for valid SQL column name

答案 1 :(得分:1)

您无法将参数(1)绑定到数据库名称 - 在这种情况下,你将不得不使用字符串连接。

您的问题也类似于

How to use a tablename variable for a java prepared statement insert

CREATE DATABASE query using java jdbc and prepared statement returns syntax error