Вернуть список, у меня уже есть реализация rowmapper
В моем UserDao я хочу вернуть список пользователей.
У меня уже есть UserRowMapper
, что implements RowMapper<User>
.
Как я могу это сделать?
Я пробовал:
List rows = getJdbcTemplate().queryforList("select * from users");
for(Map row : rows) {
}
Но не был уверен, как использовать UserRowMapper для заполнения объекта User и вставить его в список моих пользователей.
Кстати, это лучший общий список, который я использую:
List<User> users = new ArrayList<User>();
?
Ответы
Ответ 1
Используйте 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()
на самом деле перегружен многократно, поэтому вы обычно можете найти по крайней мере один вкус, который работает для того, что вам нужно в любой конкретной ситуации.
Ответ 2
Используйте query()
, а не queryForList()
:
List<User> users = getJdbcTemplate().query("select * from users", new UserRowMapper());
Ответ 3
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);
}
}
Ответ 4
Немного поздно для этого вопроса, но с выражением Lambda и RowMapper, ниже оператор работал у меня для аналогичной проблемы.
List<User> users = jdbcTemplate.query("select * from users", (rs, rowNum) -> new User(rs.getString("userId"), rs.getString("userName")));