2012-01-23 9 views
11

मेरे उपयोगकर्ताडाओ में मैं उपयोगकर्ताओं की एक सूची वापस करना चाहता हूं।एक सूची लौटें, मेरे पास पहले से ही एक पंक्तिबद्ध क्रियान्वयन है

मेरे पास पहले से UserRowMapper है जो implements RowMapper<User> है।

मैं यह कैसे कर सकता हूं?

मैंने कोशिश की:

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

for(Map row : rows) { 

} 

लेकिन यह कैसे मेरी UserRowMapper उपयोग करने के लिए एक उपयोगकर्ता वस्तु को पॉप्युलेट और उपयोगकर्ताओं की सूची की मेरी सूची में डालने के लिए यकीन है कि नहीं था।

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

:

BTW, यह सबसे अच्छा सामान्य सूची मैं का उपयोग किया shoudl है?

+0

शायद डोज़र (या बीनकॉपी) आपको निर्दिष्ट ऑब्जेक्ट प्रकार में बदलने में मदद कर सकता है? उन्हें जांचें। – panzerschreck

+1

एक 'ऐरेलिस्ट' ज्यादातर समय पर्याप्त पर्याप्त (टीएम) होना चाहिए। (यानी जब बहुत ही बड़ी सूची की शुरुआत/मध्य में तत्वों को सम्मिलित नहीं किया जाता है।) – 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

यह सही और सही उदाहरण है, जो सिर्फ जेडीबीसी टेम्पलेट से शुरू होने वाले लोगों के लिए हाइलाइट करना चाहता था, क्वेरी में अंतिम पैरामीटर 'foobar' स्ट्रिंग है, लेकिन जब हम क्वेरी स्ट्रिंग करते हैं, तो हमें उद्धरणों का उपयोग करने की आवश्यकता नहीं होती है। उदाहरण के लिए। यह सही है 'और foobar =?', लेकिन उद्धरण का उपयोग गलत है, उदाहरण के लिए। यह 'और foobar = '?' 'एक त्रुटि उत्पन्न करेगा। (हो सकता है कि यह छोटी टिप्पणी किसी को सूक्ष्म बग से बचने में मदद करेगी) –

+0

@ डिमिट्रीक सूक्ष्म बारीकियों को बुलावा देने के लिए वोट दें :) – sciFi

5

उपयोग query(), नहीं queryForList():

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

लेकिन अगर मेरे पास मेरे एसक्यूएल में प्लेसहोल्डर्स हैं, जैसे "आईडी * कहां से चुनें *?" जब मैं पैरामीटर जोड़ता हूं, तो संकलित नहीं करता है। – Blankman

+1

@ ब्लैंकमैन दस्तावेज़ में सूचीबद्ध उस विधि के लिए लगभग एक अरब अधिभार है। उनमें से एक निश्चित रूप से प्लेसहोल्डर मूल्य स्वीकार करता है। – millimoose

+0

बिंगो! मैं queryForList का उपयोग कर रहा था और एक खराब एसक्यूएल कथन प्राप्त कर रहा था। धन्यवाद – 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"))); 
संबंधित मुद्दे