0

2つのパラメーターを受け入れる以下のメソッドがあります-

userId and attributes Map

属性マップには列名と列値があります-

上記のマップに 5 つの列がある場合の例を見てみましょう。5 つのキーと 5 つの値も存在します。

したがって、私のSQLは次のようになります-

String sql = "INSERT INTO PROFILE(userId, colA, colB, colC, colD, colE) VALUES ( ?, ?, ?, ?, ?, ?) ";

同様に、クエリステートメントは次のようになります-

BoundStatement query = prBatchInsert.bind(userId, colAValue, colBValue, colCValue, colDValue, colEValue);

ただし、場合によっては、属性マップに 20 列が含まれる可能性があります。それに基づいて、SQLとクエリステートメントを作成する必要があります。

以下は、テーブルに 4 つの列しかないことをほぼ想定しているコードですが、これは正しくありません。

public void upsertAttributes(final String userId, final Map<String, String> attributes) {

    try {
        String[] keys = (String[])attributes.keySet().toArray();

        String sql = "INSERT INTO PROFILE(userId, "+keys[0]+", "+keys[1]+", "+keys[2]+", "+keys[3]+") VALUES ( ?, ?, ?, ?, ?) "; 

        BoundStatement query = prBatchInsert.bind(userId, attributes.get(keys[0]), attributes.get(keys[1]), attributes.get(keys[2]), attributes.get(keys[3]));

    } catch (Exception e) {
        LOG.error(e);
    }

}

に対応するより一般的な上記のメソッドをどのように書くことができattributes Mapますか?

4

1 に答える 1

0

Spring jdbctemplate を使用する必要があります。このための API がたくさんあります。このリンクをチェックしてください: http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/jdbc/core/JdbcTemplate.html

編集:

このリンクを確認してください: http://www.mkyong.com/spring/spring-named-parameters-examples-in-simplejdbctemplate/

それはまさにあなたが望むことをします。

編集:Spring を使用したくない場合は、これを実現するために、完全な SQL 文字列を動的に生成する必要があります。バインディングは使用しません。

このコードを参照してください[私はこのコードを実行していませんが、これはこれを達成するための基本的な考え方です]:

public void upsertAttributes(final String userId, final Map<String, String> attributes) {

    try {
        String[] keys = (String[])attributes.keySet().toArray();

        String sql = "INSERT INTO PROFILE(userId, "+keys[0]+", "+keys[1]+", "+keys[2]+", "+keys[3]+") VALUES ( ?, ?, ?, ?, ?) "; 
        StringBuffer keysStmt = new StringBuffer("INSERT INTO PROFILE("+userId);
        StringBuffer valuesStmt = new StringBuffer("  VALUES (" );

        Iterator itr = attributes.keySet().iterator();

        while(itr.hasNext()){
            String key = itr.next();
            keysStmt.append(","+key);
            valuesStmt.append(attributes.get(key)+",");          
        }

       //remove last comma
       valuesStmt = new StringBuffer(valuesStmt.toString().substring(0,valuesStmt.length-1));

       sql = keysStmt.append(")")+valuesStmt.append(")");

    } catch (Exception e) {
        LOG.error(e);
    }

}
于 2013-04-21T05:47:40.117 に答える