2012-08-02 11 views
7

Tengo una clase común para todos los DAO donde leeremos las consultas y las ejecutaremos como a continuación. Enviaré los parámetros de DAO a esta clase.Establecer parámetros dinámicamente para preparar el enunciado en JDBC

Connection connection = Queries.getConnection(); 
String query = Queries.getQuery(queryName);//Queries i will get from xml 
PreparedStatement preparedStatement = connection.prepareStatement(query); 

cuál es la mejor manera de configurar los parámetros dinámicamente en el enunciado preparado en JDBC. Creo que no tenemos el concepto de parámetros nombrados en JDBC como lo tenemos en la primavera JDBC. Solo somos simples JDBC en nuestro proyecto.

+2

favor, no use demasiado estilo audaz – amicngh

+0

consulte http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html – swapy

Respuesta

4

escribir algo como esto:

public static int mapParams(PreparedStatement ps, Object... args) throws SQLException { 
    int i = 1; 
    for (Object arg : args) {   
     if (arg instanceof Date) { 
     ps.setTimestamp(i++, new Timestamp(((Date) arg).getTime())); 
    } else if (arg instanceof Integer) { 
     ps.setInt(i++, (Integer) arg); 
    } else if (arg instanceof Long) { 
     ps.setLong(i++, (Long) arg); 
    } else if (arg instanceof Double) { 
     ps.setDouble(i++, (Double) arg); 
    } else if (arg instanceof Float) { 
     ps.setFloat(i++, (Float) arg); 
    } else { 
     ps.setString(i++, (String) arg); 
    } 
    } 
    } 
} 

y en las consultas sólo tiene que utilizar '?' donde necesitas establecer el parámetro

sé que este es el código de la vieja escuela, pero sólo para dar algunos ejemplos minimalista ...

+2

¿Qué pasa con ps.setObject()? – David

3

mirada a esta página example. Su consulta debería contener? en el lugar donde quieres establecer el valor

String query = "update COFFEES set SALES = ? where COF_NAME = ?"; 

Y se puede configurar fácilmente los valores como esto

preparedStatement.setInt(1, 100); 
preparedStatement.setString(2, "French_Roast"); 
3

buena manera es utilizar Map

Map<String, Object> params = new HashMap<>(); 
params.put("id",0); 
params.put("name","test"); 
//more params here... 


String sql = "SELECT * FROM test"; 

boolean first = true; 

for (String paramName : params.keySet()) { 
    Object paramValue = params.get(paramName); 
    if (paramValue != null) { 
     if (first){ 
      sql += " where " + paramName + "=?"; 
      first = false; 
     } else { 
      sql += " and " + paramName + "=?"; 
     } 
    } 
} 

Connection connection = DataSource.getInstance().getConnection(); 

ps = connection.prepareStatement(sql); 

int paramNumber = 1; 
for (String paramName : params.keySet()) { 
    Object paramValue = params.get(paramName); 
    if (paramValue != null) { 
     if (param instanceof Date) { 
      ps.setDate(paramNumber, (Date) param); 
     } else if (param instanceof Integer) { 
      ps.setString(paramNumber, (Integer) param); 
     //more types here... 
     } else { 
      ps.setString(paramNumber, param.toString()); 
     } 
     paramNumber ++; 
    } 
} 
+0

GRACIAS, esto me ahorró tiempo en una tarea universitaria – CapturedTree

Cuestiones relacionadas