java - (Java) SQL 查询根本不返回任何内容

标签 java sql database bukkit

我的 SQLite 数据库出现问题。简而言之:除了查询之外,一切正常(执行/创建表/...)。

重要:autoCommit = False(但我使用的查询函数不需要它)

代码如下:

---=> 数据库类<=---

package me.Syloh.Core;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import me.Syloh.Core.Customized.LOG;

public class Database {

    public static Connection connection;
    public static String path = "plugins/Core.db";

    public static void setup() throws SQLException, ClassNotFoundException {

        Class.forName("org.sqlite.JDBC");
        connection = DriverManager.getConnection("jdbc:sqlite:" + path);
        connection.setAutoCommit(false);

        DatabaseMetaData metadata = connection.getMetaData();
        ResultSet resultset = metadata.getTables(null, null, "%", null);

        List<String> tables = new ArrayList<String>();      
        while(resultset.next()) {
            tables.add(resultset.getString(3));
            LOG.info("Table '" + resultset.getString(3) + "' has been found.");
        }

        if(!tables.contains("Bans")) {
            execute("CREATE TABLE Bans (player TEXT, date TEXT, sender TEXT, reason TEXT, ip TEXT, time DOUBLE)");
            LOG.info("Table 'Bans' has been created.");
        }

    }

    public static void execute(String execute) {    
        try {

            Statement statement = connection.createStatement();
            statement.execute(execute); 
            statement.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static void execute(List<String> execute) {  
        try {

            Statement statement = connection.createStatement();
            for(String e : execute) { statement.execute(e); }
            statement.close();

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public static ResultSet query(String query) {
        try {

            Statement statement = connection.createStatement();
            ResultSet resultset = statement.executeQuery(query);
            statement.close();
            return resultset;

        } catch (SQLException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void commit() {
        try {
            connection.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

}


---=> Main.class <=---

package me.Syloh.Core;


import java.sql.ResultSet;
import java.sql.SQLException;

import org.bukkit.Bukkit;
import org.bukkit.event.Listener;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.java.JavaPlugin;


public class Main extends JavaPlugin implements Listener {

    Plugin Core = this;

    @Override
    public void onDisable() {
        Database.commit();
    }

    @Override
    public void onEnable() {

        Bukkit.getServer().getPluginManager().registerEvents(this, this);
        try {
            Database.setup();
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(Core, new Runnable() {      
            public void run() {
                Database.commit();
           }
        }, 60L, 4L);

        Database.execute("INSERT INTO Bans VALUES ('hI', 'a', 'b', 'c', 'd', 1)");
        ResultSet rs = Database.query("SELECT * FROM Bans WHERE player = 'hi'");
        try {
            while(rs.next()) {
                System.out.println(rs.getString("player"));
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

我已经使用 SQL 数据库编辑器检查了我的数据库,并且所有插入都已完成。但是当我尝试显示它们时,什么也没有显示。

请帮帮我!提前致谢。

真诚的, 最大

最佳答案

问题是,您正在关闭 语句,这将自动关闭关联的 ResultSet:

Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery(query);
statement.close();  // This is the problem
return resultset;

来自 Statement#close()文档:

When a Statement object is closed, its current ResultSet object, if one exists, is also closed.

话虽如此,你永远不应该在你的方法周围传递你的 ResultSet 对象。这种方式将很难管理资源,因为您必须保持 StatementResultSet 对象跨方法打开。

您应该使用获取 ResultSet 的相同方法构建一些数据结构,然后返回该数据结构。

此外,您应该在 finally block 中关闭资源,例如 ResultSetStatementConnection ,以确保它们始终处于关闭状态,即使在出现异常情况时也是如此。

关于java - (Java) SQL 查询根本不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18166456/

相关文章:

Java IntStream 或 LongStream 按值而不是按元素数限制

mysql - 如何比较一个数据库中两个表的数据

database - Alter table on global temporary table (preserve to delete)

MySQL:语句是否缓存在数据库中?

ios - ios项目的sqlcipher版本迁移

java - 如何使用安卓:layout_weight consistently for all screensizes

java - 如何在 wicket 中本地化 javascript 文件

具有只有一种方法的抽象类的 Java 8 lambda 表达式

mysql - sql查询以获取最大日期比较当前记录日期的值

sql - 将表达式传递给存储过程时, 'minute' 附近的语法不正确