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

简介:
我们上一篇完成了购销合同、货物以及附件的级联删除,这次我们需要做的业务就是----要求直接显示合同下的货物数和附件数

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

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


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

select count(*) from ext_cproduct_c
where contract_product_id in (select contract_product_id from contract_product_c where contract_id='928eb2ae-23ba-46e0-9ad0-054354f66af8')

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

效果如图



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

可以看到我们新增了两个字段--货物数cpnum以及附件数extnum,但是我们的ContractMapper的映射文件的ResultMapping中没有这两个字段:
<mapper namespace="cn.hpu.jk.mapper.ContractMapper">
	<resultMap type="cn.hpu.jk.domain.Contract" id="contractRM">
		<id property="id" column="CONTRACT_ID"/>
		<result property="offeror" column="OFFEROR"/>
		<result property="contractNo" column="CONTRACT_NO"/>
		<result property="signingDate" column="SIGNING_DATE"/>
		<result property="inputBy" column="INPUT_BY"/>
		<result property="checkBy" column="CHECK_BY"/>
		<result property="inspector" column="INSPECTOR"/>
		<result property="totalAmount" column="TOTAL_AMOUNT"/>
		<result property="importNum" column="IMPORT_NUM"/>
		<result property="crequest" column="CREQUEST"/>
		<result property="customName" column="CUSTOM_NAME"/>
		<result property="deliveryPeriod" column="DELIVERY_PERIOD"/>
		<result property="shipTime" column="SHIP_TIME"/>
		<result property="tradeTerms" column="TRADE_TERMS"/>
		<result property="remark" column="REMARK"/>
		<result property="printStyle" column="PRINT_STYLE"/>
		<result property="oldState" column="OLD_STATE"/>
		<result property="state" column="STATE"/>
		<result property="outState" column="OUT_STATE"/>
		
		<result property="createBy" column="CREATE_BY"/>
		<result property="creatDept" column="CREATE_DEPT"/>
		<result property="creatTime" column="CREATE_TIME"/>
	</resultMap>
	
	<!-- 查询多个 -->
	<select id="find" parameterType="map" resultMap="contractRM">
		select * from contract_c
		where 1=1
	</select>
	

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

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

好了,这里我们开始修改我们的find配置语句,然后增加货物数cpnum以及附件数extnum的result:
</pre><pre name="code" class="html"><mapper namespace="cn.hpu.jk.mapper.ContractMapper">
	<resultMap type="cn.hpu.jk.domain.Contract" id="contractRM">
		<id property="id" column="CONTRACT_ID"/>
		<result property="offeror" column="OFFEROR"/>
		
		<!-- 虚拟字段 -->
		<result property="contractNo" column="CONTRACT_NO"/>
		<result property="cpnum" column="CPNUM"/>
		
		<result property="extnum" column="EXTNUM"/>
		<result property="signingDate" column="SIGNING_DATE"/>
		<result property="inputBy" column="INPUT_BY"/>
		<result property="checkBy" column="CHECK_BY"/>
		<result property="inspector" column="INSPECTOR"/>
		<result property="totalAmount" column="TOTAL_AMOUNT"/>
		<result property="importNum" column="IMPORT_NUM"/>
		<result property="crequest" column="CREQUEST"/>
		<result property="customName" column="CUSTOM_NAME"/>
		<result property="deliveryPeriod" column="DELIVERY_PERIOD"/>
		<result property="shipTime" column="SHIP_TIME"/>
		<result property="tradeTerms" column="TRADE_TERMS"/>
		<result property="remark" column="REMARK"/>
		<result property="printStyle" column="PRINT_STYLE"/>
		<result property="oldState" column="OLD_STATE"/>
		<result property="state" column="STATE"/>
		<result property="outState" column="OUT_STATE"/>
		
		<result property="createBy" column="CREATE_BY"/>
		<result property="creatDept" column="CREATE_DEPT"/>
		<result property="creatTime" column="CREATE_TIME"/>
	</resultMap>
	
	<!-- 查询多个 -->
	<select id="find" parameterType="map" resultMap="contractRM">
		select 
	     (select count(*) from contract_product_c 
	       where contract_id=c.contract_id)as cpnum,
	     (select count(*) from ext_cproduct_c
	       where contract_product_id in( select contract_product_id from     
	       contract_product_c where contract_id=c.contract_id))as extnum,
	      c.*
    	from contract_c c
	</select>
<mapper>
我们这里改完,接下来修改我们的实体:

可以看到,我们的货物数cpnum以及附件数extnum是String类型,但是实际上我们数据库统计的数量和应该是Int甚至是long,这里要注意的是,MyBatis它不以数据库取出的数据类型作为最终类型,而是以实体类中的类型最为最终类型,即硬性将数据转换为实体类规定的类型。现在我们因为不参加计算,只进行查看,所以为了简单起见,我们只需要String类型的数据就可以了:
package cn.hpu.jk.domain;

import java.util.Date;

public class Contract {
	private String id;
	private String offeror;//收购方
	private String contractNo;//合同编号
	
	private String cpnum;
	private String extnum;
	
	private java.util.Date signingDate;//签单日期
	private String inputBy;//制单人
	private String checkBy;//审单人
	private String inspector;//验货员
	private Double totalAmount;//总金额
	private Integer importNum;//重要程度
	private String crequest;//要求
	private String customName;
	private java.util.Date deliveryPeriod;//交货期限
	private java.util.Date shipTime;//船期
	private String tradeTerms;//贸易条款
	private String remark;//说明
	private String printStyle;//打印版式
	private Integer oldState;//归档前状态
	private Integer state;//状态
	private Integer outState;//走货状态
	private String createBy;
	private String creatDept;
	private java.util.Date creatTime;
	
	//...get和set方法省略
}

我们在回顾一下jsp页面:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ include file="../../baselist.jsp"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<title></title>
</head>


<body>
<form name="icform" method="post">


<div id="menubar">
<div id="middleMenubar">
<div id="innerMenubar">
  <div id="navMenubar">
  
	<ul>
	<li id="view"><a href="#" onclick="formSubmit('toview.action','_self');this.blur();">查看</a></li>
	<li id="new"><a href="#" onclick="formSubmit('tocreate.action','_self');this.blur();">添加</a></li>
	<li id="update"><a href="#" onclick="formSubmit('toupdate.action','_self');this.blur();">修改</a></li>
	<li id="delete"><a href="#" onclick="formSubmit('delete.action','_self');this.blur();">删除</a></li>
	<li id="new"><a href="#" onclick="formSubmit('submit.action','_self');this.blur();">上报</a></li>
	<li id="new"><a href="#" onclick="formSubmit('cancel.action','_self');this.blur();">取消</a></li>
	</ul>


  </div>
</div>
</div>
</div>
   
<!-- 页面主体部分(列表等) -->  
<div class="textbox" id="centerTextbox">
  <div class="textbox-header">
  <div class="textbox-inner-header">
  <div class="textbox-title">
  	销售合同列表
  </div> 
  </div>
  </div>
  
<div>
<div class="eXtremeTable" >
<table id="ec_table" class="tableRegion" width="98%" >
	<thead>
	<tr>
		<td class="tableHeader"><input type="checkbox" name="selid" onclick="checkAll('id',this)"></td>
		<td class="tableHeader">序号</td>
		<td class="tableHeader">客户名称</td>
		<td class="tableHeader">合同号</td>
		<td class="tableHeader">货物数/附件数</td>
		<td class="tableHeader">制单人</td>
		<td class="tableHeader">审单人</td>
		<td class="tableHeader">验货员</td>
		<td class="tableHeader">签单日期</td>
		<td class="tableHeader">交货期限</td>
		<td class="tableHeader">船期</td>
		<td class="tableHeader">总金额</td>
		<td class="tableHeader">状态</td>
		<td class="tableHeader">操作</td>
	</tr>
	</thead>
	<tbody class="tableBody" >
	
	<c:forEach items="${datalist}" var="o" varStatus="status">
	<tr class="odd" onmouseover="this.className='highlight'" onmouseout="this.className='odd'" >
		<td><input type="checkbox" name="id" value="${o.id}"/></td>
		<td>${status.index+1}</td>
		<td>${o.customName}</td>
		<td><a href="toview.action?id=${o.id}">${o.contractNo}</a></td>
		<td>${o.cpnum }/${o.extnum }</td>
		<td>${o.inputBy}</td>
		<td>${o.checkBy}</td>
		<td>${o.inspector}</td>
		<td><fmt:formatDate value="${o.signingDate}" pattern="yyyy-MM-dd"/></td>
		<td><fmt:formatDate value="${o.deliveryPeriod}" pattern="yyyy-MM-dd"/></td>
		<td><fmt:formatDate value="${o.shipTime}" pattern="yyyy-MM-dd"/></td>
		<td>${o.totalAmount}</td>
		<td>
			<c:if test="${o.state==1}"><font color="green">已上报</font></c:if>
			<c:if test="${o.state==0}">草稿</a></c:if>
		</td>
		<td><a href="${ctx}/cargo/contractproduct/tocreate.action?contractId=${o.id}" title="新增货物信息">[货物]</a><td>
	</tr>
	</c:forEach>
	
	</tbody>
</table>
</div>
 
</div>
 
 
</form>
</body>
</html>

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

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

转载请注明出处:http://blog.csdn.net/acmman/article/details/48627483

相关文章
|
27天前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
52 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
93 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
|
3月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
|
3月前
|
JSON 前端开发 Java
Spring MVC返回JSON数据
综上所述,Spring MVC提供了灵活、强大的方式来支持返回JSON数据,从直接使用 `@ResponseBody`及 `@RestController`注解,到通过配置消息转换器和异常处理器,开发人员可以根据具体需求选择合适的实现方式。
155 4
|
3月前
|
XML 前端开发 Java
Spring MVC接收param参数(直接接收、注解接收、集合接收、实体接收)
Spring MVC提供了灵活多样的参数接收方式,可以满足各种不同场景下的需求。了解并熟练运用这些基本的参数接收技巧,可以使得Web应用的开发更加方便、高效。同时,也是提高代码的可读性和维护性的关键所在。在实际开发过程中,根据具体需求选择最合适的参数接收方式,能够有效提升开发效率和应用性能。
118 3