2013-04-05 1 views
1

"Minecraft"게임용 서버 인 Bukkit 플러그인을 프로그래밍하고 있습니다. 나는 SQL을 쓰는 법을 배웠다.MySQL 및 SQLite 클래스

MySQL 및 SQLite에 액세스하기위한 Java 클래스를 찾고 있습니다. 플러그인은 한 번에 하나의 데이터베이스만을 사용하며 설정 파일 인 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"); 

을 사용하지만, 그 코드를 사용하여 여러 개의 쓰레드를 생성하고 나에게 오류를 제공해야합니다. 연결과 진술을 닫을 수있는 수업을 찾아야합니다. 나는 단지 몇 주간 자바를 배우기 때문에 많이 알지 못합니다.

답변

0

ok ... 새로운 작업 코드가 있습니다. 내가 편집 된 :)

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()으로 전화하면됩니다.
또는 스프링의 JdbcTemplate, MyBatis 또는 Hibernate을 사용하십시오. 각각은 앞서 언급 한 프레임 워크 기술 위에 또 다른 추상화 레이어 (및 복잡성)를 추가합니다.

+0

그 코드가 난 단지 사용할 수있는 다른 조금 '기본 = 새로운 DB (이, getDataFolder() + Win32 시스템 + "SQLite.db을");' 그리고 나서 'ResultSet res9 = base.query ("Select blah blah")' 그리고 'Statement.close()'또는 'Connection.close()'를 추가하면 eclipse에서 오류가 발생합니다. res9.close() 만 작동합니다. – user2250333