包装类型 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):
总结
- 数组的 <foreach > 的 collection 为固定的 array;
- 批量修改最好用 CASE ... WHEN ... THEN WHEN ... THEN ... END, 的 sql 语句;
- <c:forEach> 里 varStatus 表示 当前循环对象的状态,.index 是从 0 开始的迭代索引。