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>