2012-02-12 71 views
1

我目前有一个非常基本的应用程序与数据库交互(使用netbeans和jdbc),以便您可以添加团队,球员和分数。我现在需要能够在联盟表/团队(与球员)表等中一起显示来自每个表的项目联盟表 - SQL查询/ JDBC问题

我的问题是我该如何去从表格中检索信息,以及如何显示它,我完全无能为力,应该如何去做。我假设我需要做一个Join或Select语句(我是一个完整的SQL新手),然后使用循环选择每个表项并以某种方式将其显示在表中?

我唯一的当前工作特征是添加到数据库中,IE添加一个新的团队添加一个新的球员等等,显示表格中的内容是我难倒的地方。

任何提示或帮助非常感谢。

我目前使用的代码是这样的; (我仍然需要实现分数表并添加记录,我还使用GUI创建了数据库,因此没有设置外键,是否有办法在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 /导航),但我没有使用构造函数来填充数据库我是使用方法位于一个Main类,这是一个坏方法去事情,因为我没有使用“对象“ 因此?

谢谢。

回答

1

我看到三个表格:PLAYER,TEAM和LEAGUE。

一个团队有很多PLAYER;一个联盟有许多TEAM。这些应该是一对多的关系,所以你会有外键。这里有一个例子:

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

非常感谢您的回答,我不是一个有经验的程序员,所以您的一些答案对我来说没什么意义,我已经扩展了我的问题,如果您可以尝试帮助更多,我会很感激。 – 2012-02-12 22:06:33

+0

帮助你解决更多问题?你有没有看到我为你写的代码?我应该写整个应用程序?我是志愿者,而不是付费顾问。你是新的;投入一些努力去学习。 – duffymo 2012-02-12 22:11:26

+0

我的理解你的答案的问题来自于你正在使用类来填充数据库,并在我原来的应用程序中,我只是在类中使用方法。 在这里你有: '包持久性; public interface PlayerDao {0找不到(Integer id); List find(); 整数保存(播放器p); void update(Player p); void delete(Player p); }' 这些只是我写的方法还是这些现有的命令? 我并不是想表现出忘恩负义,我只是在理解你所写的内容,因为它与我之前所学的内容不同而苦苦挣扎。 – 2012-02-12 22:19:48