Java 设置属于另一个类的对象的preparedStatement方法的id
与前面的方法有关。这是我的UserDAO和DaoFactory。UserDao持有daoFactory的一个实例 这是我的UserDAO: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
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>