我正在尝试用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();
}
}
答案 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