SpringMVC 之高级参数绑定(四)

包装类型 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 开始的迭代索引。


猜你喜欢

转载自blog.csdn.net/qq_30715329/article/details/80679338
今日推荐