业务需求: 前端传入批量查询的数组参数,后端接收并处理(两个小知识点随记,注意一下即可,可绕路!!!)
过程再现:
$(function(){
alert();
var arr = new Array(2);
arr[0] = "1100456324";
arr[1] = "1100456304";
console.info(arr.toString());
console.info(String(arr));
console.info(arr.join(","));
console.info(JSON.stringify(arr));
$.ajax({
url: "/domestic/registerExpandController/findCYInfosOfService.do",
data: {
userIds: String(arr),
userIds2:JSON.stringify(arr)
},
dataType: "json",
type: "post",
success: function (data) {
}
})
})
此处转Json字符串,后台数组接收参数有误,多了个中括号"[ ]";正确的参数传入应该是如userIds接收的一样,
总结如下:
前台参数传入如格式 "1100456321,1100456326",在后台用 数组/List集合 类型进行参数接收时可自动
识别将其按索引接收;所以此处进行批量删除、批量查询时无需如上转Json后再剔除中括号"[ ]"。
在前台可将数组Array通过String()、toString()或join(",")来将 js 的数组Array转字符串
"1100456321,1100456326"以应对后台的接收:
全局函数String():将对象的值转换为字符串;
Array.toString():把数组转换为字符串,并返回结果;
Array.join():把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔;
在对应的mapper.xml中:
<select id="findCYInfosOfService" resultType="map">
SELECT ZC.R2 r2,IFNULL(SUPPLY.R4,'') as head_img, ZC.USER_ID userId
FROM
usermanage.GCX_WS_USER_ZC ZC LEFT JOIN usermanage.GCX_WS_USER_SUPPLY SUPPLY
ON ZC.USER_ID = SUPPLY.USER_ID
WHERE 1=1
AND ZC.USER_ID IN (${temp.userIds})
AND ZC.DELETE_FLAG != 1
AND ZC.STATE='1'
AND SUPPLY.DELETE_FLAG != 1
AND SUPPLY.FINDINGS_OF_AUDIT='已通过'
<if test="end != -1">
limit #{start}, #{end}
</if>
</select>
使用 (${temp.userIds}) 与 (#{temp.userIds,jdbcType=VARCHAR})的区别:
使用前者,
使用后者,
使用前者$时查询结果正确,而使用后#时不正确,后经分析可能是因为IN之后的 (1100456324,1100456304)
被认为是一个整体,而使用#后进行了预编译处理,用?进行了占位,将1100456324,1100456304独立成了一个整体,
改变了本身 (1100456324,1100456304) 在sql语句中原本所表达的含义,所以查询失败。
在Mybatis中#{ }与${ }的区别:
1. #{}能够很大程度上防止sql注入,因为一个 #{ }将解析为一个 JDBC 预编译语句(prepared statement)
的参数标记符, 即被解析为一个?参数占位符,而${}不能;
2. ${}中间的变量就是直接替换成字符串值,相当于字符串拼接,而#{}相当于是某种类型的变量;