【问题标题】:Return a list, I already have a rowmapper implementation返回一个列表,我已经有一个rowmapper实现
【发布时间】:2012-02-16 12:26:35
【问题描述】:

在我的 UserDao 中,我想返回一个用户列表。

我已经有一个UserRowMapper 那个implements RowMapper<User>

我该怎么做?

我试过了:

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

for(Map row : rows) {

}

但不确定如何使用我的 UserRowMapper 填充用户对象并将其插入我的用户列表中。

顺便说一句,这是我应该使用的最佳通用列表吗:

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

?

【问题讨论】:

  • 也许推土机(或 BeanCopy)可以帮助您转换为指定的对象类型?请检查它们。
  • ArrayList 在大多数情况下应该足够好(tm)。 (即,当不在一个非常非常大的列表的开头/中间插入元素时。)

标签: java spring generics jdbctemplate


【解决方案1】:

这个问题有点晚了,但是使用 Lambda 表达式和 RowMapper,下面的语句对我来说适用于类似的问题。

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

【讨论】:

    【解决方案2】:
    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);
        }
    }
    

    【讨论】:

    • 请解释你的答案(并用*英文)。仅代码答案没有那么有用。
    【解决方案3】:

    使用JdbcTemplate.query(String sql, RowMapper&lt;T&gt; 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() 方法实际上被重载了很多次,因此您通常可以在任何给定情况下找到至少一种适合您需要的风格。

    【讨论】:

    • 这是一个完美而正确的例子,只是想强调一下以 JdbcTemplate 开头的人,在查询中最后一个参数foobar 是字符串,但是当我们创建查询字符串时,我们不需要使用引号。例如。这是正确的AND foobar=?,但使用引号是不正确的,例如。这个AND foobar='?' 会产生错误。 (也许这个小评论会帮助某人避免一个微妙的错误)
    • @DimitryK 投票赞成指出细微差别:)
    【解决方案4】:

    使用query(),而不是queryForList()

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

    【讨论】:

    • 但是如果我的 sql 中有占位符,比如"Select * from users where id &gt; ?",当我添加参数时,它不会编译。
    • @Blankman 文档中列出的该方法有无数个重载。其中之一肯定接受占位符值。
    • 宾果游戏!我正在使用 queryForList 并得到一个错误的 sql 语句。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2017-09-20
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多