第七天 异构数据库支持+出口报运核心业务
1.同时支持多种主流数据,oracle/mysql/sqlserver
a)异构系统
Java实际开发中无法完全支持异构系统,同时支持windows,linux。
西安市政府网站,在windows平台上开发,在linux环境运行。
实现页面的静态化。按一定规则new/1009.shtml。
(html静态页面缺点,它无法实现文件包含,业界推出新技术shtml,它扩展了html,它也是静态页面,它实现了文件包含。要支持这个tomcat的修改ssi配置,默认这个支持配置关闭)
第一次调用时,这个静态文件不存在,系统就报404,系统用filter拦截404错误,去查询数据库,动态生成new/1009.shtml文件。
发现一个问题,在window平台没问题,到linux,它无法获取域名,它可以获取IP地址。
b)异构数据库,都有哪些要注意的呢?
2.核心业务:货运管理第二个流程,出口报运
a)定义:
做国际物流,货物要运往国外之前,向海关申报。向海关申报符合国家标准的货物,和货物的体积和重量信息。除了在合同中货物的基本信息外,在报运时新增7个字段,长,宽,高,毛重,净重,出口单价,含税。
分次报运
一个可以可以分多次来报运,体现在运输的货物数上。
例如:10000货物,第一次报运运输6000,第二次报运运输4000.
可以多次报运,这种情况很少。日常大多是一次报运。
b)分析设计
一个出口报运单来自多个购销合同(一对多);给货物信息新增的7个字段的内容。
创建一个出口报运单表
c)冗余设计
将货物信息冗余到报运单下的货物信息中。一个实现读取数据快速,减小业务的复杂度,业务逻辑简单。
d)打断设计实现跳跃查询
避免关联层级过多,数据量大了后,访问奇慢。打断设计。(表设计不成为文规定,表之间的关联关系不超过4层)
在设计时使用一个虚线箭头来表示表之间是存在关联关系,在设计时,不是往常的外键关系。利用一个字段来存储主表和子表之间的关系。
Where contract_id in (‘x’,’y’)
。
经过打断设计,表之间的关系不存在,跳跃查询。无需查询合同表,直接查询合同下的货物表。(新增)
经过上面的设计,后续业务变的更加简单。
创建映射文件
创建PO对象
创建dao层
创建Service层
创建Controller
出口报运新增,新增时要选择多个关联的货物。报运单自身的信息在修改中补录。
3.批量修改,批量提交,批量保存
a)动态表格技术dhtml
可以用js动态创建表格,行,单元格,设置单元格内容 DHTML
创建单元格写入内容innerText/innerHTML,利用innerHTML插入文本框,在这个文本框中显示数据
b)如果页面多个名称,springmvc如何封装,
如果是字符类型,拼接成一个字符串,之间用逗号隔开;
如何是日期类型,整形,浮点型,只保留第一个值,其他值丢掉。
页面有两个boxNum=10 boxNum=20,Integer boxNum
,第二值丢失 boxNum=10
;用数组声明方式;request.getParameterValues();
–没有类型概念,它都是字符串,手工转类型。
c)批量MRecord控件,自定义控件,esayUI/extJS GRID
拼接js串
d)Body onload事件和jQuery ready()事件
Onload有bug,有时执行动态js插入数据到页面时,有时可以有时报错。很不稳定。
所以使用ready事件替代。
Mrecord控件使用方法:
1)引入两个js,jQuery、tabledo.js
<script type="text/javascript" src="${ctx}/components/jquery-ui/jquery-1.2.6.js"></script>
<script type="text/javascript" src="${ctx}/js/tabledo.js"></script>
2)反复调用addRecord方法
3)后台准备数据,拼接addRecord串
4)利用jQuery 的ready事件,调用js串
4.业务,劳保报表
6000个单元格
哪个单元格的内容进行修改,代码只修改修改的框。给每个文本框增加一个隐藏域。12000个信息要提交。本来目的是优化,结果速度更慢。
最终每行添加一个隐藏域,当这行的数据进行了修改,在文本框的失去焦点事件onBlur,动态设置这个隐藏域为1。在修改代码时根据这个值判断,只有1的时候,数据才进行修改。不是1跳过。
批量新增,增加一个新增按钮,点一次调研一次addRecord方法,它的属性值,都为空串。
批量删除,表格dhtml提供删除行操作,remove,它把行从table中删除。数据库并没有删除,删除多个框时,记录下它们的id值,拼成一个串,用逗号隔开。后台代码判断这个隐藏域提交值不为空,删除这几个数据。
5.知识回顾
a)打断设计:
1.数据库设计先按照三范式,之后对一些需要优化的地方,使用反三范式设计(冗余)(以空间换设计)
2.实际业务非常复杂,关联层级过多,随着系统上线运行,用户的数据随着使用的时间,线性增长。不成文规定:关联层级在设计不超过4层。打断设计,在主表中加一个字段,字段来存储两个表之间的关系。多个的时候,之间用逗号隔开。一般情况下都是一次报运,就是一个合同一次报运,个别情况下多个合同一次报运,极端情况下3个合同一次报运。
由于打断设计,实现“跳跃查询”。报运需要合同下的货物信息时,无需通过多个合同对象,就可以直接查询货物的信息,通过这个打断设计的字段,利用SQL的in子查询。
b)核心业务:货运管理,出口报运
业务,杰信获得订单后,安排多个生产厂家生产货物,与此同时杰信准备报关的材料,除了海关要求的一些制式文档和杰信系统打印的《出口商品报运单》,交给海关进行审核。
6.页面控制
a)报运单新增,暗度陈仓。
用户选择报运关联的多个合同,代码直接进行数据的保存。保存相关合同的id集合,合同号集合,保存冗余的货物信息,保存冗余的附件信息。
b)批量修改
Mrecord自定义控件,来信息补录。批量,在页面上利用DHTML动态表格技术,实现表格元素的动态增加,动态创建行,动态创建单元格,利用innerHTML动态向单元格插入文本框,带数据的。
在后台准备数据,拼接成js串,将它写入一个变量中,在页面的jQuery的ready事件中,调用这个变量,形成多个js串,依次执行。动态添加到表格中。由于js运行很快,用户感觉不到添加的过程,以为直接展示。这样为用户提供一个非常方便的操作。
可以批量来修改货物信息。每行利用一个隐藏域,来存放是否修改标识,这样在记录行数过多时,修改的效应也非常高。
Mrecord控件它可以实现动态新增,还可以实现批量删除,自动排序。