Java 在JDBC中动态地为prepared语句设置参数

Java 在JDBC中动态地为prepared语句设置参数,java,jdbc,Java,Jdbc,我有一个用于所有DAO的公共类,我们将在其中读取查询并执行它们,如下所示。我将从DAO向这个类发送参数 Connection connection = Queries.getConnection(); String query = Queries.getQuery(queryName);//Queries i will get from xml PreparedStatement preparedStatement = connection.prepareStatement(query);

我有一个用于所有DAO的公共类,我们将在其中读取查询并执行它们,如下所示。我将从DAO向这个类发送参数

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

在JDBC中,动态地为prepared语句设置参数的最佳方法是什么。我相信,我们在JDBC中没有像在SpringJDBC中那样的命名参数概念。在我们的项目中,我们只是简单的JDBC。

编写如下内容:

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);
    }
   }
  }
}
在查询中,只需在需要设置参数的地方使用“?”

我知道这是一个古老的学校代码,但只是举一些简单的例子…

看看这页。 您的查询应该包含?在要设置值的位置

String query = "update COFFEES set SALES = ? where COF_NAME = ?";
您可以很容易地设置这样的值

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

也许这对你来说很有趣 好方法是使用地图

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 ++;
    }
}
Map params=newhashmap();
参数put(“id”,0);
参数put(“名称”、“测试”);
//这里有更多的参数。。。
String sql=“从测试中选择*”;
布尔值优先=真;
for(字符串paramName:params.keySet()){
对象paramValue=params.get(paramName);
if(paramValue!=null){
如果(第一){
sql+=“其中”+paramName+“=?”;
第一个=假;
}否则{
sql+=”和“+paramName+”=?”;
}
}
}
连接连接=DataSource.getInstance().getConnection();
ps=连接.prepareStatement(sql);
int paramNumber=1;
for(字符串paramName:params.keySet()){
对象paramValue=params.get(paramName);
if(paramValue!=null){
if(参数instanceof Date){
ps.setDate(参数编号,(日期)参数);
}else if(参数instanceof Integer){
ps.setInt(paramNumber,(Integer)param);
//这里有更多的类型。。。
}否则{
ps.setString(paramNumber,param.toString());
}
参数号++;
}
}

请不要使用太多粗体样式。请参阅ps.setObject()的内容?