案例是給一個(gè)用戶(hù)賦予多個(gè)權(quán)限,多個(gè)權(quán)限用其對(duì)應(yīng)的主鍵 id 為參數(shù),組成了 一個(gè)id數(shù)組,傳給springMVC,然后springMVC傳給mybatis,然后mybatis批量插入。其實(shí)類(lèi)似的場(chǎng)景還有批量刪除多個(gè),也是類(lèi)似的。
1. 前臺(tái)頁(yè)面
<thead><tr><th>權(quán)限選擇</th><th>name</th><th>permission</th></tr></thead> <c:forEach var="priv" items="${list }"> <tr class="odd gradeX"> <td><input type="checkbox" name="priv_id" value="${priv.id}" /></td> <td><c:out value="${priv.name}"/></td> <td><c:out value="${priv.permission}"/></td> </tr> </c:forEach>
2. jquery獲得選中的項(xiàng)的id值:
//jquery獲取復(fù)選框值 var priv_ids =[];//定義一個(gè)數(shù)組 $('input[name="priv_id"]:checked').each(function(){ // 遍歷每一個(gè)name為priv_id的復(fù)選框,其中選中的執(zhí)行函數(shù) priv_ids.push($.trim($(this).val())); // 將選中的值添加到數(shù)組priv_ids中 }); console.log(priv_ids); var indata = {userId:user_id, privIds:priv_ids}; $.post("/ems/priv/setPrivilege", indata, function(data){ if(data != null && data.result == 'ok'){ console.log(data.msg); alert(data.msg); }else{ alert(data.msg); } }, 'json');
提交的json格式的數(shù)據(jù):var indata = {userId:user_id, privIds:priv_ids};
其中的 priv_ids 是一個(gè)有 id 組成的數(shù)組。
3. springMVC接收數(shù)組參數(shù):
@RequestMapping(value="/setPrivilege") @ResponseBody public void setPrivilege(@RequestParam(value = "privIds[]") Integer[] privIds, Integer userId, PrintWriter writer){ int result = this.privilegeService.setPrivilegeForUser(privIds, userId); Map<String, String> map = new HashMap<>(); if(result > 0){ map.put("result", "ok"); map.put("msg", "設(shè)置成功"); writer.write(JSON.toJSONString(map)); } }
我們看到使用了:@RequestParam(value = "privIds[]") Integer[] privIds 來(lái)獲取前臺(tái)傳來(lái)的數(shù)組參數(shù)。
springMVC接收參數(shù)時(shí),最好不要使用 int, long等原始類(lèi)型,而應(yīng)該使用它們對(duì)應(yīng)的包裝類(lèi)型,不然當(dāng)傳入的參數(shù)為空時(shí),會(huì)報(bào)錯(cuò),而包裝類(lèi)型可以使用null表示傳入的空值。
4. service層的處理,很簡(jiǎn)單,直接使用map向mybatis傳遞參數(shù):
@Service("privilegeService")@Transactionalpublic class PrivilegeServiceImpl implements PrivilegeService { @Autowired private PrivilegeMapper privilegeMapper; @Override @Transactional(readOnly=true) public List<Privilege> getAllPrivilege() { return privilegeMapper.getAllPrivilege(); } @Override public int setPrivilegeForUser(Integer[] privIds, Integer userId) { Map<String, Object> map = new HashMap<>(); map.put("privIds", privIds); map.put("userId", userId); return this.privilegeMapper.setPrivilegeForUser(map); }}
5. 最后看 mybatis 的 xml 中的sql如何寫(xiě):
<insert id="setPrivilegeForUser" parameterType="map"> insert into user_privilege(user_id, privilege_id) values <foreach collection="privIds" index="index" item="item" separator=","> ( #{userId}, #{item} ) </foreach> </insert>
我們看到使用了 foreach 來(lái)循環(huán)傳遞進(jìn)來(lái)的數(shù)組 privIds,最后組成的sql語(yǔ)句如下所示:
insert into user_privilege(user_id, privilege_id) values (3, 1),(3,2),(3,3),(3,4)
user_id 不變,而privilege_id 是數(shù)組 privIds 中的循環(huán)出來(lái)的 id 值。其實(shí)就是數(shù)據(jù)庫(kù)的批量插入。
6. 批量刪除多個(gè)的處理
刪除時(shí),和前面批量插入處理也是極其類(lèi)似的,只在最后mybatis中xml中sql的寫(xiě)法有點(diǎn)區(qū)別:
<delete id="deleteByIds" parameterType="java.util.List"> delete from user_privilege where id in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> #{item} </foreach> </delete>
比較批量刪除和批量插入,可以看出 foreach 中的 open="(" 和 close=")" 只在循環(huán)的開(kāi)始和結(jié)束會(huì)加上,而 separator="," 是每循環(huán)一次,就加一次逗號(hào)。
7. 批量插入傳入對(duì)象List的例子:
<insert id="batchInsertStudent" parameterType="java.util.List"> insert into student (id,name,sex,tel,address) values <foreach collection="list" item="item" index="index" separator="," > (#{item.id},#{item.name},#{item.sex},#{item.tel},#{item.address}) </foreach> </insert>
其實(shí)掌握了 批量插入和批量刪除,批量更新也是一樣的。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注