2012-01-23 12 views
11

En mi UserDao quiero devolver una lista de usuarios.Devolver una lista, ya tengo una implementación de rowmapper

Ya tengo un UserRowMapper que implements RowMapper<User>.

¿Cómo puedo hacer esto?

me trataron:

List rows = getJdbcTemplate().queryforList("select * from users"); 

for(Map row : rows) { 

} 

Pero no estaba seguro de cómo utilizar mi UserRowMapper para rellenar un objeto Usuario e insertarlo en mi lista de lista de usuarios.

Por cierto, este es el mejor lista genérica que shoudl a utilizar:

List<User> users = new ArrayList<User>(); 

?

+0

¿Tal vez Dozer (o BeanCopy) podría ayudarle a convertir al tipo de objeto especificado? Verifícalos. – panzerschreck

+1

Un 'ArrayList' debe ser suficientemente bueno (tm) la mayor parte del tiempo. (Es decir, cuando no inserte elementos al principio/en el medio de una lista muy, muy grande.) – millimoose

Respuesta

32

Uso JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args), y se puede pasar en un número variable de valores para los ? marcadores de posición como el último argumento (s):

public List<User> findById(int userId) 
{ 
    return getJdbcTemplate().query(
      "SELECT * FROM users WHERE user_id=?", 
      new UserRowMapper(), 
      userId 
     ); 
} 

O algo como:

public List<User> findByManyParams(int param1, int param2, String param3) 
{ 
    return getJdbcTemplate().query(
      "SELECT * FROM users WHERE foo=? AND bar=? AND foobar=?", 
      new UserRowMapper(), 
      param1, 
      param2, 
      param3 
     ); 
} 

El método query() en realidad está sobrecargado muchas veces, por lo que generalmente puede encontrar al menos un sabor que funcione para lo que necesita en cualquier situación dada.

+1

este es el ejemplo perfecto y correcto, solo quería resaltar para las personas que comienzan con JdbcTemplate que en la consulta el último parámetro 'foobar' es Cadena, pero cuando hacemos una cadena de consulta, NO NECESITAMOS usar comillas. P.ej. esto es correcto 'AND foobar =?', pero usar comillas es incorrecto, ej. este 'AND foobar = '?'' arrojará un error. (tal vez este pequeño comentario ayudará a alguien a evitar un error sutil) –

+0

@DimitryK vote por llamar el matiz sutil :) – sciFi

5

Uso query(), no queryForList():

List<User> users = getJdbcTemplate().query("select * from users", new UserRowMapper()); 
+1

, pero ¿qué sucede si tengo marcadores de posición en mi sql, como '" Seleccione * de usuarios donde id>? "' Cuando agregue parámetros, no compila – Blankman

+1

@Blankman Hay un billón de sobrecargas para ese método enumerado en la documentación. Uno de ellos seguramente acepta valores de marcador de posición. – millimoose

+0

¡Bingo! Estaba usando queryForList y obteniendo una mala declaración SQL. Gracias – Aggressor

1
public class UsuarioBean { 

    int idUsuario; 
    String userName; 
    String clave; 
    String nombres; 
    String paterno; 
    String materno; 
    String correo; 
    String direccion; 
    String telefono; 
    String estado; 
    Date fec_alta; 

    //...... 
} 

//la interface RowMapper del modulo Spring JDBC 
public class UsuarioMapper implements RowMapper<UsuarioBean>{ 

    public UsuarioBean mapRow(ResultSet rs, int rowNum) throws SQLException { 
     UsuarioBean usuario = new UsuarioBean(); 
     //se esta realizando el mapeo del bean con las columnas de BD manualmente 
     usuario.setIdUsuario(rs.getInt("id_usuario")); 
     usuario.setUserName(rs.getString("username")); 
     usuario.setClave(rs.getString("clave")); 
     usuario.setNombres(rs.getString("nombres")); 
     usuario.setPaterno(rs.getString("paterno")); 
     usuario.setMaterno(rs.getString("materno")); 
     usuario.setCorreo(rs.getString("correo")); 
     usuario.setDireccion(rs.getString("direccion")); 
     usuario.setTelefono(rs.getString("telefono")); 
     usuario.setEstado(rs.getString("estado")); 
     usuario.setFec_alta(rs.getDate("fec_alta")); 
     return usuario; 
    } 
} 

public interface UsuarioDao{ 
    List<UsuarioBean> listarUsuarios(); 

    UsuarioBean obtenerUsuario(int idUsuario); 

    int crearUsuario(UsuarioBean usuario); 

    int modificarUsuario(UsuarioBean usuario); 

    int eliminarUsuario(int idUsuario); 
} 

@Repository//con esto lo subimos al Spring Container 
public class UsuarioDaoImpl implements UsuarioDao{ 

    @Autowired//con esto estamos inyectando UsuarioDaoImpl el jdbcTemplate 
    private JdbcTemplate jdbcTemplate; 

    @Override 
    public List<UsuarioBean> listarUsuarios(){ 
     String sql="SELECT * FROM USUARIO"; 
     return jdbcTemplate.query(sql, new UsuarioMapper()); 
    } 

    @Override 
    public UsuarioBean obtenerUsuario(int idUsuario){ 
     String sql="SELECT * FROM USUARIO WHERE ID_USUARIO=?"; 
     return jdbcTemplate.queryForObject(sql, new Object[]{idUsuario},new UsuarioMapper()); 
    } 

    @Override 
    public int crearUsuario(UsuarioBean usuario){ 
     String sql="INSERT INTO USUARIO(username,clave,nombres,paterno,materno,correo,direccion,telefono,fec_alta,estado) VALUES (?,?,?,?,?,?,?,?,?,?)"; 
     Object[] params=new Object[]{usuario.getUserName(),usuario.getClave(),usuario.getNombres(),usuario.getPaterno(),usuario.getMaterno(),usuario.getCorreo(),usuario.getDireccion(),usuario.getTelefono(),this.convertirFecha(usuario.getFec_alta()),usuario.getEstado()}; 
     return jdbcTemplate.update(sql,params); 
    } 

    @Override 
    public int modificarUsuario(UsuarioBean usuario){ 
     String sql="UPDATE USUARIO SET username=?,clave=?,nombres=?,paterno=?,materno=?,correo=?,direccion=?,telefono=?,estado=? WHERE ID_USUARIO=?"; 
     Object[] params=new Object[]{usuario.getUserName(),usuario.getClave(),usuario.getNombres(),usuario.getPaterno(),usuario.getMaterno(),usuario.getCorreo(),usuario.getDireccion(),usuario.getTelefono(),usuario.getEstado(),usuario.getIdUsuario()}; 
     return jdbcTemplate.update(sql,params); 
    } 

    @Override 
    public int eliminarUsuario(int idUsuario){ 
     String sql="DELETE FROM USUARIO WHERE ID_USUARIO=?"; 

     return jdbcTemplate.update(sql,new Object[]{idUsuario}); 
    } 

    public java.sql.Date convertirFecha(java.util.Date fecha){ 
     return new Date((Objects.nonNull(fecha))?fecha.getTime():null); 
    } 
} 
+1

Por favor explique su respuesta (y en * Inglés). Las respuestas de solo código no son tan útiles. – Tom

0

Un poco tarde para esta pregunta, pero con la expresión Lambda y RowMapper, la siguiente declaración funcionó para mí para un problema similar.

List<User> users = jdbcTemplate.query("select * from users", (rs, rowNum) -> new User(rs.getString("userId"), rs.getString("userName"))); 
Cuestiones relacionadas