2012-01-23 43 views
11

在我的UserDao我想返回一个用户列表。我已经有UserRowMapperimplements RowMapper<User>返回一个列表,我已经有一个rowmapper实现

我该怎么做?

我想:

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

for(Map row : rows) { 

} 

,但不知道如何使用我的UserRowMapper来填充用户对象,并将其插入到我的用户名单列表。

顺便说一句,这是我shoudl使用最好的泛型列表:

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

+0

也许推土机(或BeanCopy)可以帮助您转换为指定的对象类型?检查它们。 – panzerschreck

+1

大部分时间'ArrayList'应该足够好(tm)。 (即不在非常非常大的列表的开始/中间插入元素) – millimoose

回答

32

使用JdbcTemplate.query(String sql, RowMapper<T> rowMapper, Object... args),并且可以在数值为?占位符作为最后一个参数(一个或多个)可变数目传:

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

或者例如:

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()方法实际上已经被重载了很多次,所以你通常可以在任何给定的情况下至少找到一种适合你需要的风味。

+1

这是完美正确的例子,只是想突出显示那些以JdbcTemplate开头的人,在查询中最后一个参数foobar是String,但是当我们做查询字符串时,我们不需要使用引号。例如。这是正确的'AND foobar =?',但使用引号是不正确的,例如。这个'和foobar ='?''会产生一个错误。 (也许这个小评论会帮助别人避免一个微妙的错误) –

+0

@DimitryK投票呼吁微妙的细微差别:) – sciFi

5

使用query(),不queryForList()

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

但如果我在我的sql中有占位符,比如''select * from users where id>?'''当我添加参数时,它会怎样不编译。 – Blankman

+1

@Blankman文档中列出的那种方法大约有十亿个重载。其中一个肯定会接受占位符值。 – millimoose

+0

宾果!我正在使用queryForList并得到一个错误的sql语句。谢谢 – 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

请解释你的答案(和*英文)。仅有代码的答案没有帮助。 – Tom

0

有点晚了这个问题,但随着Lambda表达式和RowMapper的,下面的语句为我工作了类似的问题。

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