2012-01-23 22 views
11

UserDao sayfamda kullanıcı listesini geri vermek istiyorum.Bir liste döndürürseniz, zaten bir rowmapper uygulamamız var

implements RowMapper<User>'un zaten UserRowMapper var.

Bunu nasıl yapabilirim?

Denedim:

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

for(Map row : rows) { 

} 

Ama bir User nesnesi doldurmak ve kullanıcıların listesi listemde eklemek için benim UserRowMapper nasıl kullanılacağını emin değildi.

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

:

BTW, bu şimdiye kullanıyor shoudl iyi jenerik listesidir?

+0

Belki Dozer (veya BeanCopy) belirtilen nesne türüne dönüştürmenize yardımcı olabilir? Onları kontrol et. – panzerschreck

+1

Bir 'ArrayList' çoğu zaman İyi Yeterli (tm) olmalıdır. (Yani, çok çok büyük bir listenin başında/ortasında öğelerin eklenmemesi durumunda.) – millimoose

cevap

32

Kullanım JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args), ve sonuncu argüman (lar) olarak ? tutucuları için bir değerler değişken sayıda geçirebilirsiniz:

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

Ya gibi bir şey:

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

query() yöntemi aslında birçok kez aşırı yüklenmiştir, bu nedenle, herhangi bir durumda ihtiyacınız olan şey için çalışan en az bir lezzet bulabilirsin. deyimi altında Biraz bu soru için geç ama Lambda ifade ve RowMapper ile

+1

Bu mükemmel ve doğru bir örnek, sadece JdbcTemplate ile başlayan insanlar için en son parametresi 'foobar' String'dir, ancak sorgu dizgisi yaptığımızda, tırnak kullanmak zorunda değiliz. Örneğin. Bu doğru 'AND foobar =? ', ancak tırnak işaretleri yanlıştır, örn. bu 'VE foobar = '?'' bir hata verecektir. (belki de bu küçük yorum, birisinin ince bir hatadan kaçınmasına yardımcı olacaktır) –

+0

@DimitryK oyuk nüansı çağrıştırmak için oy verin :) – sciFi

5

Kullanım query() değil queryForList():

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

ancak sqlimde yer tutucularım varsa, "Parametre eklediğim kullanıcılar arasından" * hangilerini seçin? " derleme değil. – Blankman

+1

@Blankman Dokümanlarda listelenen bu yöntem için bir zillion aşırı yükleri hakkında var. Bunlardan biri kesinlikle yer tutucu değerlerini kabul eder. – millimoose

+0

Bingo! QueryForList kullanıyor ve kötü bir sql ifadesi alıyorum. Teşekkürler – 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

Lütfen cevabı açıklayın (ve ingilizce). Sadece kod cevapları bu kadar faydalı değil. – Tom

0

, benzer sorun için benim için çalıştı.

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