【问题标题】:Can not create database jdbc [duplicate]无法创建数据库 jdbc [重复]
【发布时间】:2018-05-13 20:47:39
【问题描述】:

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

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    当您使用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

    【讨论】:

      【解决方案2】:

      您不能将参数 (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

      【讨论】:

        猜你喜欢
        • 2018-08-29
        • 2017-05-29
        • 2021-06-14
        • 1970-01-01
        • 1970-01-01
        • 2021-04-21
        • 2012-01-17
        • 2021-06-06
        • 1970-01-01
        相关资源
        最近更新 更多