欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > 医药采购系统平台第5天01:药品目录导入功能的实现Oracle触发器的定义供货商药品目录模块的分析供货商目录表和供货商控制表的分析、数据模型设计和优化

医药采购系统平台第5天01:药品目录导入功能的实现Oracle触发器的定义供货商药品目录模块的分析供货商目录表和供货商控制表的分析、数据模型设计和优化

2025/4/16 14:53:47 来源:https://blog.csdn.net/elastic_solr/article/details/147156974  浏览:    关键词:医药采购系统平台第5天01:药品目录导入功能的实现Oracle触发器的定义供货商药品目录模块的分析供货商目录表和供货商控制表的分析、数据模型设计和优化

如果想要获取相关的源码,笔记,和相关工具,对项目需求的二次开发,可以关注我并私信!!!


一 第四天内容复习

1 用户修改成功后窗口无法自动关闭

如果修改成功后,窗口应该会自动关闭。

如果修改失败,窗口不会自动关闭,因为用户要看失败原因。

操作步骤:修改editsysuser.jsp页面中的JS代码里面的修改提交回调函数,如图:

红框内是添加的代码!!!

当然,对于用户添加成功后的窗口也可以实现自动关闭,只需在addsysuser.jsp页面中添加与上面相同的代码即可实现!!!

2 复习poi

Poi是apache的开源组件,提供一套java的api对word、excel等文档进行操作。

学习HSSF、XSSF,对excel操作。

使用HSSF进行excel文件写操作:

   HSSF只支持97-03版本excel,扩展名是.xls,每个sheet行数最大65536行。

  缺点:如果写数据量大文件,可能会导致内存溢出,原因,将所有数据对象放在内存中,最后执行文件内容写。

  优点:对于小数据量文件写操作,速度很快的。

 使用XSSF对excel写操作:

   XSSF只支持07以上版本excel,扩展名是.xlsx(不向下兼容), 每个sheet对行数据没 限制。

  优点:对大数据量文件执行写操作,不会导致内存溢出,原因,在写的过程中生成很多临时文件,一边写一边生成文件(内存中不会保留很多数据),最后将临时文件合并输出。

  缺点:对大数据量写操作,速度不快。

  如果需要导出1000条数据,使用HSSF导出。

  

工具类掌握 ExcelExportSXXSSF

使用HSSF和XSSF对excel进行读操作:

   HSSF只支持97-03版本excel,扩展名是.xls,每个sheet行数最大65536行。

   使用HSSF用户驱动模式:

     优点:方便编程,对于小数据量文件写操作,速度很快的。

     缺点:如果写大数据量文件,可能导致内存溢出,原因,将文件内容全部加载到内存,进行读操作。

     

    使用HSSF事件驱动模式:

      大概原理:通过事件驱动模式,需要实现一个接口HSSFListener,接口方法中定义事件驱动执行内容,在解析Excel文件每一行、每一个单元格直到解析出数据,这个过程进行不同的事件驱动。

      目标:在解析完每一行数据后事件驱动,将每一行数据获取到。

      优点:对读取大数据量的文件,不会导致内存溢出。

      缺点:编程实现复杂,读取文件速度不快,原因是在读取时进行事件 驱动,一边读一边进行事件驱动。

使用XSSF事件驱动模式。

  XSSF只支持07以上版本excel,扩展名是.xlsx(不向下兼容), 每个sheet对行数据没 限制。

    事件驱动的方法同HSSF事件驱动。

   

   使用HSSF或XSSF读取文件,实现数据导入,一般情况下03版本的65536行数据量够用。

      如果本机安装07版本的excel软件,使用HSSF导入,可以将.xlsx另存为03版本的文件。

二 药品目录导入功能的实现

1 需求

第一步:进入原型中的导入页面。页面中要包括:导入说明,导入信息模板,如图:

第二步:提前准备导入excel模版文件excel文件中包括导入说明、导入工作表模版(列顺序固定,该文件可以放到eclipse的project工程下的目录中

本系统在实际的页面中不可能做的跟原型页面一模一样,有些出入,但不影响功能的实现!

第三步:下载导入模版文件。点击“药品信息模板”链接下载.

将导入模板文件下载到本地中,然后打开该excel文件,可以看到两部分信息

第一部分:第一个sheet中的内容是导入说明

为了方便解析字段中的内容,所有字段都是字符串型!!

导入说明中的内容可以更详细,包括一些重要的字段的填写,必须要按照说明中的指导去填写,例如日期格式的

编写要按照说明中描述去写!

用户按照模版的导入说明,直接在模版中填写要导入的数据(用户就不必再重新创建一个excel文件来输入数

据了

第二部分:第二个sheet中的内容是药品信息,并且列名的名称和顺序必须固定,不可更改,否则后台会解析出错,因为后台就是按照此顺序来解析的!!

第四步:选择要导入的文件,执行导入操作

2 dao

因为执行的是导入的操作,实际是向药品目录表ypxx中批量插入记录的过程。

该表在昨天使用的逆向工程中已经自动生成过了.

3 定义Oracle触发器(重点)

注意:Ypxx表中,bm流水号字段(该流水号字段应该与省平台中的流水号的值相同)是通过触发器实现的(该触发器已经实现好了)。在mysql中有一个自增主键,但是在oracle中使用的是序列来表示该序列会在在插入之前通过触发器得一个序列值,实现自增主键的功能!

create or replace trigger generator_ypxxbm--在插入ypxx表之前进行触发before insert on ypxxfor each row
declare-- local variables here
begin--把新记录的值yyxxbm.nextval赋给bm字段select ypxxbm.nextval into :new.bm from dual;
end generator_ypxxbm;

4 service

接口功能:在昨天的内容中已经定义过了该HxlsOptRowsInterface接口了(昨天讲过的),HxlsOptRowsInterface接口中的数据已经保存在参数rowlist中。所以不用定义了

接口的实现:这里只需要实现HxlsOptRowsInterface接口(昨天讲过的),同时需要校验导入的数据,数据通过该

接口中的rowlist参数来接收。校验通过后方可调用dao进行插入操作。具体看代码实现

HxlsOptRowsInterface.java接口.

在昨天的文档中已经说明了,该接口已经存在于util工具类中:

public interface HxlsOptRowsInterface {

public static final String SUCCESS="success";

/**

 * 处理excel文件每行数据方法

 * @param sheetIndex 为sheet的序号

 * @param curRow 为行号

 * @param rowlist   行数据

 * @return success:成功则返回字符串success,否则为失败原因(失败则返回字符串).

 * @throws Exception

 */

public String optRows(int sheetIndex,int curRow, List<String> rowlist) throws Exception;

}

只需要编写针对HxlsOptRowsInterface接口的实现类

public class YpxxImportServiceImpl implements HxlsOptRowsInterface {@Autowiredprivate YpxxMapper ypxxMapper;@Overridepublic String optRows(int sheetIndex, int curRow, List<String> rowlist) throws Exception {/**
* 这里必须要使用try...catch进行捕获,因为这里涉及到对插入数据的校验.
* 通过查看HxlsOptRowsInterface接口中定义的信息可知:如果校验失败,返回失败信息(字符串类型);
* 如果校验成功则返回success字符串!
*/try {/*
* 第一步:获取模板文件中所填写的数据.
* optRows()方法中的参数rowlist中存储的是解析excel文件后的一行的数据,必须按照模版文件中的列名标题去解析,因为是你要求用户按照模板文件去填写的.如图:*/String mc = rowlist.get(0);// 通用名String jx = rowlist.get(1);// 剂型String gg = rowlist.get(2);// 规格String zhxs = rowlist.get(3);// 转换系数String zbjg = rowlist.get(4);// 中标价格String scqymc = rowlist.get(5);// 生产企业String spmc = rowlist.get(6);// 商品名String jyzt = rowlist.get(7);// 交易状态/*
* 第二步:进行数据的合法性校验。因为模板文件中的内容如果用户输入错了呢!校验的内容包括:
* 1.校验中标价格的合法性校验,字符串必须要能转换为float.这里略过....
* 2.校验交易状态的合法性.
*  等等...................包括其他数据的校验........
*///如果交易状态的数据不合法.if (jyzt == null || (!jyzt.equals("1") && !jyzt.equals("2"))) {// 查看HxlsOptRowsInterface接口中定义的参数可知:success表示成功,失败则返回失败信息(失败信息为字符串)return "交易状态输入值不对,请输入1:正常,2:暂停";}/*
* 第三步:进行唯一校验,因为在ypxx表中还有两个约束,如下图:其中一个是bm唯一性约束ÿ

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词