1、目 录 1 前言1 2 需求分析1 2.1 课程设计目的1 2.2 课程设计任务1 2.3 设计环境1 2。4 开发语言2 3 分析和设计2 3。1 系统E—R模型2 3。2 表空间及表的设计2 3.3 视图设计5 3。4 存储过程、函数、包的设计6 3。5 触发器设计7 3.6 角色、用户、权限设计8 3。7 备份方案设计9 4 课程设计总结9 4.1 程序运行结果9 4。2 设计结论11 参考文献12 致 谢12 附 录13 1 前言 设计一个个人记账管理系统,用JAVA来编写。综合运用JAVA的基础和算法设计的基本原则,用PLSQL De
2、veloper,orcale等工具实现。功能包括收入记录、支出记录、查询功能、报表,并将记录保存在数据库中,通过连接数据库可以查询所有记录,可以通过选择日期将符合条件的记录显示在查询框中,可以选择收入或支出查询收入记录或者支出记录。用户可以通过报表了解到指定时间段内收入总和、支出总和、余额。 2 需求分析 2.1课程设计目的 通过专业课程设计Ⅱ,即大型数据库系统课程设计,有助于培养学生综合运用数据库相关知识解决实际问题的能力。本设计要求对实际问题进行需求分析,提炼实际问题中的数据,建立关系模型,并在大型数据库中得以实现。同时要求对数据库的运营、管理及使用上进行必要的规划和实现。 2。2
3、 课程设计任务 针对某管理信息系统的需求,设计一个数据库系统。具体内容如下: (1) 根据需求,建立ER模型.通过ER图表示. (2) 在此基础上,设计物理表结构,编写创建数据库表的语句.较高要求为在设计创建数据表语句的同时考虑性能上的要求,采用相关的磁盘存储技术。 (3) 从实际查询应用出发,为一些主要的应用模块设计至少3个参数化视图。 (4) 针对常用的业务,创建包,同时实现一个函数放入包中。 (5) 从数据检验的角度出发,为相关的表建立至少1个触发器. (6) 从数据更新或修改的角度出发,设计至少1个存储过程。 (7) 从安全的角度出发,规划系统的角色、用户、权限,并通过
4、SQL实现。 (8) 预计每个表的大致容量和增长速度。指定备份的方案,写出相关的备份命令。 (9) 以上所有命令及脚本均需测试,在设计报告中说明其功能并记录其输出。 2.3 设计环境 (1)WINDOWS2000/2003/XP系统 (2)Oracle数据库管理系统 2。4 开发语言 PL/SQL语言 3 分析和设计 3。1 系统E-R模型 图3-1个人记账管理系统E—R图 3。2 表空间及表的设计 -— Create table create table BANK_INCOME( IN_ID NUMBER not null, IN_NAME
5、 VARCHAR2(50), IN_DATE VARCHAR2(50), IN_MONEY NUMBER(10,2), IN_COMMENT VARCHAR2(500) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create/Recreate primary, unique and foreign key c
6、onstraints alter table BANK_INCOME add constraint PK_IN_ID primary key (IN_ID) using index tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -- Create table create table BANK_OUT ( OUT_ID
7、 NUMBER not null, OUT_NAME VARCHAR2(50), OUT_DATE VARCHAR2(50), OUT_MONEY NUMBER(10,2), OUT_COMMENT VARCHAR2(500) ) tablespace USERS pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); -— Create/Recre
8、ate primary, unique and foreign key constraints alter table BANK_OUT add primary key (OUT_ID) using index tablespace USERS pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K minextents 1 maxextents unlimited ); 列名 类型 说明 in_id number 主键,收入id i
9、n_name Varchar2(50) 收入项 in_date Varchar2(50) 收入日期 in_money Number(10,2) 收入金额 in_comment Varchar2(500) 收入备注 图3—2收入表 列名 类型 说明 out_id number 主键,支出id out _name Varchar2(50) 支出项 out _date Varchar2(50) 支出日期 out _money Number(10,2) 支出金额 out _comment Varchar2(500) 支出备注 图3—3
10、支出表 3。3 视图设计 图3-4 收入视图 图3—5 支出视图 3。4 存储过程、函数、包的设计 图3—6存储过程 图3—7包的设计 3。5 触发器设计 (1)收入触发器 create or replace trigger tri_auto_income_id before insert on bank_income for each row declare -— local variables here begin select seq_income_id。nextval into:new。in_id from dual; end tri_a
11、uto_income_id; (2)支出触发器 create or replace trigger TRI_AUTO_OUT_ID before insert on bank_out for each row declare —- local variables here begin select seq_out_id。nextval into:new.out_id from dual; end TRI_AUTO_OUT_ID; 3。6 角色、用户、权限设计 —— Create the role create role ROLE1; —-给角色授权
12、 grant select,update,insert on bank_income to role1 grant select,update,insert on bank_out to role1 —- Create the user create user huanghua identified by "123456” default tablespace SYSTEM temporary tablespace TEMP profile DEFAULT; grant select,update,insert on bank_income to huanghua wit
13、h grant option 3。7 备份方案设计 (1)启动SQL*plus,以SYSDBA身份登录数据库 (2)查询当前数据库所有数据文件、控制文件、联机重做文件的位置 SQL〉select file_name from dba_data_files; SQL〉SELECT member FROM v$logfile; SQL>SELECT value FROM v$parameter WHERE name=’control_files’; (3)关闭数据库 SQL>SHUTDOWN IMMEDIATE (4)复制所有数据文件、联机重做文件以及控制文件到备份磁盘可以直接在
14、操作系统中使用复制、粘贴方式进行 (5)重新启动数据库 SQL〉STARTUP 4 课程设计总结 4。1运行结果如下图所示: 图4—1 个人记账管理界面 图4—2 收入记录界面 图4-3支出记录界面 图4-4 查询收入支出界面 图4—5 报表界面 4。2、设计总结 这次我们的课程设计题目是个人记账管理系统.通过此次课程设计,掌握到了数据库系统的开发方法。同时也加深了对刚刚学习的JAVA的印象。整个代码在写的过程中出现了很多问题.有的实在解决不了的问题,就去问教我们JAVA的柳小文老师,老师也非常乐意帮助我解决一些困难.有的时候不懂的问题就去
15、上网搜索答案,或者自己去看书。学习需要自主,对这一点我颇有感触。 此次课程设计结束之后,我还意犹未尽,因为从中感觉到了写代码的趣味。于是,我就开始想方设法找点小的应用程序去写.因为这样的学习方法是最快也是最有效的方式。比老师上课讲要好的多.而且大学生也应该培养自己的动手能力.而动手能力只能来自于自己从头到尾的去写一个不大的应用程序。了解整个创作的一个大体思路,在写的过程中还要不断地去请教我们的老师.因为他们对实际应用程序的把握比我们要强的多. 当然,学无止境,不能因为这么一点小的成就就止步不前.前路很漫长,但我相信只要自己肯用心去学习,Nothing is impossible! 参考文
16、献 [1]孙风栋,刘蕾等。Oracle 10g数据库基础教程[M].北京:电子工业出版社,2012。10。 [2]王珊,萨师煊。数据库系统概论[M]北京:高等教育出版社,2006。5。 [3]Java Programming Java程序设计[M]北京:清华大学出版社,2010。1. 致 谢 感谢我们的指导老师柳小文老师,谢谢她在我们的课程设计过程中提出了指导性的方案和架构,并指引我们阅读相关的资料和书籍,使我们在不熟悉的领域中仍能迅速掌握新的方法和技术. 同时也感谢校领导给我们这次难得的锻炼机会,让我们能更好的理解和实践Oracle数据库,让我们对数据库有了更深刻的认知,对已学
17、知识有了更进一步的巩固。 总之,通过这次课程设计,我获益良多. 附 录 主要代码: package com。sxt。bank。dao; import java。sql。Connection; import java.sql.DriverManager; import java。sql。Statement; /** * 数据库工具类 * @author Administrator * */ public class DBUtil { /** * 专用于取得数据库的连接 * @return */ public static Connection g
18、etConn(){ Connection conn=null; try { //加载驱动 Class.forName(”oracle。jdbc.driver.OracleDriver”); String url=”jdbc:oracle:thin:@172.19。95。36:1521:orcl"; //取得连接 conn=DriverManager。getConnection(url, "scott", ”tiger”); } catch (Exception e) { e。printStackTrace(); } return conn; } /** * 专用于
19、关闭连接 * @param conn * @param stat */ public static void closeConn(Connection conn,Statement stat){ try { stat。close(); conn.close(); } catch (Exception e2) { e2.printStackTrace(); } } } 收入数据处理代码: package com。sxt。bank。dao; import java.sql。Connection; import java.sql.DriverManager;
20、import java。sql。PreparedStatement; import com。sxt。bank。entity.InCome; /** * 数据处理 * @author Administrator * */ public class IncomeDao { /** * 用于保存收入项到数据库 * @param income */ public void saveIncome(InCome income){ Connection conn=null; PreparedStatement stat=null; try { conn=DBUt
21、il。getConn(); //得到预编译执行器 stat=conn.prepareStatement(”insert into bank_income(in_name,in_date,in_money,in_comment) values(?,?,?,?)”); //设置参数 //stat。setInt(1,2); stat。setString(1, income。getInName()); stat。setString(2, income。getInDate()); stat。setFloat(3, income.getMoney()); stat.setString(4,
22、 income。getComment()); //执行 stat。execute(); } catch (Exception e) { e.printStackTrace(); }finally{ DBUtil。closeConn(conn, stat); } } } 支出数据处理代码: package com。sxt。bank.dao; import java。sql.Connection; import java。sql。DriverManager; import java。sql.PreparedStatement; import com。sxt。bank.
23、entity.Out; /** * 支出的数据处理 * @author Administrator * */ public class OutDao { /** * 用于保存支出项到数据库 * @param income */ public void saveOutcome(Out out){ Connection conn=null; PreparedStatement stat=null; try { //加载驱动 Class。forName(”oracle。jdbc.driver.OracleDriver”); String url="jd
24、bc:oracle:thin:@172。19。95。36:1521:orcl”; //取得连接 conn=DriverManager。getConnection(url, ”scott", ”tiger”); //得到预编译执行器 stat=conn。prepareStatement(”insert into bank_out(out_name,out_date,out_money,out_comment) values(?,?,?,?)"); //设置参数 stat。setString(1,out。getOutName()); stat。setString(2, out.get
25、OutDate()); stat.setFloat(3, out。getMoney()); stat。setString(4, out.getComment()); //执行 stat.execute(); } catch (Exception e) { e.printStackTrace(); }finally{ try { stat。close(); conn.close(); } catch (Exception e2) { e2。printStackTrace(); } } } } 收入支出查询代码: package com.sxt.bank。dao
26、 import java。sql。Connection; import java.sql.PreparedStatement; import java.sql。ResultSet; import java。util.ArrayList; import com.sxt。bank.entity.InCome; import com。sxt。bank。entity。Out; /** * 收入支出查询 * @author Administrator * */ public class QueryDao { /** * 取得数据的记录,并封装成集合 * @re
27、turn */ public ArrayList getInList(){ Connection conn=null; PreparedStatement stat=null; ResultSet rs=null; //新建一个集合用来装out ArrayList〈InCome> inList=new ArrayList〈InCome〉(); try { //得到连接 conn=DBUtil.getConn(); //SQL语句执行器 stat=conn。prepareStatement("select * from bank_income"); //执行SQL查询
28、得到结果集 rs=stat.executeQuery(); while(rs。next()){ //从记录中取值 参数类型 字段名 String inName=rs.getString(”in_name"); String inDate=rs。getString("in_date"); float money=rs。getFloat(”in_money”); String comment=rs.getString("in_comment"); //封装成对象 InCome in=new InCome(inName, inDate,
29、money, comment); //将对象装载到集合中 inList.add(in); } } catch (Exception e) { e。printStackTrace(); }finally{ DBUtil.closeConn(conn, stat); } //返回 return inList; } /** * 取得数据的记录,并封装成集合 * @return */ public ArrayList getOutList(){ Connection conn=null; PreparedStatement stat=null; Result
30、Set rs=null;
//新建一个集合用来装out
ArrayList 31、getString("out_name");
String outDate=rs。getString(”out_date”);
float money=rs。getFloat("out_money”);
String comment=rs。getString(”out_comment”);
//封装成对象
Out out=new Out(outName, outDate, money, comment);
//将对象装载到集合中
outList。add(out);
}
} catch (Exception e) {
e.printStackTrace();
}final 32、ly{
DBUtil。closeConn(conn, stat);
}
//返回
return outList;
}
}
报表代码:
package com。sxt.bank。view;
import java.awt.EventQueue;
import java.awt。event。ActionEvent;
import java。awt。event.ActionListener;
import java.awt。event.MouseAdapter;
import java。awt。event。MouseEvent;
import java.awt。event 33、WindowAdapter;
import java。awt。event.WindowEvent;
import java。util。ArrayList;
import javax.swing。ImageIcon;
import javax.swing.JButton;
import javax。swing。JFrame;
import javax.swing。JLabel;
import javax。swing.JPanel;
import javax.swing。JScrollPane;
import javax.swing。JTable;
import javax。 34、swing.JTextField;
import javax.swing。border.EmptyBorder;
import javax。swing。table。DefaultTableModel;
import com.sxt。bank.dao。QueryDao;
import com.sxt。bank。entity。InCome;
import com。sxt.bank.entity。Out;
import com。sxt。bank。util。DatePanel;
public class reportFrame extends JFrame implements Acti 35、onListener {
private JPanel contentPane;
private JTextField textf;
private JTextField textl;
private JTable table;
/**
* Launch the application。
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
reportFrame frame = new reportF 36、rame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public reportFrame() {
setTitle("\u62A5\u8868”);
setResizable(false);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent arg0) 37、 {
//只销毁本窗口,不退出虑拟机
reportFrame。this。dispose();
}
});
setDefaultCloseOperation(JFrame。DO_NOTHING_ON_CLOSE);
this。setIconImage(new ImageIcon(”image/person.JPG").getImage());
setBounds(100, 100, 441, 342);
contentPane = new JPanel();
contentPane。setBorder(new EmptyBorder(5, 5, 5, 5));
setCont 38、entPane(contentPane);
//设置背景===============
ImageIcon img = new ImageIcon(”image/chao.jpg”);
final JLabel lblImg = new JLabel(img);
this。getLayeredPane()。add(lblImg,new Integer(Integer.MIN_VALUE));
lblImg。setBounds(0, lblImg.getHeight(), 457, 542);
((JPanel)getContentPane())。setOpaque(false); 39、
//======================
contentPane。setLayout(null);
JLabel repo = new JLabel(”\u62A5\u8868\u8BB0\u5F55”);
repo。setBounds(10, 25, 61, 15);
contentPane。add(repo);
JLabel lblNewLabel = new JLabel("\u65E5\u671F\uFF1A”);
lblNewLabel。setBounds(81, 25, 39, 15);
contentPane.add(lblNewLabel);
te 40、xtf = new JTextField();
textf。setBounds(118, 22, 73, 21);
contentPane。add(textf);
textf。setColumns(10);
JLabel label = new JLabel(”\u5230”);
label.setBounds(224, 25, 21, 15);
contentPane。add(label);
textl = new JTextField();
textl。setColumns(10);
textl。setBounds(241, 22, 72, 21);
contentPa 41、ne.add(textl);
JButton btnDate1 = new JButton(”。。。");
btnDate1.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
//弹出日期框 父窗口 模式 输入框 x y
new DatePanel(reportFrame。this,true,textf,event.getXOnScreen(),event。getYOnScreen()); 42、
}
});
btnDate1。setBounds(195, 22, 21, 23);
contentPane。add(btnDate1);
JButton btnDate2 = new JButton(”。。。”);
btnDate2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent event) {
//弹出日期框 父窗口 模式 输入框 x y
new DatePanel(reportFrame 43、this,true,textl,event.getXOnScreen(),event.getYOnScreen());
}
});
btnDate2.setBounds(316, 21, 21, 23);
contentPane。add(btnDate2);
JScrollPane scrollPane = new JScrollPane();
scrollPane。setBounds(10, 56, 413, 214);
contentPane。add(scrollPane);
//建表头
String[] header={”收入/支出项”,”日期",”金额”,"备注"} 44、
//建数据模型
dtm=new DefaultTableModel(null,header);
table = new JTable(dtm);
scrollPane。setViewportView(table);
JButton inquiry = new JButton(”\u67E5\u8BE2");
inquiry。addActionListener(this);
inquiry.setActionCommand("query”);
inquiry.setBounds(347, 21, 76, 23);
contentPane.add(inquiry);
JLa 45、bel outlabel = new JLabel(”\u652F\u51FA\u5408\u8BA1\uFF1A");
outlabel。setBounds(10, 285, 72, 15);
contentPane。add(outlabel);
JLabel label_1 = new JLabel("\u6536\u5165\u5408\u8BA1\uFF1A”);
label_1。setBounds(163, 285, 74, 15);
contentPane。add(label_1);
JLabel label_2 = new JLabel(”\u4F59\u989D\u 46、FF1A”);
label_2。setBounds(313, 285, 44, 15);
contentPane。add(label_2);
textoutsum = new JTextField();
textoutsum。setBounds(87, 282, 66, 21);
contentPane。add(textoutsum);
textoutsum。setColumns(10);
textinsum = new JTextField();
textinsum。setColumns(10);
textinsum。setBounds(237, 282, 66, 21); 47、
contentPane。add(textinsum);
textyu = new JTextField();
textyu。setColumns(10);
textyu.setBounds(357, 282, 66, 21);
contentPane.add(textyu);
}
static double insum=0,outsum=0,remanent=0;
DefaultTableModel dtm=null;
private JTextField textoutsum;
private JTextField textinsum;
48、 private JTextField textyu;
public void actionPerformed(ActionEvent event) {
if(event。getActionCommand().equals("exit”)){
this。dispose();
}else if(event。getActionCommand().equals(”query”)){
//去数据库查询 得到数据
QueryDao queryDao=new QueryDao();
//取得集合
ArrayList 49、
ArrayList〈Out〉 outList=queryDao。getOutList();
//清空表格的历史数据
dtm。setRowCount(0);
insum=outsum=0;
//显示在表格中
for(InCome in:inList){
//将数据加载到表格模型中out
dtm.addRow(new Object[]{in.getInName(),in.getInDate(),in.getMoney(),in.getComment()});
insum+=in.getMoney();
textinsum。setText(String。valueOf(i 50、nsum));
}
//显示在表格中
for(Out out:outList){
//将数据加载到表格模型中
dtm。addRow(new Object[]{out。getOutName(),out.getOutDate(),out。getMoney(),out。getComment()});
outsum+=out。getMoney();
textoutsum。setText(String。valueOf(outsum));
}
remanent=insum-outsum;
textyu。setText(String。valueOf(remanent));






