5、原生jdbc链接数据库实例-自动取款机

ATM自动取款机需求
一.登陆
1.界面要求:服务选择
1.老用户登陆:进入后输入卡号密码登陆
2.新用户开户:开户需要输入身份证号,记录姓名,开户时间。然后机器给出卡号,原始密码:111111。
卡号:当前系统时间的毫秒数:new Date().getTime();
      卡号=“ICBC”+毫秒数;

二.服务选择
用户登陆后显示服务选择菜单:存款,取款,汇款,修改密码,查看余额。
将五个功能写成五个方法,在菜单选项中去调用
三.存款
此操作是已登录用户,输入存款金额,直接打到用户的账户上

//可以在登陆或者新建用户时将卡号设置为全局变量保存,随时可以调用
四.取款
此操作是已登录用户,输入取款金额,判断是否有足够余额,直接从用户的账户取出(要求:每次不大于3000,每天不超过5w)
1.查询余额。
2.判断当次金额3000以内
3.查询操作记录表:查询当天取款总金额
4.把查询出的总金额+当前要取款金额>1w
5.取款成功后记录本次操作:
五.汇款
此操作是已登录用户,输入汇款人账号,显示汇款人信息,确认后再输入金额,判断余额是否足够,然后打款。(要求单笔金额上限5000,每天不超过10w)
1.查询汇款人信息:
2.确认后,再查询当前用户余额是否足够: 
3.判断当次金额5000以内
4.查询操作记录表:查询当天汇款总金额
5.把查询出的总金额+当前要取款金额>1w
6.汇款成功后记录本次操作:

六.修改密码(密码必须是6位)
此操作是已登录用户,进入修改密码服务,提示输入原始密码,提示输入新密码,提示再次确认,然后修改成功
七.查看余额
此操作是已登录用户,查看当前账户的余额。
八.退卡操作:此操作后需要重新登录或者回到最起始界面。其他功能操作完后都回到服务选择菜单。


附加功能:1.对账单  2.用户数据备份   3.用户数据恢复
1.对账单:用户能够查询自己的交易记录,并生成txt文档保存
要求:用户输入起止日期,得到txt对账单
对账单格式如下:
卡号:123902939928989182
日期:2015-09-15-----2015-09-30
操作时间                操作类型    交易金额    
2015-09-15 12:12:12        存款        +10000
2015-09-30 11:11:11        汇款        -5000
…………………
汇总:
存款:+25423
取款:-22221
汇款:-12233

2.用户数据备份
要求:将所有用户信息写入到xml文档保存
Xml格式如下:
<users>
    <user id="1">
        <!-- 卡号 -->
        <cardid>87348719283389382983</cardid>
        <!-- 身份证 -->
        <sfzid>430909203920901233</sfzid>
        <!-- 开户时间 -->
        <createtime>2011-09-09 23:12:12</createtime>
        <!-- 余额 -->
        <balance>20933.22</balance>
        <!-- 密码 -->
        <password>998822</password>
    </user>
<users>

3.用户数据恢复
将保存的xml文档里面的数据还原到数据库中

设计表

建表

drop table user_info
drop table operate_info

select * from user_info;
select * from user_infobak;
select * from type_info;
select * from operate_info;

delete from user_infobak;

--创建用户表
create table user_info(
    user_id number primary key,
    user_cardnum varchar2(30) not null unique,
    user_name varchar2(30),
    user_idcard varchar2(30) not null,
    user_password char(6) default '111111',
    user_opentime date,
    user_money number(18,2) check(user_money>0 or user_money=0) not null, 
    user_status char(1) 
    )
    
--创建操作类型表
create table type_info(
    type_id number primary key,
    type_name varchar2(30) not null
    )    
    
--创建操作记录表
create table operate_info(
    operate_id number primary key,
    operate_time date not null,
    operate_money number(15) not null,
    user_cardnum varchar2(30),
    second_cardnum varchar2(30),
    type_id number,
    foreign key (user_cardnum) references user_info (user_cardnum),
    foreign key (type_id) references type_info (type_id)
    )
   
--分别创建操作类型表、操作记录表序列
create sequence sq_user nocache;
create sequence sq_type nocache;
create sequence sq_operate nocache;

--在码表中加入数据
insert into type_info values(sq_type.nextval,'存款');
insert into type_info values(sq_type.nextval,'取款');
insert into type_info values(sq_type.nextval,'汇款');

--1.1新用户开户(开户时就会自动存款10元)
insert into user_info values
('ICBC'||to_char((sysdate-to_date('1970-01-01','yyyy-mm-dd'))*86400000),'宋江','430124201701017925',123456,sysdate,10);
--1.1老用户登录
select * from user_info where user_cardno='ICBC1512573295000' and user_password='123456';

--2.1存款

开发后的文件目录

dao层、service、pojo类代码就不贴出了,这里仅贴出view层代码。。。。

  Menu.java

  1 /*
  2  * 主菜单
  3  * 1.负责展示数据
  4  * 2.负责收集用户数据
  5  * 3.负责与用户交互
  6  */
  7 package com.view;
  8 
  9 import java.util.Scanner;
 10 
 11 public class Menu {
 12     LoginIn loginin;//登录类对象
 13     Function function;//服务类对象
 14     AddFuction addfuction;//附加功能对象
 15     
 16     public static void main(String[] args) {
 17         Menu menu=new Menu();
 18         Scanner sc=new Scanner(System.in);
 19         while(true){
 20             System.out.println("请选择:");
 21             System.out.println("1.用户服务");
 22             System.out.println("2.附加功能");
 23             switch(sc.nextInt()){
 24             case 1:
 25                 menu.loginin();
 26                 menu.function();
 27                 break;
 28             case 2:
 29                 menu.addfuction();
 30                 break;
 31             default:
 32                 System.out.println("输入有误,请重新输入!");
 33                 break;
 34             }
 35             System.out.println("是否继续:y/n");
 36             if(!"y".equals(sc.next())){
 37                 break;
 38             }
 39         }
 40         System.out.println("操作结束,欢迎您再次使用");
 41         
 42         
 43     }
 44     
 45     public Menu(){
 46         System.out.println("====欢迎使用ATM自动取款机====");
 47     }
 48     
 49     //1.登录选择
 50     public void loginin(){
 51         loginin=new LoginIn();
 52         boolean b1=true;
 53         while(b1){
 54             int i=loginin.start();
 55             switch(i){
 56             case 1:
 57                 loginin.login();
 58                 if(loginin.user==null){
 59                     System.out.println("对不起,登录失败,请重试!");
 60                 }else{
 61                     System.out.println("恭喜您,登录成功!");
 62                     b1=false;
 63                 }
 64                 break;
 65             case 2:
 66                 loginin.register();
 67                 if(loginin.user==null){
 68                     System.out.println("对不起,开户失败,请重试!");
 69                 }else{
 70                     System.out.println("恭喜您,开户成功!");
 71                     b1=false;
 72                 }
 73                 break;
 74             default:
 75                 System.out.println("输入有误,请重新输入!");
 76                 break;
 77             }
 78         }
 79     }
 80     
 81     //2.功能选择
 82     public void function(){
 83         function=new Function(loginin.user,loginin.userSer);
 84         boolean b2=true;
 85         while(b2){
 86             int j=function.start();
 87             switch(j){
 88             case 1:
 89                 if(function.deposit()){
 90                     System.out.println("存款成功!");
 91                 }else{
 92                     System.out.println("操作失败,请重试!");
 93                 }
 94                 break;
 95             case 2:
 96                 if(loginin.user.getUser_status()==1){
 97                     System.out.println("卡已冻结,无法取款!");
 98                     break;
 99                 }
100                 if(function.withdrawal()){
101                     System.out.println("取款成功!");
102                 }
103                 break;
104             case 3:
105                 if(loginin.user.getUser_status()==1){
106                     System.out.println("卡已冻结,无法汇款!");
107                     break;
108                 }
109                 if(function.remit()){
110                     System.out.println("汇款成功!");
111                 }
112                 break;
113             case 4:
114                 if(loginin.user.getUser_status()==1){
115                     System.out.println("卡已冻结,无法修改密码!");
116                     break;
117                 }
118                 if(function.changepw()){
119                     System.out.println("密码修改成功!");
120                 }
121                 break;
122             case 5:
123                 function.showmoney();
124                 break;
125             case 6:
126                 function.quit();
127                 System.out.println("您已退出!");
128                 b2=false;
129                 break;
130             case 7:
131                 if(loginin.user.getUser_status()==1){
132                     System.out.println("卡已冻结,无法查询账单!");
133                     break;
134                 }
135                 function.statement();
136                 break;
137             default:
138                 System.out.println("输入有误,请重新输入!");
139                 break;
140             }
141         }
142     }
143     
144     //3.附加功能选择
145     public void addfuction(){
146         addfuction=new AddFuction();
147         int t = addfuction.start();
148         switch (t) {
149         case 1:
150             try {
151                 if (addfuction.backup()) {
152                     System.out.println("数据备份成功!");
153                 } else {
154                     System.out.println("数据备份失败!");
155                 }
156             } catch (Exception e) {
157                 // TODO Auto-generated catch block
158                 e.printStackTrace();
159             }
160             break;
161         case 2:
162             try {
163                 if (addfuction.recover()) {
164                     System.out.println("数据恢复成功!");
165                 } else {
166                     System.out.println("数据恢复失败!");
167                 }
168             } catch (Exception e) {
169                 // TODO Auto-generated catch block
170                 e.printStackTrace();
171             }
172             break;
173         default:
174             System.out.println("输入有误,请重新输入!");
175             break;
176         }
177     }
178 }

  LoginIn.java

 1 /*
 2  * 用户登录或注册类
 3  */
 4 package com.view;
 5 
 6 import java.util.Scanner;
 7 
 8 import com.pojo.*;
 9 import com.service.*;
10 
11 public class LoginIn {
12     Scanner sc=new Scanner(System.in);
13     IUserService userSer = new UserService();
14     User_info user;
15     
16     //登录选择界面
17     public int start(){
18         System.out.println("请选择服务:");
19         System.out.println("1.老用户登录");
20         System.out.println("2.新用户开户");
21         int i=sc.nextInt();
22         return i;
23     }
24     
25     //1.老用户登录
26     public void login(){
27         System.out.println("您当前选择的是:登录操作");
28         System.out.println("请输入卡号:");
29         String cardnum=sc.next();
30         System.out.println("请输入密码:");
31         String password=sc.next();
32         user=userSer.userlogin(cardnum, password);
33     }
34     
35     //2.新用户开户
36     public void register(){
37         System.out.println("您当前选择的是:开户操作");
38         System.out.println("请输入身份证号码:");
39         String idcard=sc.next();
40         System.out.println("请输入您的姓名:");
41         String name=sc.next();
42         user=userSer.userOpenAccount(idcard, name);
43     }
44 }

  Function.java

  1 /*
  2  * 用户选择的服务功能类
  3  */
  4 package com.view;
  5 
  6 import java.io.BufferedReader;
  7 import java.io.BufferedWriter;
  8 import java.io.File;
  9 import java.io.FileWriter;
 10 import java.io.IOException;
 11 import java.sql.Timestamp;
 12 import java.text.ParseException;
 13 import java.text.SimpleDateFormat;
 14 import java.util.ArrayList;
 15 import java.util.Date;
 16 import java.util.List;
 17 import java.util.Scanner;
 18 
 19 import com.pojo.*;
 20 import com.service.*;
 21 
 22 public class Function {
 23     Scanner sc=new Scanner(System.in);
 24     IUserService userSer;
 25     IOperateService operateSer=new OperateService();
 26     ITypeService typeSer=new TypeService();
 27     User_info user;
 28     
 29     public Function(User_info user,IUserService userSer){
 30         this.user=user;
 31         this.userSer=userSer;
 32     }
 33     
 34     //选择界面
 35     public int start(){
 36         System.out.println("请选择相关服务类型:");
 37         System.out.println("1.存款");
 38         System.out.println("2.取款");
 39         System.out.println("3.汇款");
 40         System.out.println("4.修改密码");
 41         System.out.println("5.查看余额");
 42         System.out.println("6.退卡");
 43         System.out.println("7.对账单");
 44         int i=sc.nextInt();
 45         return i;
 46     }
 47     
 48     //1.存款方法
 49     public boolean deposit(){
 50         System.out.println("您当前选择的是:存款操作");
 51         System.out.println("请输入金额:");
 52         int money=sc.nextInt();
 53         System.out.println("正在处理,请稍后。。。");
 54         try {
 55             Thread.sleep(2000);
 56         } catch (InterruptedException e) {
 57             // TODO Auto-generated catch block
 58             e.printStackTrace();
 59         }
 60         //存款
 61         if(userSer.userDeposit(money)){
 62             //保存操作信息
 63             if(operateSer.saveOperatemessage(money, user.getUser_cardnum(), null,1)){
 64                 return true;
 65             }
 66         }
 67         return false;
 68     }
 69     
 70     //2.取款方法
 71     public boolean withdrawal(){
 72         System.out.println("您当前选择的是:取款操作");
 73         System.out.println("请输入金额:");
 74         int money=sc.nextInt();
 75         System.out.println("正在处理,请稍后。。。");
 76         try {
 77             Thread.sleep(2000);
 78         } catch (InterruptedException e) {
 79             // TODO Auto-generated catch block
 80             e.printStackTrace();
 81         }
 82         //查看余额
 83         if(userSer.userCheckBalance()<money){
 84             System.out.println("余额不足,取款失败!");
 85             return false;
 86         }
 87         //每次取款在3000以内
 88         if(money>3000){
 89             System.out.println("取款失败,当次取款金额不能大于3000!");
 90             return false;
 91         }
 92         //查询当天已取款总金额
 93         if(operateSer.todayAllwithdrawal(user.getUser_cardnum())+money>50000){
 94             System.out.println("取款失败,每天取款金额不能超过50000!");
 95             return false;
 96         }
 97         //取款
 98         if(userSer.userWithdrawal(money)){
 99             //保存操作信息
100             if(operateSer.saveOperatemessage(money, user.getUser_cardnum(), null,2)){
101                 return true;
102             }
103         }
104         System.out.println("取款失败,请重试!");
105         return false;
106     }
107     
108     //3.汇款
109     public boolean remit(){
110         System.out.println("您当前选择的是:汇款操作");
111         System.out.println("请输入对方卡号:");
112         String secardnum=sc.next();
113         System.out.println("您要汇款的卡号为:"+secardnum+",请确认:y/n");
114         String s=sc.next();
115         if(!"y".equals(s)){
116             System.out.println("交易结束!");
117             return false;
118         }
119         System.out.println("请输入金额:");
120         int money=sc.nextInt();
121         System.out.println("正在处理,请稍后。。。");
122         try {
123             Thread.sleep(2000);
124         } catch (InterruptedException e) {
125             // TODO Auto-generated catch block
126             e.printStackTrace();
127         }
128         //查看余额
129         if(userSer.userCheckBalance()<money){
130             System.out.println("余额不足,汇款失败!");
131             return false;
132         }
133         //每次汇款在3000以内
134         if(money>5000){
135             System.out.println("汇款失败,当次汇款金额不能大于5000!");
136             return false;
137         }
138         //查询当天已汇款总金额
139         if(operateSer.todayAllremit(user.getUser_cardnum())+money>100000){
140             System.out.println("汇款失败,每天汇款金额不能超过100000!");
141             return false;
142         }
143         //汇款
144         if(userSer.userRemit(secardnum,money)){
145             //保存操作信息
146             if(operateSer.saveOperatemessage(money, user.getUser_cardnum(),secardnum,3)){
147                 return true;
148             }
149         }
150         System.out.println("汇款失败,请重试!");
151         return false;
152     }
153     
154     //4.修改密码
155     public boolean changepw(){
156         System.out.println("您当前选择的是:修改密码操作!");
157         System.out.println("请输入旧密码:");
158         String oldpassword=sc.next();
159         if(!user.getUser_password().equals(oldpassword)){
160             System.out.println("您输入的密码有误,操作结束!");
161             return false;
162         }
163         System.out.println("请输入新密码:");
164         String newpassword1=sc.next();
165         System.out.println("请确认新密码:");
166         String newpassword2=sc.next();
167         if(!newpassword1.equals(newpassword2)){
168             System.out.println("您两次输入的密码不一致,密码修改失败!");
169             return false;
170         }
171         System.out.println("正在处理,请稍后。。。");
172         try {
173             Thread.sleep(2000);
174         } catch (InterruptedException e) {
175             // TODO Auto-generated catch block
176             e.printStackTrace();
177         }
178         //修改
179         if(userSer.userChangePasswd(oldpassword, newpassword2)){
180             return true;
181         }
182         System.out.println("密码修改失败!");
183         return false;
184     }
185     
186     //5.查看余额
187     public void showmoney(){
188         System.out.println("正在处理,请稍后。。。");
189         try {
190             Thread.sleep(2000);
191         } catch (InterruptedException e) {
192             // TODO Auto-generated catch block
193             e.printStackTrace();
194         }
195         System.out.println("您当前余额为"+userSer.userCheckBalance()+"元");;
196     }
197     
198     //6.退卡
199     public void quit(){
200         user=null;
201         userSer.userQuit();
202     }
203     
204     //7.对账单
205     public void statement(){
206         List<Operate_info> operlist=new ArrayList<>();
207         System.out.println("请输入起始日期:yyyy-MM-dd");
208         String startdate=sc.next();
209         System.out.println("请输入终止日期:yyyy-MM-dd");
210         String enddate=sc.next();
211         System.out.println("正在处理,请稍后。。。");
212         try {
213             Thread.sleep(2000);
214         } catch (InterruptedException e) {
215             // TODO Auto-generated catch block
216             e.printStackTrace();
217         }
218        operlist=operateSer.queryRecord(user.getUser_cardnum(), startdate, enddate); 
219        String path="src/com/view/"+user.getUser_name()+".txt";
220        //调用写文件方法
221        if(writef(path,operlist)){
222            System.out.println("交易记录查询成功!");    
223        }else{
224            System.out.println("找不到相应记录!");    
225        }
226        
227     }
228     
229     //8.写账单到文件中
230     public boolean writef(String path,List<Operate_info> operlist){
231         SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");
232         SimpleDateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
233         File file=new File(path);
234         BufferedWriter bw=null;
235         StringBuilder sb=new StringBuilder();
236         try {
237             //如果文件不存在,就创建一个新文件
238             if(!file.exists()){
239                 file.createNewFile();
240             }
241         } catch (IOException e) {
242             // TODO Auto-generated catch block
243             e.printStackTrace();
244         }
245         //将记录添加到sb中
246         if(operlist!=null){
247             String s1="卡号:"+operlist.get(0).getUser_cardnum();
248             String s2="日期:"+sdf1.format(operlist.get(0).getOperate_time())+
249                     "------"+sdf1.format(operlist.get(operlist.size()-1).getOperate_time());
250             String s3="操作时间	"+"操作类型	"+"操作金额";
251             //将卡号日期添加到sb中
252             sb.append(s1+"
"+s2+"
"+s3+"
");
253             int all1=0;
254             int all2=0;
255             int all3=0;
256             //将交易记录添加到sb中
257             for(Operate_info oper:operlist){
258                 String ss="";
259                 String oo="";
260                 switch(oper.getType_id()){
261                 case 1:
262                     ss="存款";
263                     oo="+";
264                     all1+=oper.getOperate_money();
265                     break;
266                 case 2:
267                     ss="取款";
268                     oo="-";
269                     all2+=oper.getOperate_money();
270                     break;
271                 case 3:
272                     ss="汇款";
273                     oo="-";
274                     all3+=oper.getOperate_money();
275                     break;
276                 }
277                 String s4=sdf2.format(oper.getOperate_time())+"	"+ss+"	"+oo+oper.getOperate_money();
278                 sb.append(s4+"
");
279             }
280             //汇总
281             String s4="存款:+"+all1;
282             String s5="取款:-"+all2;
283             String s6="汇款:-"+all3;
284             sb.append("---------------"+"
"+"汇总:"+"
");
285             sb.append(s4+"
"+s5+"
"+s6);
286         }
287         //将sb写到文件中
288         if(sb.length()!=0){
289             try {
290                 bw=new BufferedWriter(new FileWriter(file));
291                 bw.write(sb.toString());
292                 bw.flush();
293                 return true;
294             } catch (IOException e) {
295                 // TODO Auto-generated catch block
296                 e.printStackTrace();
297             }finally{
298                 try {
299                     bw.close();
300                 } catch (IOException e) {
301                     // TODO Auto-generated catch block
302                     e.printStackTrace();
303                 }
304             }
305         }
306         return false;
307     }
308 }

  AddFunction.java

  1 /*
  2  * 附加功能类
  3  */
  4 package com.view;
  5 
  6 import java.io.FileWriter;
  7 import java.io.Writer;
  8 import java.text.SimpleDateFormat;
  9 import java.util.ArrayList;
 10 import java.util.Date;
 11 import java.util.List;
 12 import java.util.Scanner;
 13 
 14 import javax.xml.parsers.DocumentBuilder;
 15 import javax.xml.parsers.DocumentBuilderFactory;
 16 
 17 import org.w3c.dom.Comment;
 18 import org.w3c.dom.Document;
 19 import org.w3c.dom.Element;
 20 import org.w3c.dom.NodeList;
 21 
 22 import com.pojo.User_info;
 23 import com.service.*;
 24 import com.sun.org.apache.xml.internal.serialize.OutputFormat;
 25 import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
 26 
 27 
 28 public class AddFuction {
 29     Scanner sc=new Scanner(System.in);
 30     IUserService userSer=new UserService();
 31     IOperateService operateSer=new OperateService();
 32     ITypeService typeSer=new TypeService();
 33     
 34     public int start(){
 35         System.out.println("请选择功能:");
 36         System.out.println("1.备份数据");
 37         System.out.println("2.数据恢复");
 38         int i=sc.nextInt();
 39         return i;
 40     }
 41     
 42     //1.备份数据
 43     public boolean backup() throws Exception{
 44         System.out.println("正在处理,请稍后。。。");
 45         try {
 46             Thread.sleep(2000);
 47         } catch (InterruptedException e) {
 48             // TODO Auto-generated catch block
 49             e.printStackTrace();
 50         }
 51         List<User_info> userlist=userSer.queryUserMessage();
 52         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
 53         DocumentBuilder db=dbf.newDocumentBuilder();//构建文档对象
 54         Document d=db.newDocument();//创建新的document对象
 55         Element e=d.createElement("users");//创建根节点
 56         if(userlist!=null){
 57             for(User_info user:userlist){
 58                 Element ee=d.createElement("user");//创建第一层子节点
 59                 ee.setAttribute("id", String.valueOf(user.getUser_id()));//设置属性
 60                 
 61                 Comment ccc1=d.createComment("卡号");
 62                 Element eee1=d.createElement("cardnum");//创建第二层第一个子节点
 63                 eee1.setTextContent(user.getUser_cardnum());
 64                 Comment ccc2=d.createComment("姓名");
 65                 Element eee2=d.createElement("name");//创建第二层第二个子节点
 66                 eee2.setTextContent(user.getUser_name());
 67                 Comment ccc3=d.createComment("身份证");
 68                 Element eee3=d.createElement("idcard");//创建第二层第三个子节点
 69                 eee3.setTextContent(user.getUser_idcard());
 70                 Comment ccc4=d.createComment("密码");
 71                 Element eee4=d.createElement("password");//创建第二层第四个子节点
 72                 eee4.setTextContent(user.getUser_password());
 73                 Comment ccc5=d.createComment("开户时间");
 74                 Element eee5=d.createElement("opentime");//创建第二层第五个子节点
 75                 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 76                 eee5.setTextContent(sdf.format(user.getUser_opentime()));
 77                 Comment ccc6=d.createComment("余额");
 78                 Element eee6=d.createElement("money");//创建第二层第六个子节点
 79                 eee6.setTextContent(String.valueOf(user.getUser_money()));
 80                 Comment ccc7=d.createComment("状态");
 81                 Element eee7=d.createElement("status");//创建第二层第七个子节点
 82                 String status="";
 83                 switch(user.getUser_status()){
 84                 case 0:
 85                     status="正常";
 86                     break;
 87                 case 1:
 88                     status="冻结";
 89                     break;
 90                 }
 91                 eee7.setTextContent(status);
 92                 
 93                 //第二层追加
 94                 ee.appendChild(ccc1);
 95                 ee.appendChild(eee1);
 96                 ee.appendChild(ccc2);
 97                 ee.appendChild(eee2);
 98                 ee.appendChild(ccc3);
 99                 ee.appendChild(eee3);
100                 ee.appendChild(ccc4);
101                 ee.appendChild(eee4);
102                 ee.appendChild(ccc5);
103                 ee.appendChild(eee5);
104                 ee.appendChild(ccc6);
105                 ee.appendChild(eee6);
106                 ee.appendChild(ccc7);
107                 ee.appendChild(eee7);
108                 
109                 //第一层追加
110                 e.appendChild(ee);
111             }
112             d.appendChild(e);//将根节点追加到文档对象中
113             //将document写入文件中,将构建好的document输出到xml文档
114             OutputFormat of=new OutputFormat(d);
115             of.setEncoding("GBK");
116             Writer w=new FileWriter("src/com/view/ATM.xml");
117             XMLSerializer xs= new XMLSerializer(w,of);
118             xs.asDOMSerializer();//作为dom方式序列化文档
119             xs.serialize(d.getDocumentElement());//输出根元素
120             w.close();//关闭字符输出流
121             return true;
122         }
123         return false;
124     }
125     
126     //2.数据恢复
127     public boolean recover() throws Exception{
128         System.out.println("正在处理,请稍后。。。");
129         try {
130             Thread.sleep(2000);
131         } catch (InterruptedException e) {
132             // TODO Auto-generated catch block
133             e.printStackTrace();
134         }
135         List<User_info> userlist=new ArrayList();
136         DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
137         DocumentBuilder db=dbf.newDocumentBuilder();//构建文档对象
138         Document d=db.parse("src/com/view/ATM.xml");//解析文档
139         Element e=d.getDocumentElement();//获取根节点
140         NodeList nl=e.getChildNodes();//获取根节点下所有子节点
141         for(int i=0;i<nl.getLength();i++){
142             if(nl.item(i).getNodeType()==1){
143                 User_info user=new User_info();
144                 Element ee=(Element)nl.item(i);//获得每一个子节点
145                 String ees=ee.getAttribute("id");//获取每一个子节点的属性
146                 user.setUser_id(Integer.valueOf(ees));//赋值
147                 NodeList nlnl=ee.getChildNodes();//继续获得每一个子节点集
148                 for(int j=0;j<nlnl.getLength();j++){
149                     if(nlnl.item(j).getNodeType()==1){
150                         Element eee=(Element)nlnl.item(j);//继续获得每一个子节点
151                         String eeen=eee.getNodeName();//获取每一个子节点的元素名
152                         String eeet=eee.getTextContent();//获取每一个子节点的text内容
153                         //给user对象赋值
154                         switch(eeen){
155                         case "cardnum":
156                             user.setUser_cardnum(eeet);
157                             break;
158                         case "name":
159                             user.setUser_name(eeet);
160                             break;
161                         case "idcard":
162                             user.setUser_idcard(eeet);
163                             break;
164                         case "password":
165                             user.setUser_password(eeet);
166                             break;
167                         case "opentime":
168                             SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
169                             Date date=sdf.parse(eeet);
170                             user.setUser_opentime(date);
171                             break;
172                         case "money":
173                             user.setUser_money(Double.valueOf(eeet));
174                             break;
175                         case "status":
176                             if("正常".equals(eeet)){
177                                 user.setUser_status(0);
178                             }else{
179                                 user.setUser_status(1);
180                             }
181                             break;
182                         }
183                     }
184                 }
185                 userlist.add(user);
186             }
187         }
188         //调用
189         if(userSer.resumeUserMessage(userlist)){
190             return true;
191         }
192         return false;
193     }
194     
195         
196 }

  对账单生成的e.txt文件

卡号:ICBC1513155154759
日期:2017-12-14------2017-12-14
操作时间    操作类型    操作金额
2017-12-14 17:03:52    存款    +60000
2017-12-14 17:04:00    取款    -999
2017-12-14 17:04:08    取款    -798
2017-12-14 17:04:16    取款    -134
2017-12-14 17:04:29    汇款    -1234
2017-12-14 17:04:35    存款    +200
2017-12-14 17:04:44    存款    +300
2017-12-14 17:04:51    取款    -880
2017-12-14 17:04:59    取款    -1000
2017-12-14 17:05:07    取款    -890
2017-12-14 17:05:15    取款    -1600
2017-12-14 17:05:22    取款    -890
2017-12-14 17:05:42    取款    -2500
---------------
汇总:
存款:+60500
取款:-9691
汇款:-1234

  用户数据备份生成的xml文件:

<?xml version="1.0" encoding="GBK"?>
<users>
    <user id="4">
        <!--卡号-->
        <cardnum>ICBC1513240108811</cardnum>
        <!--姓名-->
        <name>贾雨村</name>
        <!--身份证-->
        <idcard>777888200003039999</idcard>
        <!--密码-->
        <password>123456</password>
        <!--开户时间-->
        <opentime>2017-12-14 16:28:28</opentime>
        <!--余额-->
        <money>84000.0</money>
        <!--状态-->
        <status>正常</status>
    </user>
    <user id="1">
        <!--卡号-->
        <cardnum>ICBC1513134738163</cardnum>
        <!--姓名-->
        <name>萧十一郎</name>
        <!--身份证-->
        <idcard>459847199508248971</idcard>
        <!--密码-->
        <password>111111</password>
        <!--开户时间-->
        <opentime>2017-12-13 11:12:18</opentime>
        <!--余额-->
        <money>6566.0</money>
        <!--状态-->
        <status>正常</status>
    </user>
    <user id="2">
        <!--卡号-->
        <cardnum>ICBC1513154052221</cardnum>
        <!--姓名-->
        <name>卜世仁</name>
        <!--身份证-->
        <idcard>678498200511028764</idcard>
        <!--密码-->
        <password>111111</password>
        <!--开户时间-->
        <opentime>2017-12-13 16:34:12</opentime>
        <!--余额-->
        <money>993.0</money>
        <!--状态-->
        <status>正常</status>
    </user>
    <user id="3">
        <!--卡号-->
        <cardnum>ICBC1513155154759</cardnum>
        <!--姓名-->
        <name>e</name>
        <!--身份证-->
        <idcard>e</idcard>
        <!--密码-->
        <password>111111</password
        ><!--开户时间-->
        <opentime>2017-12-13 16:52:34</opentime>
        <!--余额-->
        <money>49575.0</money>
        <!--状态-->
        <status>正常</status>
    </user>
</users>
原文地址:https://www.cnblogs.com/wlxslsb/p/10723058.html