2012-02-12 3 views
1

현재 팀, 선수 및 점수를 추가 할 수 있도록 데이터베이스와 상호 작용하는 매우 기본적인 응용 프로그램 (netbeans 및 jdbc 사용)이 있습니다. 이제 리그 테이블/팀 (플레이어 포함) 테이블 등에서 각 테이블의 항목을 표시 할 수 있어야합니다.리그 테이블 - SQL 쿼리/JDBC 문제

내 질문은 테이블에서 정보를 검색하는 방법과 어떻게 표시합니까? 나는 그것에 대해 어떻게 가야하는지에 관해서는 말 그대로 사실이 아니다. Join 또는 Select 문 (완전한 SQL 초보자)을 수행하고 루프를 사용하여 각 테이블 항목을 선택하고 테이블에 표시하는 방법이 필요하다고 가정합니다.

내가 데이터베이스에 추가하는 유일한 현재 작업 기능은 새 팀을 추가하여 양식에있는 테이블에 표시되는 내용을 표시하는 것입니다.

모든 도움말이나 도움을 주시면 감사하겠습니다.

현재 사용중인 코드는 다음과 같습니다. (나는 여전히 스코어 테이블을 구현하고 거기에 레코드를 추가 할 필요가있다. GUI를 사용하여 datbase를 생성 했으므로 외래 키를 설정하지 않아도 아무데도 "Create Table"코드가 없기 때문에 netbeans에서 수행 할 수있다. .

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의 세 테이블이 있습니다.

팀에는 많은 플레이어가 있습니다. 리그에는 많은 팀이 있습니다. 이들은 일대 다 관계 여야하므로 외래 키를 사용할 수 있습니다.

package persistence; 

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

:

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을하는 영속 계층이있을 것이다 :

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) 
); 

그래서이 같은 자바 클래스가있을 수 있습니다 : 다음은 그 예이다 다음은 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

당신의 대답을 이해하는데있어서 나의 문제는 당신이 데이터베이스를 채우는 데 클래스를 사용한다는 사실과 원래의 어플리케이션에서 나는 단지 클래스 내의 메소드를 사용하고 있다는 사실에서 비롯된다. 여기 있습니다 : 'package persistence; 공개 인터페이스 PlayerDao { Player find (정수 ID); 목록 find(); 정수 저장 (플레이어 p); void update (Player p); void delete (플레이어 p); } ' 작성하려는 기존의 명령이거나 기존 명령입니까? 나는 배은망덕 한 말을하지 않았다. 나는 이전에 배웠던 것과는 다른 점에서 당신이 쓴 것을 이해하는 데 어려움을 겪고있다. –