【springmvc+mybatis项目实战】杰信商贸-21.合同总金额SQL

简介:
我们上一次解决了合同的货物以及附件显示功能,接下来我们要完成我们的另一项功能,也即是我们的购销合同的总金额。

我们的购销合同的总金额由以下金额构成:货物的总金额,而货物的总金额由货物本身的金额+附件金额构成,也就是说,我们想要获取购销合同的总金额,就要获取合同下的所有货物的总金额(货物总金额要获取所有货物的金额,以及这个货物下的所有附件的总金额)。

听起来有点绕,但是我们把它写成sql语句,分好层次,我们就能够清晰的理解购销合同的总金额是如何来的了:

1)可以通过货物的新增时,同步计算货物的总金额和和合同的总金额;在附件新增时,同步计算附件的总金额和合同的总金额;(程序来完成)(修改、删除时重新计算)
2)SQL查询实现
货物的总金额
select sum(cnumber*price) as cptotal from contract_product_c
where contract_id ='471e562b-bfa5-4ba7-a2b5-17e9b0d40179'

附件的总金额
select sum(cnumber*price) as exttotal from ext_cproduct_c
       where contract_product_id in (select contract_product_id from contract_product_c where contract_id=c.contract_id)

最终
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,
  ( 
      nvl((select sum(cnumber*price) as cptotal from contract_product_c
      where contract_id =c.contract_id),0)
      +
      nvl(
      (select sum(cnumber*price) as exttotal from ext_cproduct_c
       where contract_product_id in (select contract_product_id from contract_product_c where contract_id=c.contract_id))
       ,0)
  ) as total_amount,
c.CONTRACT_ID,c.OFFEROR,c.CONTRACT_NO,c.SIGNING_DATE,c.INPUT_BY,c.CHECK_BY,c.INSPECTOR,c.IMPORT_NUM,c.CREQUEST,c.CUSTOM_NAME,c.DELIVERY_PERIOD,c.SHIP_TIME,c.TRADE_TERMS,c.REMARK,c.PRINT_STYLE,c.OLD_STATE,c.STATE,c.OUT_STATE

from contract_c c
注:nvl(a,b),nvl函数是Oracle的一个函数(其他数据库要进行修改),参数a是取出的值,参数b是当a值为空null的时候值默认为b值。

我们修改ContractMapper的find配置语句块:
<!-- 查询多个 -->
	<!-- 如果支持异构数据,必须针对每个数据库写一个SQL语句,因为使用了底层数据函数nvl -->
	<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,
  		( nvl((select sum(cnumber*price) as cptotal from contract_product_c
      	  where contract_id =c.contract_id),0)
      		+
      	  nvl((select sum(cnumber*price) as exttotal from ext_cproduct_c
          where contract_product_id in (select contract_product_id from 
          contract_product_c where contract_id=c.contract_id)),0)
          ) as total_amount,
		c.CONTRACT_ID,c.OFFEROR,c.CONTRACT_NO,c.SIGNING_DATE,c.INPUT_BY,c.CHECK_BY,
		c.INSPECTOR,c.IMPORT_NUM,c.CREQUEST,c.CUSTOM_NAME,c.DELIVERY_PERIOD,c.SHIP_TIME,c.
		TRADE_TERMS,c.REMARK,c.PRINT_STYLE,c.OLD_STATE,c.STATE,c.OUT_STATE
		from contract_c c
	</select>

接下来我们重启服务器来测试:
我们可以看到,这个购销合同的总结是1600

我们来检验一下是不是1600。

首先,它有两个货物

总金额为:200+1200=1400。然后看一下附件,只有一件附件


附件总金额为200,所以最终总金额为1400+200=1600,和我们程序计算的一模一样。我们的总金额计算方法成功!


但是,我们要在增加、删除以及修改的时候对总金额进行更新,所以要修改一部分代码,这里我们就不在赘述

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

相关文章
|
3月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
5月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
353 18
|
10月前
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
10月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
589 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
9月前
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1257 0
|
10月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1020 0
|
10月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
609 0
|
10月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
530 0
|
10月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RestController
本文主要介绍 Spring Boot 中 MVC 开发常用的几个注解及其使用方式,包括 `@RestController`、`@RequestMapping`、`@PathVariable`、`@RequestParam` 和 `@RequestBody`。其中重点讲解了 `@RestController` 注解的构成与特点:它是 `@Controller` 和 `@ResponseBody` 的结合体,适用于返回 JSON 数据的场景。文章还指出,在需要模板渲染(如 Thymeleaf)而非前后端分离的情况下,应使用 `@Controller` 而非 `@RestController`
429 0
|
5月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
98 0