spring - JdbcTemplate條件in的SQL寫法

通常你們習慣的用法以下:spring

    public List<Map<String, Object>> queryByFundid(int fundId) {        
        String sql = "SELECT * FROM t_freeze_detail WHERE fund_id = ? AND flag = ? AND freeze_state = ?";
        return jt.queryForList(sql, new Object[]{fundId, Const.FLAG_NORMAL, FreezeDetailBean.FREEZE_STATUS_FROZEN});
    }

經過問號的順序,在jt(JdbcTemplate).queryForList後將參數對號入座。避免程序被注入。sql

可是當咱們使用in的時候,這種方法就很差用了,相信你想過,用List匹配問號。你會發現出現這種的SQL:.net

select * from user where id in ([1,2])
1
執行報錯。code

下面是正確的用法: 
參考資料: 
https://codedump.io/share/wiR37rEpCp2X/1/how-to-pass-list-parameter-in-in-clause-using-jdbctemplate 
http://www.technicalkeeda.com/spring-tutorials/spring-jdbctemplate-in-clause-exampleget

    /**
     * 根據條件刪除
     * 
     * @author GaoPeng
     * @param freezeTypeList
     * @return
     */
    public int deleteRaiseRiskByCondition(int fundId, List<Integer> freezeTypeList) {it

        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jt.getDataSource());io

        Map<String, Object> params = new HashMap<String, Object>();
        params.put("fundId", fundId);
        params.put("freezeType", freezeTypeList);class

        String sql = "delete from t_freeze_detail where fund_id=:fundId and freeze_type in (:freezeType)";
        return namedParameterJdbcTemplate.update(sql, params);
    }
這我用了一個delete的例子,其餘的相似,你們觸類旁通。 
程序中用了NamedParameterJdbcTemplate類,而後經過:freezeType方式進行參數的匹配。date

相關文章
相關標籤/搜索