00:00
那首先第一件事情呢,我们先在这个号中添加这个依赖啊,把这个复制一下,然后接下来呢,我们把这个SRB,就是我们的项目打开,找到我们的卡,然后呢,在这个最下面这个地方呢,我们把这个依赖填到这个位置好,然后刷新一下。这个依赖列表。啊,让他去serving这个他们的一个依赖关系,嗯,然后接下来呢,这个确保我们的依赖已经成功的load进来了,这呢这呢哈,我们在开始编程啊。好,然后接下来呢,我们来看一下第二个步骤,第二个步骤呢,就是创建我们所需要导出的这个Excel的实体类,那么根据之前的经验,我们知道我们要导出的这个Excel的实体类呢,它就是Excel当中出现的数据,那么在这个例子当中呢,我们就做的简单一点,我们就把所有的这些数据呢,就一次性的导出到Excel里面,然后那怎么导呢,我们的Excel呢。
01:06
啊,就是类似这样的一个模式哈。就类似于这样。也就是说我需要把我数据库当中大家刚才看到的那些数据导出到Excel里面啊,然后让它导出成这种样式就可以了,那其实这挺简单的,就是原样输出嘛啊,不用做任何的一个什么行转列,列转行的处理哈,就是企业当中复杂的时候,可能就不是这样直接原样输出的,我们现在做的这种最简单的就是把数据库表中的这几个字段啊,原样输出到我们的Excel当中就可以了,所以呢,我们首先要确认一下,它呢,这是一个读对吧?啊是一个,呃,不是那个啊是是,嗯,你看一下啊,它呢是一个。就是Excel的一个,刚才我们第二个写的是啥。
02:03
啊是读对不对,要把这个Excel,刚才我们说我们要做的功能是数据的批量导入,对吧?啊是从我们的这个Excel里面,把这个原样的这个数据呢,导入到我们的数据库里面啊是这样的一个流程,好,那所以呢,我们就需要干嘛,第一个步骤要创建针对这个Excel的一个实体类对象啊,也就是说我我们所说的d to对象,数据传输对象,所以呢,我们就直接把这个d to先给它创建出来,我们在pogo里面创建一个d to,因为这d to也是属于pogo的一种,Pogo呢叫简单Java对象,那么简单Java对象当中分好多种啊,其中d to就是一种啊,专门做啊这个数据交换的这么一个简单的Java对象,所以呢,我们把它复制一下。在我们的pogo这个里面。
03:02
我们新建一个package,叫做d to。接下来呢,在这个d to里面,我们新建一个Excel date的d to,把刚才相关的所有的列都给它定义出来,我呢就会一一写了,咱们呢直接把它复制过来啊,这个里面呢,有Excel property的一个定义,那么这个定义呢,实际上我们写的时候,它可以把这个值呢写到我们的Excel的这个表头当中,那我们读的时候呢,它也可以把我们Excel表图当中相对应的这些啊标题来对应到我们的。实体类当中的这个property里面去,然后把它读进来,也就是说写的时候它可以写到Excel里,读的时候它可以匹配Excel当中的标题,然后来上这边对应具体的属性名,明白吧?啊,所以它是双向起作用的啊,这个好,那这样的话呢,就意味着未来我们这个Excel里面的这一列。
04:03
就会被读到这个属性中,对不对啊,我们Excel里面叫做上级ID的这一列就会被自动的读到这个属性中,依此类推,我们的名称值编码这些列都会被依次的读到名称、值编码这三个属性当中啊,所以说这是Excel property在读的过程当中,它一个起到的一个作用。然后接下来呢,我们来创建我们的监听器,所以在这个这个里面,我们new一个listen啊。然后接下来呢,在这个listener里面,我们创建一个Java class,那这个Java class呢,我们就写a sell,然后d to listen那行吧,嗯,然后接下来呢,我们让这个listener呢,去继承X pan,刚才我们说的I less。
05:08
跑这来I less listener,然后接下来呢,这个里面我们去把Excel这的d to这个泛型定义到这个位置啊,那接下来呢,我们在这地方out加enter,把刚才这两个方法。给它实现出来,实现出来之后呢,我们把刚才这两个内容,我先给它粘过来啊。是吧,你粘一下这样直接复制一下。还不能直接复制啊,这样复制。因为上面这个类型不一样。这样好,然后把那呢给他定义出来。
06:03
啊,这样的话呢,我们就写了这么一个监听器,这个名字好像写的有点不对啊。你来改一下啊,叫Excel啊叫什么Excel是吧。D to哈。这样就可以了,然后接下来呢,我们现在呢就可以啊在这个地方呢,读到我们的数据了啊,读到我们的数据之后呢,我们希望呢,在这个地方呢,做记录的解析对吧?啊好,解析完记录之后呢,我们希望在这个位置去存什么呀?去存数据啊去存数据就是说这个位置我们要调用我们的save方法啊然后呢,接下来呢,嗯,我们先来看一看。在咱们的应用程序的哪个地方,咱们来去创建这个Excel to,因为前面我们知道,看我们刚才刚刚做的这个例子哈,我们这例子呢,你要想让这个listener执行,我们必须去主动的创建这么一个listener对象,那么在哪创建的呢?我们在读的时候是在这个地方new了一个Excel student detail listener,对不对?也就是说你要在read的方法当中。
07:18
把这个listener对象作为它的第三个参数传进去就可以了,然后前面呢,传这个位置和这个那个封装的数据类型,第三个参数呢,就是那个监听器对象,然后后面呢,再通过这个方式呢,去做Excel的读,所以其实过程很简单,就是这个关键就是这段代码我们写在哪,要找一个地方呢去写这个代码,那我们决定呢,把这个代码写在service层,就是写在业务层,所以呢,我们找到我们的应用程序的业务层。Service啊,在这个里面呢,咱们找到Di service,在这个service里面呢,我们去写一个import。
08:03
Data这样的一个方法,那么在这个方法里面呢,我们应该是抽象的去接收一个input stream。因为我们要从流的这个里面去读到这个Excel,那现在呢,我们能够调用这个service的其实就是controller了,对吧?能够调用controller的是不是前端的阿贾克斯请求啊,他在前端要向这个controller发一个请求,那发一个什么请求才能够在前端传过来一个into the stream呢?我们说我们应该是通过浏览器端是吧,选择一个本地的Excel文件,因为你要把这个Excel文件的内容导入到数据库当中嘛,所以你肯定是在浏览器端有个类似选择文件的一个按钮,然后选择这个Excel文件,把这个Excel文件是不是通过我们的前端传递到我们的controller层啊,再从controller层把这个input stream获取的,然后呢,从input stream里面解析出我们的文件流来,这样的话,从文件流当中啊,我们去啊,分析我们Excel里面的每一行的内容,我们去监听Excel每一行的内容啊,所以。
09:15
所以这个地方呢,我们用input stream,然后接下来呢,我们把它实现出来,Out加enter employment method data。好,那这样的话呢,这个就是我们的啊这个service,那service这块呢,我们其实就读了读跟之前一样,这样读就行了。好复制一下,然后接下来呢,在这个地方我们把它粘过来,粘过来之后呢,有几个东西需要改,第一个就是你的这个listener的名字,我这listener名字呢,叫Excel de d to listener,所以这面呢,我们就写Excel d to listener啊,然后这个位置呢,我们写什么呢?写这个。
10:01
Excel de的d to,所以这个位置呢,我们把它改成Excel de d to,然后这个位置我们看一下这个read方法呢,它其实有重载的方法,它除了可以接收file类型的参数之外,它还可以接收input stream类型的参数,所以那正好呢,我们就把刚才这个input stream就给它设置上就可以了,那这整个呢,就是我们Excel的一个读的过程了,那么为了后面在呃调试方便呢,我在这个地方呢,添加一个沙了风啊,然后在这个地方呢,咱们打一个日志the log.info。Excel导入吧,导入成功是不是啊好,就先填写日志啊,看看是不是这边执行完了才执行这个代码啊,所以这块呢,就是咱们简单的一个service层的一个调用了啊,然后调用完了之后呢,咱们。
11:04
未来在这个listener里面啊,肯定呢会去啊执行什么呀,执行一系列的这样的一个保存的工作,所以呢,这肯定就是一个呃,对数据库的一个不断的写的一个操作了,然后接下来呢,我们可以在这个地方给他呢添加一个事物啊,就是一旦中间写的过程当中出现问题了,那么我们就全都回滚,然后下一次重新导入的时候呢,我们再重新的去写Excel就行了,否则的话呢,你会发现你写到一半了,然后它出错了,那你说你你这Excel里面的数据,它导了一半成功的,一半失败的,你下次再导就不太好办了,你得把成功导入的那些都删掉,然后再导失败的,对吧?所以说呢,我们就导的时候呢,那就干脆啊,因为它数据量也没有那么大啊好,那就干脆就是设事物啊,呃,事物一旦成功,就全导事物中途失败,那就。
12:04
回车就行了,好,然后这块呢,我们就写cel exception.class就行了,那它原来的呢是runtime exception class,我们希望呢,所有的异常出现的时候它都做回滚,所以呢,我们这边就写exception class啊,然后外面这一层呢,你也可以加个原大括号,也可以不加啊,因为如果加大括号的话,里面呢还可以写其他的class啊,那现在我们就一个exception class,所以加和不加都可以,好然后呢,这块我们的这个service就写好了啊,我们的service写好了之后呢,我们来看一看。我们在controller来调用一下它对不对,所以呢,我们就找到我们的controller定啊一个controller controller呢,在admit里面,我们要添加那个take controller,所以我们把IC controller复制一份,不知道这个amin里面给它加一个前缀,就aminic controller,然后在adminic controller里面呢,我们加上我们之前的前缀叫amin call addict,然后接下来呢,在这个里面,我们把前面的一些基本的这个注解呢,都给它填一填啊这个注解的填写呢,我就。
13:19
直接我就复制一下了,好吧,我就不一了个写了,太麻烦,好,然后所以呢,这里面就包含我们的wa的一个注解,包含之前的rice controller,包含这个request,刚才咱们改造的这个呃,路径包含杀丰富追,还包含cross orange,包含这样的几个内容,然后接下来呢,咱们就把刚才写的service导进来,Read source啊,然后呢,Date service date service,然后呢,接下来就是public are Bach啊,这块是a hot,对吧?好,这块呢我们写一个圈啊,Post mapping,然后这块呢,咱们写杠a hot,好,然后上面这块呢,咱们写一个API operation,那这块呢写it sell数据的批量。
14:19
导入好吧,好,那这块呢,我们就写好了,写好了之后呢,在这个batch talk里面呢,我们呢从前端去接收一个文件,那肯定呢是用multi part的形式啊,直接上做上传操作就行,所以呢这块是file,然后这面呢,我们就可以写一个蕊快parater。好,那我们说前端这面的组件的名称呢,就叫fair,当然如果你不写的话,那这个fair也是意意味着前端的组件名称啊叫fair,好,那这个我们就写好,写好了之后呢,因为啊这嗯,我看一下啊,Request request parameter行,我再写一个注解吧,就是那个APS的注解啊API,然后拍meter,然后在这个地方呢,咱们写一个value,等于Excel数据字典文件啊后面呢,咱们写一个require出啊把这个R呢给它引进来,好,然后在这个里面呢,咱们就引这个这的service里面刚才写的这个A。
15:32
Inport data啊,这个方法,也就是说刚才我们在这个地方写的这个import data这个这个方法对吧?啊,然后它需要一个into the stream参数,所以呢,在这个地方呢,我们得从file里面。Get出这个input stream来,好,然后我们拿到这个input stream呢,我们就传递给这个N泡的data塔,好然后接下来呢,我们来看一下,在这个里面呢,它有一个异常是吧?啊有一个异常,异常的话呢,我们可以去补货这个。
16:09
异常,怎么捕获这个异常呢?就是。啊,Controltl out加T,然后呢,我们用try catch把它包裹住,包裹住之后呢,在这个位置我们呢,就是捕获IO exception,或者是说你可以预测到未来,万一其他有有其他异常的话,我们就用这个pass做兜底啊,把所有的异常都兜住,兜住之后呢,在这个地方呢,我们是肉。我们之前的new business exception,这是我们的自定义异常啊,这是我们的自定义异常,然后呢,我们自定异常这里面呢,它接收一个枚举,还记得吧,我们的这个business exception不是我们自定义异常类嘛,好,我们自定义这个business exception类是写在我们的common下面的啊,如果大家忘记了的话,往前去翻一翻我们自定义常那块讲的内容,然后呢,它接收它有这么多个重载的构造函数啊,有这么多重载的勾搭函数,我们用奶的呢,我们用这个。
17:10
把原始的这个异常的错误对象给他传递过来,让他能打印异常跟踪站,同时呢,我们再传递一个自己的错误的枚举信息,然后呢给前端返回这样的一个错误枚举信息啊,所以呢,在这个地方我们就写瑞斯Bo nu点我们在这个枚举里面呢,写了一个upload arrow啊,就它文件上传错误好,然后呢,我们呢,在这个位置第二个参数把这个E给它传进去。就是这个exception对象给它传进去,好,那这样的话呢,我们就完成了整个的这样的一个文件上传,那同时呢,在这地方当文件上传成功,并且在他的对这个地方读取成功之后呢,我们在这个位置,我们就。
18:06
Return r.OK啊,然后点message啊,数数据字典,数据批量导入成功,明白这意思吧,好,那现在呢,我们先来简单的做一个测试啊,当然目前为止我们还没有真正的做批量导入,我们只是在这个地方,是不是把从Excel读取到的这个数据在控制台上打印了一下呀?啊,然后我们打印成功之后啊,我们再去回头想一想,怎么在map当中调用save方法,把这个数据存到我们的数据库当中,所以我们第一个要做的事情呢,就是先测一下这个上传成不成功,然后呢,从上传的这个文件里面取出什么呢?这啊,从上传的文件里面取出input stream传递给我们的data的service成没成功,传递给service成功了之后呢,我们要再判断一下它的这个读取这个input stream里面的这个通过监听器来读取每一行的内容成没成功,如果到这都成功了,我们再来去考虑怎么去调用save方法,把这读取出来的内容导到数据库当中,好吧,好,那现在呢,我呢,就把这个呃,应用程序呢,给它重新启动一下。
19:43
好。好,现在我们的这个应用程序呢,已经启动成功了,启动成功了之后呢,我们来看一看这面的上荣宝管理平台哈,然后这面呢,呃的测试啊。
20:01
呃,测试把这个改成测试吧,Local host8110对吧?啊,Father UI HTML往回撤,然后呢,我们来看一下这个数据字典管理,刚才我们写的这个Excel数据批量导入好在这个位置呢,我们就可以选try it out,在这个位置呢,我们点选择文件,然后呢,我们找到我们的。第二部分里面的这个数据字典初始化数据好,然后呢,我先把我的这控制台呢,给它对清空一下啊,然后呢,我们在。我们在这个地方呢,点击一下excute,好,然后呢,我们来看一下这块呢,就是打印了成功,我们再来看一下控制台,控制台呢就解析出来每一条Excel当中的记录了,对不对啊,就这里面都有了啊,所以呢,我们已经成功的将Excel当中的这个磁盘当中的这个数据呢,已经读到我们Java应用程序的内存当中了,那接下来我们要做的这个事情呢,就是呃,把我们Java当中内存的这些读出来的这个数据啊,依次的存到我们的数据库的表当中,所以在这个地方呢,我们要调用map。
21:13
啊,来进行数据库表的数据的存储啊,就是下面的内容。
我来说两句