【问题标题】:Executing a Mysql query without selecting database in java在java中不选择数据库的情况下执行Mysql查询
【发布时间】:2015-03-13 21:35:42
【问题描述】:

我想在不选择 Java 数据库的情况下执行 MySQL 查询。我可以直接在 MySQL 控制台中这样做,例如:

CREATE TEMPORARY TABLE  temptable
As(select REPLACE(a.keywordSupplied,"www.","") as keywordSupplied
from db1.table1 
;

我可以在登录 MySQL 控制台后直接执行上述查询。我这里不使用use 语句

use databasename;

我需要这样做,因为我将在一个查询中从两个不同的数据库中获取数据。 根据http://www.tutorialspoint.com/jdbc/jdbc-create-database.htm,我将 DB URL 设为 jdbc:mysql://localhost/

但它会抛出一个Exception

java.sql.SQLException: No database selected.

在 mysql 控制台中相同的屏幕截图

有什么解决方案可以让它发挥作用?

【问题讨论】:

  • 你可以粘贴你使用的网址吗?
  • @almasshaikh。这是连接 Class.forName("com.mysql.jdbc.Driver"); 的代码 sn-p conn1 = DriverManager.getConnection("jdbc:mysql://localhost/", USER, PASS);
  • 我相信 JDBC 驱动程序本身要求您选择一个数据库(在 JDBC 中您应该使用use database,而是调用setCatalog ,或在连接 URL 中明确指定数据库)。
  • @MarkRotteveel."use databasename" 只是为了解释它是如何在 mysql 控制台上完成的。在 mysql 控制台的情况下,我可以在不选择任何数据库(使用上面引用的语句完成)的情况下进行查询。所以我需要用 JAVA 做同样的事情。
  • “我能够[在不选择数据库的情况下执行查询] 直接在 MySQL 控制台中...” - 我刚刚尝试过,但它不起作用我;我收到“错误 1046 (3D000):未选择数据库”。我怀疑当您通过控制台连接时,正在为您选择一个数据库。试试这个:登录到 MySQL 控制台后,立即运行命令SELECT DATABASE();。如果它返回 NULL 以外的其他内容,那么您实际上确实选择了一个数据库。

标签: java mysql database jdbc


【解决方案1】:

代替

DriverManager.getConnection("jdbc:mysql://localhost/", USER, PASS);

用途:

DriverManager.getConnection("jdbc:mysql://localhost/db1", USER, PASS);//specify the db within URL itself.btw dont you have port in url?

【讨论】:

  • 这是主要问题。我不想选择任何数据库,因为我将从两个数据库中获取数据。所以我需要在不选择数据库的情况下完成整个任务。而且我可以在不选择数据库的情况下进行查询在 mysql 控制台中选择一个数据库。我需要在 JAVA 中做同样的事情。如果我尝试您的解决方案,则会收到错误“Unknown table temptable”。
  • @almasshaikh 如果 URL 中没有指定端口,则使用默认端口:3306。
【解决方案2】:

在您正在学习的教程中,他们发出CREATE DATABASE 声明。此语句是您可以在数据库上下文之外发出的极少数语句之一(我能想到的唯一另一个语句是 CREATE USER)。

即使是TEMPORARY 表也必须附加到数据库。

必须为此操作选择任意数据库。您可能并不特别在意哪一项(只要确保您对您选择的那一项具有写入权限即可:)

如果您真的不想在连接时提供数据库,可以在 SQL 语句中指定目标数据库:CREATE TEMPORARY TABLE [database].temptable

【讨论】:

    【解决方案3】:

    试试这个代码:

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";  
    static final String DB_URL = "jdbc:mysql://localhost:3306/";
    static final String USER = "root";
    static final String PASS = "";
    Class.forName(JDBC_DRIVER);
    System.out.println("Connecting to database...");
    conn = DriverManager.getConnection(DB_URL, USER, PASS);
    System.out.println(conn);
    conn.setCatalog("mysql");
    PreparedStatement stmt1 = conn.prepareStatement("CREATE TEMPORARY TABLE  temptable (select test.a.id as id, students.a.id as sid from test.a join students.a on test.a.id = students.a.id)");
    stmt1.execute();
    stmt1 = conn.prepareStatement("select * from temptable");
    ResultSet set1 = stmt1.executeQuery();
    while(set1.next()){
        System.out.println(set1.getString(1));  
    }
    

    现在您已与数据库服务器建立连接,执行您的查询。我希望您的查询能够顺利执行。

    【讨论】:

    • 我已经完成了。当我尝试执行任何查询时,它会抛出异常'java.sql.SQLException:未选择数据库'
    • 实际上的问题是您正在创建一个始终需要数据库的表。所以不要创建临时表或创建并选择临时数据库,你的临时表将被创建,然后执行你的查询。
    • 我添加了更多代码,它正在执行但出现任何错误。它还在临时表上使用 select 语句显示数据。
    【解决方案4】:

    似乎当您执行“select * from test.demo;”时,它实际上选择了“test”数据库并在“demo”表中进行查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多