包装类型 pojo 参数绑定:
分析:
在形参中让包装类型的 pojo 接收查询条件参数。
页面传参数的特点:复杂,多样性。条件包括 :用户账号、产品编号、订单信息。。。
如果将用户账号、产品编号、订单信息等放在简单 pojo(属性是简单类型)中,pojo 类属性比较多,比较乱。
建议使用包装类型的 pojo,pojo 中属性是 pojo。
页面路径:
需求:
按产品名字查询。
pojo 类:
controller 形参:
xml 文件:
页面参数(productsList.jsp):
注意:productsCustom 和包装 pojo 中的属性一致即可。
数组参数绑定:
需求:
批量删除产品。
pojo 包装类:
controller 形参:
xml 文件:
页面参数:
list 参数绑定:
需求:
批量修改产品信息。
pojo 包装类:
controller 形参:
xml 文件:
<select id="queryAll" resultType="lxf.po.ProductsCustom">
select * from products
</select>
<update id="updateAll" parameterType="lxf.po.ProductsQueryVo" >
UPDATE products
<!-- trim标记是一个格式化的标记,可以完成 set 或 where 标记的功能
prefix:前缀;
prefixOverrides:每行添加 指定的字符,第一个不添加; 同理
suffixOverrides:每行添加 指定的字符,最后一个不添加-->
<trim prefix="SET" suffixOverrides=",">
<trim prefix="products.name= CASE " suffix="END,">
<foreach collection="proList" index="index" item="pro" >
<if test="pro.name != null">
WHEN id=#{pro.id} THEN #{pro.name}
</if>
</foreach>
</trim>
<trim prefix="price= CASE " suffix="END,">
<foreach collection="proList" item="pro">
<if test="pro.price != null">
WHEN id=#{pro.id} THEN #{pro.price}
</if>
</foreach>
</trim>
<trim prefix="detail= CASE " suffix="END,">
<foreach collection="proList" item="pro">
<if test="pro.detail != null">
WHEN id=#{pro.id} THEN #{pro.detail}
</if>
</foreach>
</trim>
<trim prefix="pic= CASE " suffix="END,">
<foreach collection="proList" item="pro">
<if test="pro.pic != null">
WHEN id=#{pro.id} THEN #{pro.pic}
</if>
</foreach>
</trim>
<trim prefix="createtime= CASE " suffix="END">
<foreach collection="proList" item="pro">
<if test="pro.createtime != null">
WHEN id=#{pro.id} THEN #{pro.createtime}
</if>
</foreach>
</trim>
</trim>
<trim prefix=" WHERE id IN (" suffix=")">
<foreach collection="proList" item="pro" separator=",">
#{pro.id}
</foreach>
</trim>
</update>
以上的 xml 文件 输出的 sql 语句是:
UPDATE products SET name= CASE WHEN id=1 THEN 'iphone88' WHEN id=2 THEN 'Lenovo' WHEN id=3 THEN 'bitcoin' END,
price= CASE WHEN id=1 THEN 10000.0 WHEN id=2 THEN 100.1 WHEN id=3 THEN 88888.0 END,
detail= CASE WHEN id=1 THEN 'stupid果蛆' WHEN id=2 THEN 'cesll' WHEN id=3 THEN 'amazing!' END,
createtime= CASE WHEN id=1 THEN '2018-11-11 14:24:14' WHEN id=2 THEN '2018-06-12 21:05:56' WHEN id=3 THEN '2018-04-19 17:27:12' END
WHERE id IN ( 1 , 2 , 3 )
注意:mybatis 文件对 批量修改 也可以形如这样:
<update id="updateAll" parameterType="lxf.po.ProductsQueryVo">
<foreach collection="proList" item="pro" index="index" open="" close="" separator=";">
update products
<set>
name=${pro.name}
</set>
where id = ${pro.id}
</foreach>
</update>
但这样是一个记录 update 一次,多个 update 语句,性能比较差,容易造成阻塞。
页面参数(batchmodify.jsp):
map 参数绑定
map 参数绑定跟 lisit 差不多,只不过页面 可以改为形如:
<tr>
<td>产品信息:</td>
<!-- 输出Map -->
<c:forEach items="${productMap}" var="pro" varStatus="status">
<td>产品名:<input type="text" name="productMap['key'+'${status.index}'].name" value="${pro.value.getName()}"/></td>
<td>价格:<input type="text" name="productMap['key'+'${status.index}'].price" value="${pro.value.getPrice()}"/></td>
.. .. ..
</c:forEach>
</tr>
总结
- 数组的 <foreach > 的 collection 为固定的 array;
- 批量修改最好用 CASE WHEN ... THEN WHEN ... THEN ... END, 的 sql 语句;
- <c:forEach> 里 varStatus 表示 当前循环对象的状态,varStatus.index 是从 0 开始的迭代索引。