mybatis如何傳入java中拼接的sql語句


mybatis 雖然xml文件有強大的模板標簽的處理能力,但實際開發中有時比較復雜的sql還有一部分得在java中預先拼裝好,然后放到xml文件中直接使用。
但是mybatis是先進行預處理的,所以你傳入的片段也好其他也好,都會當做一個值來看待,因此在mybatis中不能使用#{xx}來解析,而是得用${xx}來解析才行。
因為#{xx}字符串處理,加單引號,可一定程度的防注入。${xx}直接引用不做處理,比如數字。

 

代碼如下:

StringBuilder dynamicRegionSql = new StringBuilder();
        for (int i = 0; i < ipLocation2DTOs.size(); i++) {
            dynamicRegionSql.append("(region_id=\"");
            dynamicRegionSql.append(ipLocation2DTOs.get(i).getRegionId());
            dynamicRegionSql.append("\"");
            if (ipLocation2DTOs.get(i).getCityId() != null && ipLocation2DTOs.get(i).getCityId().size() != 0) {
                dynamicRegionSql.append(" and city in (");
                List<String> cityIds = ipLocation2DTOs.get(i).getCityId();
                for (int j = 0; j < cityIds.size(); j++) {
                    dynamicRegionSql.append("\"");
                    dynamicRegionSql.append(cityIds.get(j));
                    dynamicRegionSql.append("\"");
                    if (j != (cityIds.size() -1) ) {
                        dynamicRegionSql.append(",");
                    }
                }
                dynamicRegionSql.append(")");
            }
            dynamicRegionSql.append(")");

            if (i != (ipLocation2DTOs.size() -1) ) {
                dynamicRegionSql.append(" or ");
            }
        }
//        System.out.println(dynamicRegionSql);
        int affectNum = deviceLocationMapper.queryCountByRegion(productModel, dynamicRegionSql.toString());

xml文件中:

<select id="queryCountByRegion" resultType="java.lang.Integer">
        SELECT
        count(*) as num
        FROM device_location
        WHERE
            product_model = #{productModel} and
            ${dynamicRegionSql}
    </select>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM