DAO loading data

DAO loading data

我正在尝试使用 DAO 从 MySQL 数据库访问数据。我想输出数据到数组,但我有 java.lang.NullPointerException。请帮我解决这个问题。

PlayersWindow.java

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                PlayersWindow window = new PlayersWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

public PlayersWindow() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
    initialize();
}
    private void initialize() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {

            IDAO dao = DAOFactory.getDAOInstance(TypeDAO.MySQL);
            Player mas[] = dao.loadPlayers(); //HERE IT GIVES NULLPOINTEREXCEPTION

            Object[] headers = { "id", "name", "playing pos", "height", "weight", "nationality", "date birth" };

            model = new DefaultTableModel(headers, 0);   
            model.addRow(mas);
            playersTable = new JTable(model);
}

MeSQLDAO.java

public class MySQLDAO implements IDAO{

    private static String GET_PLAYERS = "SELECT * FROM fbdb.Players";
    Connection con = null;
    public MySQLDAO() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        String url = "jdbc:mysql://localhost/fbdb";
        con = DriverManager.getConnection(url,"root","root"); 
    }

    public Player[] loadPlayers() throws SQLException{

        Player [] mas = null;
        PreparedStatement st = con.prepareStatement(GET_PLAYERS);
        ResultSet rs = st.executeQuery();
        rs.last();
        mas = new Player[rs.getRow()];
        rs.first();
        int i =0;
        while (rs.next()){
            mas[i] = new Player (rs.getInt(1), rs.getString(2), rs.getString(3), rs.getInt(4),
                    rs.getInt(5), rs.getString(6), rs.getDate(7));

            i++;
        }
        return mas; 
    }
}

DAOFactory.java

public class DAOFactory {
    private static IDAO dao = null;
    public static IDAO getDAOInstance(TypeDAO type){
        if(type == TypeDAO.MySQL){
            if(dao == null){
                dao = new MySQLDAO();
            }
            else return dao;    
        }
        return null;
    }
}

IDAO.java

public interface IDAO {

    Player[] loadPlayers() throws SQLException;
    public boolean savePlayer(Player p) throws SQLException;
    public boolean deletePlayer(Player p) throws SQLException;
    Player editPlayer(Player p) throws SQLException;
}

TypeDAO.java

 public enum TypeDAO {
        MySQL;
    }

例外情况:

java.lang.NullPointerException
    at fbApp.PlayersWindow.initialize(PlayersWindow.java:119)
    at fbApp.PlayersWindow.<init>(PlayersWindow.java:91)
    at fbApp.PlayersWindow.run(PlayersWindow.java:70)
    at java.awt.event.InvocationEvent.dispatch(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access0(Unknown Source)
    at java.awt.EventQueue.run(Unknown Source)
    at java.awt.EventQueue.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

问题是您总是在 DaoFactory 中返回 null。以下是修复方法:

public class DAOFactory {
private static IDAO dao = null;
public static IDAO getDAOInstance(TypeDAO type){
    if(type == TypeDAO.MySQL){
        if(dao == null){
            dao = new MySQLDAO();
        }    
    }
    return dao;
}
}

编辑: 这是一个更紧凑的形式:

public class DAOFactory {
  private static IDAO dao = null;
  public static IDAO getDAOInstance(TypeDAO type){
    if((type == TypeDAO.MySQL)&&(dao == null))dao = new MySQLDAO();   
    return dao;
  }
}

更改您的 DAOFactory 实现,如下所示:

public class DAOFactory {
    private static IDAO dao = null;
    public static IDAO getDAOInstance(TypeDAO type){
        if(type == TypeDAO.MySQL){
            if(dao == null){
               return dao = new MySQLDAO();
            }
            else return dao;    
        }
        return null;
    }
}