2012-01-23 16 views
11

Nel mio UserDao voglio restituire un elenco di utenti.Restituire una lista, ho già un'implementazione di rowmapper

Ho già un UserRowMapper che implements RowMapper<User>.

Come posso fare questo?

ho provato:

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

for(Map row : rows) { 

} 

ma non era sicuro come usare il mio UserRowMapper per popolare un oggetto utente e inserirlo nella mia lista di List utenti.

BTW, è questo il miglior elenco generico ho shoudl utilizzerò:

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

?

+0

Forse Dozer (o BeanCopy) può aiutarti a convertire il tipo di oggetto specificato? Controllali. – panzerschreck

+1

Un 'ArrayList' dovrebbe essere abbastanza buono (tm) la maggior parte del tempo. (Vale a dire quando non si inseriscono elementi all'inizio/al centro di una lista molto molto grande.) – millimoose

risposta

32

Usa JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args), ed è possibile passare in un numero variabile di valori per i ? segnaposto come ultimo argomento (s):

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

Or qualcosa come:

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 
     ); 
} 

Il metodo query() è in realtà sovraccarico molte volte, quindi di solito è possibile trovare almeno un aroma che funzioni per ciò che è necessario in una determinata situazione.

+1

questo è l'esempio perfetto e corretto, volevo solo evidenziare per le persone che iniziano con JdbcTemplate che nella query l'ultimo parametro 'foobar' è String, ma quando creiamo una stringa di query, NON CI SERVONO di usare virgolette. Per esempio. questo è corretto 'AND foobar =?', ma usare virgolette non è corretto, es. questo 'AND foobar = '?'' produrrà un errore. (forse questo piccolo commento aiuterà qualcuno a evitare un insetto sottile) –

+0

@DimitryK voto per aver richiamato la sottile sfumatura :) – sciFi

5

Usa query(), non queryForList():

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

ma cosa succede se ho segnaposti nel mio sql, come '" Seleziona * dagli utenti dove id>? "' Quando aggiungo parametri, non si compila – Blankman

+1

@Blankman Ci sono circa un sovraccarico di zillion per quel metodo elencato nella documentazione. Uno di questi sicuramente accetta valori segnaposto. – millimoose

+0

Bingo! Stavo usando queryForList e ottenevo una cattiva istruzione sql. Grazie – 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

Per favore spiega la tua risposta (e in * inglese). Le risposte al solo codice non sono così utili. – Tom

0

un po 'tardi per questa domanda, ma con espressione lambda e RowMapper, sotto dichiarazione ha lavorato per me per problema simile.

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