Reputation: 2281
I have a common class for all DAO's where we will read queries and execute them as below. I will send parameters from DAO to this class.
Connection connection = Queries.getConnection();
String query = Queries.getQuery(queryName);//Queries i will get from xml
PreparedStatement preparedStatement = connection.prepareStatement(query);
what is the best way to set parameters dynamically to prepared Statement in JDBC. I believe, we don't have named parameters concept in JDBC as we have in spring JDBC. We are only simple JDBC in our project.
Upvotes: 8
Views: 72618
Reputation: 157
Good way is to use 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.setInt(paramNumber, (Integer) param);
//more types here...
} else {
ps.setString(paramNumber, param.toString());
}
paramNumber ++;
}
}
Upvotes: 6
Reputation: 197
Look at this page example. Your query should contain ? in place where you want to set value.
String query = "update COFFEES set SALES = ? where COF_NAME = ?";
And you can easily set values like this
preparedStatement.setInt(1, 100);
preparedStatement.setString(2, "French_Roast");
Upvotes: 5
Reputation: 3170
write something like this:
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);
}
}
}
}
and in the queries just use '?' where you need to set the parameter.
I know that this is old school code, but just to give some minimalistic example...
Upvotes: 9