2013-04-05 35 views
1

我正在爲「Minecraft」遊戲編寫一個Bukkit插件,一個服務器。我不知道如何編寫SQL,只是一些語法。MySQL和SQLite的類

我在尋找Java類來訪問MySQL和SQLite。該插件一次只能使用一個數據庫,在配置文件,MySQL或SQLite中設置。

我發現這一點:

import java.io.*; 
import java.sql.*; 
import java.util.logging.*; 
import org.bukkit.plugin.*; 

public class Db { 
    private final Plugin plugin; 
    private final String url; 
    private Logger log; 
    Connection connection = null; 
    ResultSet resultSet = null; 
    Statement statement = null; 

    public Db(final Plugin plugin, final String host, final String database, 
      final String user, final String password) { 
     this.plugin = plugin; 
     url = "jdbc:mysql://" + host + "/" + database + "?user=" + user 
       + "&password=" + password; 
     log = plugin.getServer().getLogger(); 
     initDriver("com.mysql.jdbc.Driver"); 
    } 

    public Db(final Plugin plugin, final String filePath) { 
     this.plugin = plugin; 
     url = "jdbc:sqlite:" + new File(filePath).getAbsolutePath(); 
     log = plugin.getServer().getLogger(); 
     initDriver("org.sqlite.JDBC"); 
    } 

    private void initDriver(final String driver) { 
     try { 
      Class.forName(driver); 
     } catch (final Exception e) { 
      log.severe("Database driver error:" + e.getMessage()); 
     } 
    } 

    public int resultInt(ResultSet result, int column) { 
     if (result == null) 
      return 0; 
     try { 
      result.next(); 
      int integer = result.getInt(column); 
      result.close(); 

      return integer; 
     } catch (SQLException e) { 
      log.severe("Database result error: " + e.getMessage()); 
     } 
     return 0; 
    } 

    public String resultString(ResultSet result, int column) { 
     if (result == null) 
      return null; 
     try { 
      result.next(); 
      String string = result.getString(column); 
      result.close(); 
      return string; 
     } catch (SQLException e) { 
      log.severe("Database result error: " + e.getMessage()); 
     } 
     return null; 
    } 

    public ResultSet query(final String query) { 
     return query(query, false); 
    } 

    public ResultSet query(final String query, final boolean retry) { 
     try { 
      final Connection connection = DriverManager.getConnection(url); 
      final PreparedStatement statement = connection 
        .prepareStatement(query); 
      if (statement.execute()) 
       return statement.getResultSet(); 
     } catch (final SQLException e) { 
      final String msg = e.getMessage(); 
      log.severe("Database query error: " + msg); 
      if (retry && msg.contains("_BUSY")) { 
       log.severe("Retrying query..."); 

       plugin.getServer().getScheduler() 
         .scheduleSyncDelayedTask(plugin, new Runnable() { 
          @Override 
          public void run() { 

           query(query); 
          } 
         }, 20); 
      } 
     } 
     return null; 
    } 
} 

但我不知道如何關閉連接和語句。 在這段代碼中,我必須使用

base = new Db(this, getDataFolder() + File.separator + "SQLite.db"); 

但使用的代碼創建多個線程,並且給了我的錯誤。我必須找到一個可以關閉連接和聲明的課程。我只學了幾個星期的Java,而且我不太瞭解。

回答

0

好的...我有新的工作代碼。我編輯舊:)

import java.io.*; 
import java.sql.*; 

public class Db { 
    private final String url; 
    ResultSet resultSet = null; 
    Statement statement = null; 
    final String driver; 
    String user = ""; 
    String database = ""; 
    String password = ""; 
    String port = ""; 
    String host = ""; 
    Connection c = null; 

    public Db(String Host, String db, String username, String password) { 
     this.host = Host; 
     this.database = db; 
     this.user = username; 
     this.password = password; 
     url = "jdbc:mysql://" + host + "/" + database + "?user=" + user 
       + "&password=" + password; 
     driver = ("com.mysql.jdbc.Driver"); 
    } 

    public Db(String filePath) { 
     url = "jdbc:sqlite:" + new File(filePath).getAbsolutePath(); 
     driver = ("org.sqlite.JDBC"); 
    } 

    public Connection open() { 
     try { 
      Class.forName(driver); 
      this.c = DriverManager.getConnection(url); 
      return c; 
     } catch (SQLException e) { 
      System.out 
        .println("Could not connect to MySQL/SQLite server! because: " 
          + e.getMessage()); 
     } catch (ClassNotFoundException e) { 
      System.out.println("JDBC Driver not found!"); 
     } 
     return this.c; 
    } 

    public boolean checkConnection() { 
     if (this.c != null) { 
      return true; 
     } 
     return false; 
    } 

    public Connection getConn() { 
     return this.c; 
    } 

    public void closeConnection(Connection c) { 
     c = null; 
    } 
} 
2

我建議你至少讀一下the Java Tutorials: JDBC Basics。幾乎所有的解釋在那裏...

簡短的回答是:只需撥打ResultSet.close(),Statement.close(),Connection.close()在完成每個對象的工作後。
或者使用Spring的JdbcTemplate,MyBatisHibernate,其中每個在上述框架技術的基礎上增加了另一層抽象(和複雜性)。

+0

該代碼是有點不同我只能用 '鹼基=新DB(此,getDataFolder()+文件分割符+ 「SQLite.db」);' 然後只是 'ResultSet res9 = base.query(「Select blah blah」)' 如果我添加'Statement.close()'或'Connection.close()',那麼在eclipse中是一個錯誤。只有res9.close()有效。 – user2250333 2013-04-05 22:17:18