Java 设置属于另一个类的对象的preparedStatement方法的id

Java 设置属于另一个类的对象的preparedStatement方法的id,java,jdbc,Java,Jdbc,与前面的方法有关。这是我的UserDAO和DaoFactory。UserDao持有daoFactory的一个实例 这是我的UserDAO: public class UsuariousDAO { private static final String SQL_LIST_ALL = "SELECT DISTINCT * " + "FROM usuarios WHERE NOT EXISTS (SELECT * FROM usuarios_g

与前面的方法有关。这是我的UserDAO和DaoFactory。UserDao持有daoFactory的一个实例

这是我的UserDAO:

public class UsuariousDAO {

    private static final String SQL_LIST_ALL =
            "SELECT DISTINCT * "
            + "FROM usuarios WHERE NOT EXISTS (SELECT * FROM usuarios_grupos WHERE usuarios_grupos.id_grupo = ? AND usuarios_grupos.id_usuario = usuarios.id_usuario)";


    private static final String SQL_INSERT =
            "INSERT INTO usuarios (nome, setor, senha, email, bloquear, admin) VALUES (?, ?, ?, ?, ?, ?)";

    private static final String SQL_UPDATE =
            "UPDATE usuario SET nome = ?, setor = ?, senha = ?, email = ?, bloquear = ?, admin = ? WHERE id_usuario = ?";

    private static final String SQL_DELETE =
            "DELETE FROM usuario WHERE id_usuario = ?";

    private DAOFactory daoFactory;

     UsuariousDAO(DAOFactory daoFactory) {
        this.daoFactory = daoFactory;
    }

     public Usuarious find(Integer id) throws DAOExceptions {
        return find(SQL_LIST_BY_ID_GRUPO, id);
    }
我的USERDAO中有以下方法:

private Usuarious find(String sql, Object... values) throws DAOExceptions {

                                CODE
}

 public List<Usuarious> list() throws DAOExceptions {

                               CODE
}

 public List<Usuarious> list(Grupos groups) throws DAOExceptions {

                                   CODE
    }


 public void create(Usuarious user) throws IllegalArgumentException, DAOExceptions {

                              CODE
}


public void update(Usuarious user) throws DAOExceptions {
                                  CODE
}



public void save(Usuarious user) throws DAOExceptions {
        if (user.getId_usuario() == null) {
            create(user);
        } else {
            update(user);
        }
    }


public void delete(Usuarious user) throws DAOExceptions {

                    CODE
}

   private static Usuarious mapUser(ResultSet rs) throws SQLException {
        Usuarious user = new Usuarious(rs.getInt("id_usuario"), rs.getString("nome"), rs.getString("setor"),
                rs.getString("senha"), rs.getString("email"), rs.getString("bloquear"), rs.getString("admin"));
        return user;
    }

} //end of class
以下是我的列表(Grupos grps):

公共列表(Grupos组)引发异常{
连接=空;
PreparedStatement PreparedStatement=null;
ResultSet ResultSet=null;
列表用户=新建ArrayList();
试一试{
connection=daoFactory.getConnection();
preparedStatement=connection.prepareStatement(SQL\u列表\u全部);
setInt(1,groups.getId_grupo());
resultSet=preparedStatement.executeQuery();
while(resultSet.next()){
添加(mapUser(resultSet));
}
}捕获(SQLE异常){
抛出新的异常(e);
}最后{
关闭(连接、准备的报表、结果集);
}
返回用户;
}
我在这里调用我的用户管理bean中的方法:

public List<Usuarious> getListOfUsuarios() throws DAOExceptions {
        List<Usuarious> usuariosList = userDAO.list(grps);
        listOfUsuarios = usuariosList;
        return listOfUsuarios;
    }
public List getListOfUsuarios()抛出异常{
List usuarislist=userDAO.List(grps);
ListofSuarios=通常的列表;
返回Suarios列表;
}
我认为:

     public abstract class DAOFactory  {

        private static final String JNDI_ROOT = "java:comp/env/";

         public static DAOFactory getInstance(String name) throws DAOConfigurationException {
            if (name == null) {
                throw new DAOConfigurationException("Database name is null.");
            }

            String url = "jdbc:mysql://200.230.71.12:3306/social";
            String driverClassName = "com.mysql.jdbc.Driver";
            String password = "1234cinco";
            String username = "cepein";
            DAOFactory instance;

   if (driverClassName != null) {
            try {
                Class.forName(driverClassName);
            } catch (ClassNotFoundException e) {
                throw new DAOConfigurationException(
                    "Driver class '" + driverClassName + "' is missing in classpath.", e);
            }
            instance = new DriverManagerDAOFactory(url, username, password);
        }

        // Else assume URL as DataSource URL and lookup it in the JNDI.
        else {
            DataSource dataSource;
            try {
                dataSource = (DataSource) new InitialContext().lookup(JNDI_ROOT + url);
            } catch (NamingException e) {
                throw new DAOConfigurationException(
                    "DataSource '" + url + "' is missing in JNDI.", e);
            }
            if (username != null) {
                instance = new DataSourceWithLoginDAOFactory(dataSource, username, password);
            } else {
                instance = new DataSourceDAOFactory(dataSource);
            }
        }

        return instance;
    }




  abstract Connection getConnection() throws SQLException;

        // DAO getters --------------------------------------------------------------------------------

        /**
         * Returns the User,Grupos, UserGrupos DAO associated with the current DAOFactory.
         * @return The User,Grupos, UserGrupos DAO associated with the current DAOFactory.
         */


          public UsuariousDAO getUserDAO() {
        return new UsuariousDAO(this);
    }

    public GruposDAO getGruposDAO() {
        return new GruposDAO(this);
    }

    public UsuariousGruposDAO getUsuariousGruposDAO() {
        return new UsuariousGruposDAO(this);
    }

}


class DriverManagerDAOFactory extends DAOFactory {
    private String url;
    private String username;
    private String password;

    DriverManagerDAOFactory(String url, String username, String password) {
        this.url = url;
        this.username = username;
        this.password = password;
    }

    Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
}

/**
 * The DataSource based DAOFactory.
 */
class DataSourceDAOFactory extends DAOFactory {
    private DataSource dataSource;

    DataSourceDAOFactory(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

/**
 * The DataSource-with-Login based DAOFactory.
 */
class DataSourceWithLoginDAOFactory extends DAOFactory {
    private DataSource dataSource;
    private String username;
    private String password;

    DataSourceWithLoginDAOFactory(DataSource dataSource, String username, String password) {
        this.dataSource = dataSource;
        this.username = username;
        this.password = password;
    }

    Connection getConnection() throws SQLException {
        return dataSource.getConnection(username, password);
    }
}
<p:dataTable var="users" value="#{usuariousGruposBean.listOfUsuarios}"
                                 selection="#{users}" selectionMode="single">
                        <p:column headerText="" style="height:0" rendered ="false">
                            <h:outputText value="#{users.id_usuario}"/>
                        </p:column> 

调用此方法时,变量
groups
为空,因此问题出在调用方,而不是这里


preparedStatement.setInt(1,groups.getId_grupo())上的
NullPointerException
表示
preparedStatement
groups
为空(但我们现在
preparedStatement
不为空)。

任一组为空,或者getId\u grupo()的类型为整数,值为空。导致自动取消装箱的int抛出一个NullPointerException。

我不确定它是否那么清晰。在调用方法中,
groups
为null可能是有效的,在这种情况下,
list
方法需要处理这种情况,以避免引发NullPointerException。@AnthonyGrist使用
null
参数调用在语义上没有意义(如果它确实有意义,那么它应该是
list()
); 如果有意义的话,参数可能是“空的”(即在getter上返回
null
)(在本例中,它可能不会)。不管怎么说,这里的问题不是Wheet在语义上是否正确,而是OP不理解它是null。如果groups是null,我必须做什么来解决它?显然,创建Group groups=new groups()并不能解决这个问题。实际上,当我从数据表中选择一个组时,我正试图在我的应用程序中传递组的id。@ShaunK您必须理解问题不在于该方法,因此您必须彻底改变您的问题,并显示您在哪里调用DAO,从哪里获得组对象及其结构。+1对于组,还要检查是否设置了private.getId_grupo()或只是使用静态块打印此int值,以便查看第二个选项的
setInt(int)
so否。@Viruzzo如果为接受int的方法指定了一个整型,则将取消该整型,如果该整型为null,则会导致错误NPE@MarkRotteveel是的,但仅在Java5+中。不,这不是一个自动的假设。尽管我同意自动取消装箱抛出NullPointerException是一种非常烦人的行为,而且它可能非常不可预测。@Viruzzo由于Java 5已经推出7年多了,我不再考虑Java 1.4或更早版本,除非我真的必须:)我同意NPE是烦人的,但它比隐式转换为零更好,因为这可能更加阴险。
<p:dataTable var="users" value="#{usuariousGruposBean.listOfUsuarios}"
                                 selection="#{users}" selectionMode="single">
                        <p:column headerText="" style="height:0" rendered ="false">
                            <h:outputText value="#{users.id_usuario}"/>
                        </p:column>