style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

sentencias SQL java

Hola a Todos de nuevo yo preguntando esto: actualmente estoy usando jdbc Puro!!!, para hacer la labor a la bd mi duda es cuando utilizo un preparedStatement en una sentencia LIKE, jamas me regresa resultados, en cambio si en lugar de usar un prepared utilizo la concatenacion de la cadena funciona sin problemas alguna idea?

 if (!searchDTO.getFiltro().equals("")) {
                    Sql.append(" WHERE PRO_COD IN(").append(searchDTO.getFiltro()).append(") ");
                    if(!searchDTO.getDescFiltro().equals("")){
                        Sql.append("AND PRO_DES LIKE ").append("'%"+searchDTO.getDescFiltro().toUpperCase().trim()+"%'");
                    }
                }

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

comillas

Ese objeto Sql es una clase? porque empieza con mayúscula... o es un StringBuilder? no es recomendable que armes SQL así a mano. Imagínate qué pasa si searchDTO.getDescFiltro() devuelve lo que el usuario haya tecleado y no lo validas? Si el usuario pone '; DELETE FROM TABLA;-- te borran todos los datos de la tabla (no veo el nombre de la tabla en tu código pero si eso se ejecuta, es cosa de empezarle a poner nombres de las tablas del sistema para borrarlas, o simplemente ejecutar queries distintos, o bien unos UPDATES, etc). La cosa es que ese código es vulnerable a inyección de SQL. Usa PreparedStatements.

Si tuvieras un PreparedStatement con el SQL SELECt...WHERE PRO_COD IN(?) AND PRO_DES_LIKE ? (el cual pudiste haber armado con un StringBuilder, pero no insertas los parámetros directamente en el texto de SQL entonces simplemente le haces después:

stmt.setString(1, searchDTO.getFiltro());
stmt.setString(2, "%" + searchDTO.getDescFiltro().toUpperCase().trim() + "%");

y eso te encuentra cualquier cosa (incluyendo el SQL malicioso que describí al principio; lo busca en el campo PRO_DES, no lo ejecuta).

No nos dices como haces ese

No nos dices como haces ese like con prepared statements que jamás regresa resultados, pero básicamente haz lo que menciona ezamudio:

PreparedStatement pstmt = ....

....
..
pstmt.setString( index,  "%"+aBuscar+"%");

O sea pon el % en el "setString"

Imagen de beto.bateria

Un ejemplo de

Un ejemplo de PreparedStatement.

public class StatementEmployee implements Statementable {

        PreparedStatement statement;   

        public ResultSet setStatement(Connection conn, Employee employee)
                        throws SQLException {
       
                statement = conn.prepareStatement("SELECT employee, message FROM employees WHERE employee= ? AND message = ?");
                statement.setString(1, employee.getFirstName());
                statement.setString(2, employee.getPassword());
               
                return statement.executeQuery();
        }

        public void close() throws SQLException{
               
                if (statement != null){
                        statement.close();
                }
        }
}

Espero te sirva.

Imagen de francisco.santiagoj

Lo mismo pero con JdbcTemplate

Que tal,

Saben como hacer lo arriba mencionado pero con JdbcTemplate, estoy intentando lo siguiente pero no resulta.

StringBuilder sql = new StringBuilder();               
sql.append("SELECT * FROM tabla WHERE campo_varchar = '?' ;");
List<Objeto> lista = jdbcTemplate.query(sql.toString(),new Object[] {new String("02234"}, new RowMapper<Objeto>(){
.......
};

La pagina me manda un rotundo java.lang.NullPointerException

De antemano gracias.

Imagen de francisco.santiagoj

Me respondo

El problema es que no lleva comillas entre el signo de interrogación, quedando

StringBuilder sql = new StringBuilder();               
sql.append("SELECT * FROM tabla WHERE campo_varchar = ?;");                            
List<Objeto> lista = jdbcTemplate.query(sql.toString(), new Object[] {new String("02234"},new RowMapper<Objeto>(){

Saludos

Imagen de ingscjoshua

Gracias a todos

Gracias a todos efectivamente el problema eran las comillas y lo del simpleJdbcTempelate ya lo teniamos en otro proyecto pero al fabuloso arquitecto no le gusta ni sabe spring y por eso tubimos que quitarlo y regresar a la edad de piedra con JDBC puro de nuevo muchas gracias a todos en breve espero postear el codigo fuente de este proyecto ya que estoy aprendiendo mucho

Imagen de ingscjoshua

el uso de la sentencia

Hola no entiendo porque pones la creacion de un arreglo de Objeto?, porq no usas simpleJdbc Templeate? claro si estas usando java 5 o superior esto te ahorraria mucho pero mucho codigo inecesario ahora en el parametro que envias la sentencia bastaria con mandar simplemente la cadena que deseas buscar

Imagen de francisco.santiagoj

@ingscjoshua

Hola @ingscjoshua, uso JdbcTemplate por que lo estoy estudiando XD, pero ahora que lo comentas voy a leer SimpleJdbcTemplate.
Gracias.

Imagen de ingscjoshua

de nada

Pues si deberias revisarlo es bastante funcional he aqui un ejemplo.

public UsuarioDTO consultaUsuariByLogin(LoginDTO loginDto){
       
        String sSql;
        sSql="SELECT USR.ADMINISTRADOR,"
                + "USR.ID_USUARIO,"
                + "PERFIL.ID_PERFIL,"
                + "USR.NOM_COMPLETO,"
                + "PERFIL.DES_PERFIL,"
                + "PUESTO.DES_PUESTO,"
                + "USR.ESTATUS,"
                + "PERFIL.ID_MENU "
               
                +" FROM ABASTO_DB.SEG_USUARIO USR, ABASTO_DB.SEG_PERFIL PERFIL, ABASTO_DB.SEG_PUESTO PUESTO "
                + "WHERE PERFIL.ID_PERFIL=USR.ID_PERFIL "
                + "AND  PUESTO.ID_PUESTO=USR.ID_PUESTO "
                + "AND USR.LOGIN=? AND USR.PASSWORD=? ";
        try{
           
        log.info("Query: "+sSql);
        RowMapper<UsuarioDTO> mapper= new RowMapper<UsuarioDTO>() {
            public UsuarioDTO mapRow(ResultSet rs, int i) throws SQLException {
               
                UsuarioDTO usrTmp= new UsuarioDTO();
                usrTmp.setNombreCompleto(rs.getString("NOM_COMPLETO"));
                usrTmp.setDesPerfil(rs.getString("DES_PERFIL"));
                usrTmp.setIdUsuario( rs.getString( "ID_USUARIO" ) );
                usrTmp.setIdPuesto( rs.getString( "DES_PUESTO" ) );
                usrTmp.setAdminTmp( rs.getBoolean( "ADMINISTRADOR" ) );
               
                usrTmp.setPerfilAux( new PerfilDTO() );
                usrTmp.getPerfilAux().setIdPerfil( rs.getString( "ID_PERFIL" ) );
                usrTmp.getPerfilAux().setDesPerfil( rs.getString( "DES_PERFIL" ) );
                usrTmp.getPerfilAux().getMenu().setIdMenu( rs.getLong( "ID_MENU" ) );
               
                return  usrTmp;
               
            }
        };
        log.info("Datos" + loginDto.getUsr() + "," +loginDto.getPwd());
       return this.simpleJdbcTemplate.queryForObject( sSql, mapper, loginDto.getUsr(), loginDto.getPwd() );
       
      }catch(DataAccessException e){
           log.error("Error: "+e.getMessage());
              return null;
        }
    }
Imagen de beto.bateria

simpleJdbcTemplate

¿En donde puedo encontrar informacion de simpleJdbcTemplate?, busque en la api de java6 y no encontre informacion. Es la primera vez que encuentro una referencia a esa tecnologia.

Gracias por la ayuda.

Imagen de neko069

Documentación de Spring,

Documentación de Spring, apartado de Spring JDBC ...
aquí

Imagen de ezamudio

Spring 3.0

En Spring 3.0 es org.springframework.jdbc.core.simple.SimpleJdbcTemplate.

Históricamente, primero existía sólo org.springframework.jdbc.core.JdbcTemplate, pero con Spring 2.0 o 2.5 no recuerdo bien cuál, agregaron clases nuevas para aprovechar los generics en Java 5. A partir de Spring 3.0 están migrando todo el framework para usar Java 5, y es por eso que a partir de Spring 31 SimpleJdbcTemplate ha sido marcada como deprecada, ya que todos sus métodos han sido integrados de vuelta a JdbcTemplate.

Así que si usas Spring 3.1.0.M2, es mejor que de una vez uses JdbcTemplate, y ya no SimpleJdbcTemplate, que eventualmente desaparecerá.

Imagen de beto.bateria

Gracias de nuevo

Gracias de nuevo

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">