2012-01-23 5 views
11

В моем UserDao я хочу вернуть список пользователей.Вернуть список, у меня уже есть реализация rowmapper

У меня уже есть UserRowMapper, что implements RowMapper<User>.

Как я могу это сделать?

Я пробовал:

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

for(Map row : rows) { 

} 

Но не был уверен, как использовать мой UserRowMapper для заполнения объекта пользователя и вставить его в мой список Список пользователей.

Кстати, это лучший общий список, который я shoudl использовать:

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

?

+0

Возможно, Dozer (или 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 =?', но использование кавычек неверно, например. этот 'AND foobar = '?'' приведет к ошибке. (может быть, этот небольшой комментарий поможет кому-то избежать тонкой ошибки) –

+0

@ DimitryK проголосовать за то, что вы назвали тонкий нюанс :) – sciFi

5

Использование query(), не queryForList():

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

, но что, если у меня есть заполнители в моем sql, например '' Выберите * от пользователей, где 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

Немного опоздал на этот вопрос, но с лямбда-выражения и RowMapper ниже заявление работал для меня подобной проблемы.

List<User> users = jdbcTemplate.query("select * from users", (rs, rowNum) -> new User(rs.getString("userId"), rs.getString("userName"))); 
Смежные вопросы