8

私はすべてのDAOに共通のクラスを持っており、クエリを読み取って以下のように実行します。DAOからこのクラスにパラメーターを送信します。

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

JDBCでプリペアドステートメントにパラメータを動的に設定するための最良の方法は何ですか。春のJDBCのように、JDBCには名前付きパラメーターの概念がないと思います。私たちのプロジェクトでは、単純なJDBCにすぎません。

4

4 に答える 4

9

このようなものを書いてください:

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

クエリでは「?」を使用します パラメータを設定する必要がある場所。

これが古い学校のコードであることは知っていますが、最小限の例を示すためだけに...

于 2012-08-02T12:15:11.680 に答える
6

マップを使用するのが良い方法です

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 ++;
    }
}
于 2016-04-26T19:16:19.297 に答える
4

このページのを見てください。クエリには?値を設定したい場所に。

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

そして、あなたはこのような値を簡単に設定することができます

preparedStatement.setInt(1, 100);
preparedStatement.setString(2, "French_Roast");
于 2012-08-02T12:18:20.083 に答える
1

たぶん、これはあなたにとって興味深いものです 。PreparedStatementの名前付きパラメータ

于 2012-08-02T12:23:49.957 に答える