【问题标题】:League Table - SQL Query/JDBC Issue排行榜 - SQL 查询/JDBC 问题
【发布时间】:2012-02-12 21:30:56
【问题描述】:

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

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

我目前唯一的工作功能是添加到数据库中,即添加一个新团队添加一个新玩家等,在表格上显示表格中的内容是我难过的地方。

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

我目前使用的代码是这样的; (我仍然需要实现一个分数表并向其中添加记录,我还使用 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/Navigation),但我没有使用构造函数来填充数据库,而是使用位于 Main 类中的方法,这是我处理事情的坏方法吗不使用“对象”吗?

谢谢。

【问题讨论】:

    标签: java sql jdbc


    【解决方案1】:

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

    一个团队有很多玩家;一个 LEAGUE 有很多 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;
        }
    }
    

    在控制台或用户界面中打印记录确实很有用,但这应该由不同包中的不同类来完成。有一个处理这些东西的视图层。班级应该做好一件事。您应该考虑适当地分层应用程序。

    【讨论】:

    • 非常感谢您的回答,我不是一个经验丰富的程序员,所以您的一些回答对我来说意义不大,我已经扩展了我的问题,如果您可以尝试提供更多帮助,我会很感激的。
    • 帮助你更多?你看到我为你写的代码了吗?我应该编写整个应用程序吗?我是志愿者,不是付费顾问。你是新人;努力学习。
    • 我理解您的答案的问题来自您使用类来填充数据库的事实,而在我的原始应用程序中,我只是在类中使用方法。在这里你有:'包持久性;公共接口 PlayerDao { 玩家查找(整数 id);列表 find();整数保存(玩家 p);无效更新(玩家 p);无效删除(玩家 p); }' 这些只是我要编写的方法还是这些现有的命令?我的意思不是要听起来忘恩负义,我只是在努力理解你写的东西,因为它与我以前没有学到的不同。
    • 专注于方法,而不是拥有它的类。是的,你会写所有这些。没有人把它们给你。
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 2013-04-12
    • 2015-11-22
    • 2021-08-08
    • 2011-09-04
    • 2020-05-26
    • 2014-02-03
    • 2012-03-10
    相关资源
    最近更新 更多