2012-01-23 26 views
11

Trong UserDao của tôi, tôi muốn trả về một danh sách người dùng.Trả về một danh sách, tôi đã có một bản thực hiện rowmapper

Tôi đã có UserRowMapper rằng implements RowMapper<User>.

Làm thế nào tôi có thể làm điều này?

tôi đã cố gắng:

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

for(Map row : rows) { 

} 

Nhưng không chắc làm thế nào để sử dụng UserRowMapper tôi để cư một đối tượng người dùng và chèn nó vào danh sách các Danh sách người sử dụng.

BTW, đây là danh sách chung tốt nhất mà tôi shoudl được sử dụng:

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

?

+0

Có thể Dozer (hoặc BeanCopy) có thể giúp bạn chuyển đổi thành loại đối tượng được chỉ định? Hãy kiểm tra xem chúng. – panzerschreck

+1

Một 'ArrayList' phải đủ tốt (tm) phần lớn thời gian. (Tức là khi không chèn phần tử ở đầu/giữa danh sách rất rất lớn.) – millimoose

Trả lời

32

Sử dụng JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args), và bạn có thể vượt qua trong một số biến của giá trị cho các ? placeholders như là đối số cuối cùng (s):

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

Hoặc một cái gì đó như:

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

Phương pháp query() thực sự bị quá tải nhiều lần, vì vậy bạn thường có thể tìm thấy ít nhất một hương vị phù hợp với những gì bạn cần trong bất kỳ tình huống cụ thể nào.

+1

đây là ví dụ hoàn hảo và chính xác, chỉ muốn đánh dấu cho những người bắt đầu với JdbcTemplate rằng trong truy vấn tham số cuối cùng 'foobar' là String, nhưng khi chúng ta tạo chuỗi truy vấn, chúng ta KHÔNG CẦN sử dụng dấu ngoặc kép. Ví dụ. điều này đúng 'AND foobar =?', nhưng việc sử dụng dấu ngoặc kép là không chính xác, ví dụ: 'AND foobar ='? ''sẽ sinh ra lỗi. (có thể nhận xét nhỏ này sẽ giúp ai đó tránh được một lỗi nhỏ) –

+0

@DimitryK bỏ phiếu để gọi ra sắc thái tinh tế :) – sciFi

5

Sử dụng query(), không queryForList():

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

nhưng nếu tôi có phần giữ chỗ trong sql của mình, như '" Chọn * từ người dùng trong đó id>? "' Khi tôi thêm tham số, không biên dịch. – Blankman

+1

@Blankman Có khoảng một trăm tình trạng quá tải cho phương pháp được liệt kê trong tài liệu. Một trong số họ chắc chắn chấp nhận các giá trị giữ chỗ. – millimoose

+0

Bingo! Tôi đã sử dụng queryForList và nhận được một tuyên bố sql xấu. Cảm ơn bạn – 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

Vui lòng giải thích câu trả lời (và bằng tiếng *). Câu trả lời chỉ có mã không hữu ích. – Tom

0

Một chút trễ cho câu hỏi này, nhưng với biểu thức Lambda và RowMapper, câu lệnh bên dưới làm việc cho tôi cho vấn đề tương tự.

List<User> users = jdbcTemplate.query("select * from users", (rs, rowNum) -> new User(rs.getString("userId"), rs.getString("userName"))); 
Các vấn đề liên quan