【springmvc+mybatis项目实战】杰信商贸-20.合同货物数和附件数

本文介绍了一种通过SQL查询优化购销合同列表的方法,实现了在列表中直接展示每个合同下的货物数量及附件数量,简化了操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们每次删除完都要去下一级或者数据库看看我们删除了没有,我们可以直接在合同列表中显示每个合同下的货物以及货物的附件有多少件,这样就避免了反复去下一级查看列表的繁琐操作。

那么下面我们使用SQL来编写获取合同下的货物数:
[sql]  view plain copy
  1. select count(*) from contract_product_c  
  2. where contract_id='928eb2ae-23ba-46e0-9ad0-054354f66af8'  


获取合同下的货物下的附件数:

[sql]  view plain copy
  1. select count(*) from ext_cproduct_c  
  2. where contract_product_id in (select contract_product_id from contract_product_c where contract_id='928eb2ae-23ba-46e0-9ad0-054354f66af8')  

我们在购销合同列表下的每一行合同信息中增加一列,专门用来显示“货物数/附件数”(前后HTML代码省略):
[html]  view plain copy
  1. <span style="white-space:pre">    </span><tr>  
  2.         <td class="tableHeader">货物数/附件数</td>  
  3.           
  4.     </tr>  
  5.     <tr>  
  6.         <td>${o.cpnum }/${o.extnum }</td>  
  7.     </tr>  

效果如图



那么这就要求,在我们取出购销合同列表的时候就应该把货物数/附件数一并取出,那么我们就要写一个SQL综合一下刚刚我们写的两个分散的SQL,让我们能一次性取出某个购销合同的货物数/附件数:
[sql]  view plain copy
  1. select   
  2.   (select count(*) from contract_product_c   
  3.   where contract_id=c.contract_id)as cpnum,  
  4.   (select count(*) from ext_cproduct_c  
  5.   where contract_product_id inselect contract_product_id from       
  6.   contract_product_c where contract_id=c.contract_id))as extnum,  
  7.   c.*  
  8. from contract_c c  

可以看到我们新增了两个字段--货物数cpnum以及附件数extnum,但是我们的ContractMapper的映射文件的ResultMapping中没有这两个字段:
[html]  view plain copy
  1. <mapper namespace="cn.hpu.jk.mapper.ContractMapper">  
  2.     <resultMap type="cn.hpu.jk.domain.Contract" id="contractRM">  
  3.         <id property="id" column="CONTRACT_ID"/>  
  4.         <result property="offeror" column="OFFEROR"/>  
  5.         <result property="contractNo" column="CONTRACT_NO"/>  
  6.         <result property="signingDate" column="SIGNING_DATE"/>  
  7.         <result property="inputBy" column="INPUT_BY"/>  
  8.         <result property="checkBy" column="CHECK_BY"/>  
  9.         <result property="inspector" column="INSPECTOR"/>  
  10.         <result property="totalAmount" column="TOTAL_AMOUNT"/>  
  11.         <result property="importNum" column="IMPORT_NUM"/>  
  12.         <result property="crequest" column="CREQUEST"/>  
  13.         <result property="customName" column="CUSTOM_NAME"/>  
  14.         <result property="deliveryPeriod" column="DELIVERY_PERIOD"/>  
  15.         <result property="shipTime" column="SHIP_TIME"/>  
  16.         <result property="tradeTerms" column="TRADE_TERMS"/>  
  17.         <result property="remark" column="REMARK"/>  
  18.         <result property="printStyle" column="PRINT_STYLE"/>  
  19.         <result property="oldState" column="OLD_STATE"/>  
  20.         <result property="state" column="STATE"/>  
  21.         <result property="outState" column="OUT_STATE"/>  
  22.           
  23.         <result property="createBy" column="CREATE_BY"/>  
  24.         <result property="creatDept" column="CREATE_DEPT"/>  
  25.         <result property="creatTime" column="CREATE_TIME"/>  
  26.     </resultMap>  
  27.       
  28.     <!-- 查询多个 -->  
  29.     <select id="find" parameterType="map" resultMap="contractRM">  
  30.         select * from contract_c  
  31.         where 1=1  
  32.     </select>  
  33.       

所以我们要添加字段,并且我们的实体也要增加这两个字段(这里我们的实体改变是因为我们的实体仅仅是VO对象,并不是PO对象)

提到VO与PO,我们这里多说几句:
【面试】PO、VO、BO有什么区别?
PO 持久化对象,一般就直接对象数据库表
VO 视图对象,一般对应页面jsp
BO 业务对象,一般对应复杂业务

好了,这里我们开始修改我们的find配置语句,然后增加货物数cpnum以及附件数extnum的result:
[html]  view plain copy
  1. </pre><pre name="code" class="html"><mapper namespace="cn.hpu.jk.mapper.ContractMapper">  
  2.     <resultMap type="cn.hpu.jk.domain.Contract" id="contractRM">  
  3.         <id property="id" column="CONTRACT_ID"/>  
  4.         <result property="offeror" column="OFFEROR"/>  
  5.           
  6.         <!-- 虚拟字段 -->  
  7.         <result property="contractNo" column="CONTRACT_NO"/>  
  8.         <result property="cpnum" column="CPNUM"/>  
  9.           
  10.         <result property="extnum" column="EXTNUM"/>  
  11.         <result property="signingDate" column="SIGNING_DATE"/>  
  12.         <result property="inputBy" column="INPUT_BY"/>  
  13.         <result property="checkBy" column="CHECK_BY"/>  
  14.         <result property="inspector" column="INSPECTOR"/>  
  15.         <result property="totalAmount" column="TOTAL_AMOUNT"/>  
  16.         <result property="importNum" column="IMPORT_NUM"/>  
  17.         <result property="crequest" column="CREQUEST"/>  
  18.         <result property="customName" column="CUSTOM_NAME"/>  
  19.         <result property="deliveryPeriod" column="DELIVERY_PERIOD"/>  
  20.         <result property="shipTime" column="SHIP_TIME"/>  
  21.         <result property="tradeTerms" column="TRADE_TERMS"/>  
  22.         <result property="remark" column="REMARK"/>  
  23.         <result property="printStyle" column="PRINT_STYLE"/>  
  24.         <result property="oldState" column="OLD_STATE"/>  
  25.         <result property="state" column="STATE"/>  
  26.         <result property="outState" column="OUT_STATE"/>  
  27.           
  28.         <result property="createBy" column="CREATE_BY"/>  
  29.         <result property="creatDept" column="CREATE_DEPT"/>  
  30.         <result property="creatTime" column="CREATE_TIME"/>  
  31.     </resultMap>  
  32.       
  33.     <!-- 查询多个 -->  
  34.     <select id="find" parameterType="map" resultMap="contractRM">  
  35.         select   
  36.          (select count(*) from contract_product_c   
  37.            where contract_id=c.contract_id)as cpnum,  
  38.          (select count(*) from ext_cproduct_c  
  39.            where contract_product_id in( select contract_product_id from       
  40.            contract_product_c where contract_id=c.contract_id))as extnum,  
  41.           c.*  
  42.         from contract_c c  
  43.     </select>  
  44. <mapper>  
我们这里改完,接下来修改我们的实体:

可以看到,我们的货物数cpnum以及附件数extnum是String类型,但是实际上我们数据库统计的数量和应该是Int甚至是long,这里要注意的是,MyBatis它不以数据库取出的数据类型作为最终类型,而是以实体类中的类型最为最终类型,即硬性将数据转换为实体类规定的类型。现在我们因为不参加计算,只进行查看,所以为了简单起见,我们只需要String类型的数据就可以了:
[java]  view plain copy
  1. package cn.hpu.jk.domain;  
  2.   
  3. import java.util.Date;  
  4.   
  5. public class Contract {  
  6.     private String id;  
  7.     private String offeror;//收购方  
  8.     private String contractNo;//合同编号  
  9.       
  10.     private String cpnum;  
  11.     private String extnum;  
  12.       
  13.     private java.util.Date signingDate;//签单日期  
  14.     private String inputBy;//制单人  
  15.     private String checkBy;//审单人  
  16.     private String inspector;//验货员  
  17.     private Double totalAmount;//总金额  
  18.     private Integer importNum;//重要程度  
  19.     private String crequest;//要求  
  20.     private String customName;  
  21.     private java.util.Date deliveryPeriod;//交货期限  
  22.     private java.util.Date shipTime;//船期  
  23.     private String tradeTerms;//贸易条款  
  24.     private String remark;//说明  
  25.     private String printStyle;//打印版式  
  26.     private Integer oldState;//归档前状态  
  27.     private Integer state;//状态  
  28.     private Integer outState;//走货状态  
  29.     private String createBy;  
  30.     private String creatDept;  
  31.     private java.util.Date creatTime;  
  32.       
  33.     //...get和set方法省略  
  34. }  

我们在回顾一下jsp页面:
[html]  view plain copy
  1. <%@ page language="java" pageEncoding="UTF-8"%>  
  2. <%@ include file="../../baselist.jsp"%>  
  3. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>  
  4. <html xmlns="http://www.w3.org/1999/xhtml">  
  5. <head>  
  6.     <title></title>  
  7. </head>  
  8.   
  9.   
  10. <body>  
  11. <form name="icform" method="post">  
  12.   
  13.   
  14. <div id="menubar">  
  15. <div id="middleMenubar">  
  16. <div id="innerMenubar">  
  17.   <div id="navMenubar">  
  18.     
  19.     <ul>  
  20.     <li id="view"><a href="#" onclick="formSubmit('toview.action','_self');this.blur();">查看</a></li>  
  21.     <li id="new"><a href="#" onclick="formSubmit('tocreate.action','_self');this.blur();">添加</a></li>  
  22.     <li id="update"><a href="#" onclick="formSubmit('toupdate.action','_self');this.blur();">修改</a></li>  
  23.     <li id="delete"><a href="#" onclick="formSubmit('delete.action','_self');this.blur();">删除</a></li>  
  24.     <li id="new"><a href="#" onclick="formSubmit('submit.action','_self');this.blur();">上报</a></li>  
  25.     <li id="new"><a href="#" onclick="formSubmit('cancel.action','_self');this.blur();">取消</a></li>  
  26.     </ul>  
  27.   
  28.   
  29.   </div>  
  30. </div>  
  31. </div>  
  32. </div>  
  33.      
  34. <!-- 页面主体部分(列表等) -->    
  35. <div class="textbox" id="centerTextbox">  
  36.   <div class="textbox-header">  
  37.   <div class="textbox-inner-header">  
  38.   <div class="textbox-title">  
  39.     销售合同列表  
  40.   </div>   
  41.   </div>  
  42.   </div>  
  43.     
  44. <div>  
  45. <div class="eXtremeTable" >  
  46. <table id="ec_table" class="tableRegion" width="98%" >  
  47.     <thead>  
  48.     <tr>  
  49.         <td class="tableHeader"><input type="checkbox" name="selid" onclick="checkAll('id',this)"></td>  
  50.         <td class="tableHeader">序号</td>  
  51.         <td class="tableHeader">客户名称</td>  
  52.         <td class="tableHeader">合同号</td>  
  53.         <td class="tableHeader">货物数/附件数</td>  
  54.         <td class="tableHeader">制单人</td>  
  55.         <td class="tableHeader">审单人</td>  
  56.         <td class="tableHeader">验货员</td>  
  57.         <td class="tableHeader">签单日期</td>  
  58.         <td class="tableHeader">交货期限</td>  
  59.         <td class="tableHeader">船期</td>  
  60.         <td class="tableHeader">总金额</td>  
  61.         <td class="tableHeader">状态</td>  
  62.         <td class="tableHeader">操作</td>  
  63.     </tr>  
  64.     </thead>  
  65.     <tbody class="tableBody" >  
  66.       
  67.     <c:forEach items="${datalist}" var="o" varStatus="status">  
  68.     <tr class="odd" onmouseover="this.className='highlight'" onmouseout="this.className='odd'" >  
  69.         <td><input type="checkbox" name="id" value="${o.id}"/></td>  
  70.         <td>${status.index+1}</td>  
  71.         <td>${o.customName}</td>  
  72.         <td><a href="toview.action?id=${o.id}">${o.contractNo}</a></td>  
  73.         <td>${o.cpnum }/${o.extnum }</td>  
  74.         <td>${o.inputBy}</td>  
  75.         <td>${o.checkBy}</td>  
  76.         <td>${o.inspector}</td>  
  77.         <td><fmt:formatDate value="${o.signingDate}" pattern="yyyy-MM-dd"/></td>  
  78.         <td><fmt:formatDate value="${o.deliveryPeriod}" pattern="yyyy-MM-dd"/></td>  
  79.         <td><fmt:formatDate value="${o.shipTime}" pattern="yyyy-MM-dd"/></td>  
  80.         <td>${o.totalAmount}</td>  
  81.         <td>  
  82.             <c:if test="${o.state==1}"><font color="green">已上报</font></c:if>  
  83.             <c:if test="${o.state==0}">草稿</a></c:if>  
  84.         </td>  
  85.         <td><a href="${ctx}/cargo/contractproduct/tocreate.action?contractId=${o.id}" title="新增货物信息">[货物]</a><td>  
  86.     </tr>  
  87.     </c:forEach>  
  88.       
  89.     </tbody>  
  90. </table>  
  91. </div>  
  92.    
  93. </div>  
  94.    
  95.    
  96. </form>  
  97. </body>  
  98. </html>  

我们重启服务器查看一下:

我们的货物和附件数显示功能成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值