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):

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值