2012-08-02 4 views
7

Mam wspólną klasę dla wszystkich DAO, gdzie będziemy czytać zapytania i wykonywać je jak poniżej. Wyślę parametry od DAO do tej klasy.Ustawianie parametrów dynamicznie do przygotowanego oświadczenia w JDBC

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

jaki jest najlepszy sposób dynamicznego ustawiania parametrów do przygotowanego wyciągu w JDBC. Uważam, że nie mamy koncepcji nazwanych parametrów w JDBC, jak mamy na wiosnę JDBC. Jesteśmy tylko prostym JDBC w naszym projekcie.

+2

Proszę nie używać za dużo odważnego stylu. – amicngh

+0

odnoszą się do http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html – swapy

Odpowiedz

4

napisać coś takiego:

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); 
    } 
    } 
    } 
} 

i zapytań wystarczy użyć '?' gdzie musisz ustawić parametr.

wiem, że jest to stary kod szkoły, ale tylko dać trochę minimalistyczny przykład ...

+2

Co z ps.setObject()? – David

3

Spójrz na tej stronie example. Twoje zapytanie powinno zawierać? w miejscu, w którym chcesz ustawić wartość.

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

I można łatwo ustawić wartości jak ten

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

Dobrym sposobem jest użycie 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

DZIĘKUJĘ, że zaoszczędziłem mój czas na zleceniu uniwersyteckim – CapturedTree