2012-02-12 22 views
1

私は現在、チーム、選手、スコアを追加できるようにデータベース(netbeansとjdbcを使用)とやり取りする非常に基本的なアプリを持っています。リーグテーブル/チーム(プレイヤー付き)テーブルなどに各テーブルのアイテムを一緒に表示できるようにする必要があります。リーグテーブル - SQLクエリ/ JDBCの問題

私の質問はどのようにテーブルから情報を取得するのですか?それはどうやってどうやって行かなければならないのか、私は文字通り断る。私はJoinまたはSelect文(私は完全なSQL初心者です)を実行する必要があると仮定しています。そして、ループを使用して各テーブルエントリを選択し、何らかの形でテーブルに表示しますか?

データベースに追加するのは現在の作業機能だけです。新しいチームを追加して新しいプレーヤーなどを追加して、フォーム上の表に表示されているものが私が困惑している場所を表示します。

ヒントやご協力をいただければ幸いです。

私が現在使用しているコードはこれです。 (スコア表を実装してレコードを追加する必要があります。GUIを使用してデータベースを作成したため、外部キーが設定されていないため、どこにでも「表の作成」コードがないため、 。

package football.game; 
/*import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException;*/ 
import football.game.DBconnection; 
import java.sql.*; 


/** 
* 
* @author Steffan Caine 
*/ 
public class SportsConnection extends DBconnection { 

public SportsConnection(final String dbName) 
{ 
    this.connectDatabase(dbName); 
} 

public void insertPlayer(final Integer PLAYERNUM, 
     final String PLAYERNAME, final String PLAYERPOS, final Integer TEAMNUM) 
{ 
    final String insertStmt = "INSERT INTO APP.PLAYERS (PLAYERNUM, PLAYERNAME, PLAYER_POS, TEAM_ID) VALUES (?,?, ?, ?)"; 
    try 
    { 
     PreparedStatement pstmt = getConnection().prepareStatement(insertStmt); 

     pstmt.setInt(1, PLAYERNUM); 
     pstmt.setString(2, PLAYERNAME); 
     pstmt.setString(3, PLAYERPOS); 
     pstmt.setInt(4, TEAMNUM); 
     pstmt.executeUpdate(); 
    } 
    catch (SQLException sqle) 
    { 
     System.out.println("Exception when inserting player record: " + sqle.toString()); 
    } 
} 

public void insertTeam(final String NAME, final String MANAGER, final int ID) 
{ 
    final String insertStmt = "INSERT INTO APP.TEAMS (TEAMNAME, MANAGER, TEAM_ID) VALUES (?,?, ?)"; 
    try 
    { 
     PreparedStatement pstmt = getConnection().prepareStatement(insertStmt); 

     pstmt.setString(1, NAME); 
     pstmt.setString(2, MANAGER); 
     pstmt.setInt(3, ID); 
     pstmt.executeUpdate(); 
    } 
    catch (SQLException sqle) 
    { 
     System.out.println("Exception when inserting team record: " + sqle.toString()); 
    } 
} 

public void printAllRecords() 
{ 
    this.setQuery(retrieveQuery); 
    this.runQuery(); 
    ResultSet output = this.getResultSet(); 
    try 
    { 
    if (null != output) 
    { 
     while(output.next()) 
     { 

      String PLAYERNUM = output.getString(1); 
      String PLAYERNAME = output.getString(2); 

      System.out.println (PLAYERNUM + "\n" + PLAYERNAME + "\n"); 

     } 
    } 
    } 
    catch (SQLException sqle) 
    { 
     System.out.println("Exception when printing all students: " + sqle.toString()); 
    } 

} 

} 

は「retrieveQueryは」現在、エラーメッセージを返し、仕事にその一部を取得して任意のヘルプは、いくつかの非常に(基本の場合)必要な機能を追加することになり、コンソール内のレコードをプリントアウトとして素晴らしいことだ。

私は各フォーム(AddPlayer/AddTeam/Navigation)のクラスも持っていますが、データベースを生成するためにコンストラクタを使用していません。代わりにMainクラスにあるメソッドを使用しています。 "オブジェクト" など?

ありがとうございました。

答えて

1

PLAYER、TEAM、LEAGUEの3つのテーブルがあります。

チームには多くのプレイヤーがあります。リーグには多くのチームがいます。これらは1対多の関係でなければならないため、外部キーを使用します。ここでは例です:

CREATE TABLE PLAYER (
    int id not null auto increment, 
    first_name varchar(80), 
    last_name varchar(80), 
    int team_id, 
    primary key(id), 
    foreign key(team_id) references TEAM(id) 
); 

CREATE TABLE TEAM (
    int id not null auto increment, 
    name varchar(80), 
    primary key(id) 
); 

ですから、このようなJavaクラスを持っているかもしれません:

package model; 

public class Player { 
    private Integer id, 
    private String name; 
// ctors, getters, etc. 
} 

public class Team { 
    private Integer id, 
    private String name, 
    List<Player> players; 
// ctors, getters, etc. 
} 

あなたはそれにすべてのSQLを持っています永続化層を有しています:

package persistence; 

public interface PlayerDao { 
    Player find(Integer id); 
    List<Player> find(); 
    Integer save(Player p); 
    void update(Player p); 
    void delete(Player p); 
} 

PlayerDaoの実装例を次に示します。

package persistence; 

public class PlayerDaoImpl implements PlayerDao { 
    private static final String SELECT_ALL = "SELECT id, name FROM PLAYER "; 
    private static final String SELECT_BY_ID = SELECT_ALL + "WHERE id = ?"; 

    private Connection connection; 

    public PlayerDaoImpl(Connection connection) { 
     this.connection = connection; 
    } 

    public Player find(Integer id) { 
     Player p = null; 
     PreparedStatement ps = null; 
     ResultSet rs = null; 
     try { 
      ps = this.connection.prepareStatement(SELECT_BY_ID); 
      ps.setInteger(1, id); 
      rs = ps.executeQuery(); 
      while (rs.next()) { 
       Integer pid = rs.getInteger("id"); 
       String name = rs.getString("name"); 
       p = new Player(id, name); 
      } 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } finally { 
      DatabaseUtils.close(rs); 
      DatabaseUtils.close(ps); 
     } 
     return p; 
    } 
} 

コンソールやユーザーインターフェイスのレコードを印刷するのは本当に便利ですが、これは異なるパッケージの異なるクラスで行う必要があります。そのようなことを処理するビュー層があります。クラスは一つのことをうまくやるべきです。アプリケーションを適切にレイヤ化することを検討する必要があります。

+0

あなたの答えは非常にありがたく、私は経験豊富なプログラマーではないので、あなたの答えのいくつかが私にはほとんど意味を持たず、私は質問に答えてくれました。 –

+0

もう少しお手伝いしますか?あなたのために書いたコードを見ましたか?私はアプリ全体を書くはずですか?私は有償コンサルタントではなく、ボランティアです。あなたは新しいです。学ぶ努力をしてください。 – duffymo

+0

あなたの答えを理解する上での私の問題は、クラスを使用してデータベースを生成し、私の元のアプリケーションでクラスのメソッドを使用しているという事実から来ています。 ここには: 'パッケージの永続性; 公開インターフェイスPlayerDao { Player find(整数ID); リスト find(); 整数保存(プレーヤーp); void update(Player p); void delete(プレーヤーp); } ' これらの方法は、私が書いているか、これらの既存のコマンドですか? 私は恩知らずに聞こえることを意味しなかった、私はあなたが以前に学んだこととは違って書いたことを理解することに苦労している。 –