2012-01-23 7 views
11

私のUserDaoでは、ユーザーのリストを返したいと思います。リストを返す、私はすでにローラーマッパーの実装を持っています

UserRowMapperはすでにimplements RowMapper<User>です。

どうすればいいですか?

は、私が試した:

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

for(Map row : rows) { 

} 

しかし、Userオブジェクトを移入し、ユーザーリストの私のリストにそれを挿入するために、私の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つ見つけることができます。ステートメントの下に少しこの質問に遅れが、ラムダ式とRowMapperのと

+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にプレースホルダを持っていますか?コンパイルされません。 – Blankman

+1

@Blankmanドキュメントにリストされているメソッドのための膨大なオーバーロードがあります。そのうちの1人は必ずプレースホルダ値を受け入れます。 – 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

は、同様の問題のために私のために働きました。

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