资源描述
目 录
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 Developer,orcale等工具实现。功能包括收入记录、支出记录、查询功能、报表,并将记录保存在数据库中,通过连接数据库可以查询所有记录,可以通过选择日期将符合条件的记录显示在查询框中,可以选择收入或支出查询收入记录或者支出记录。用户可以通过报表了解到指定时间段内收入总和、支出总和、余额。
2 需求分析
2.1课程设计目的
通过专业课程设计Ⅱ,即大型数据库系统课程设计,有助于培养学生综合运用数据库相关知识解决实际问题的能力。本设计要求对实际问题进行需求分析,提炼实际问题中的数据,建立关系模型,并在大型数据库中得以实现。同时要求对数据库的运营、管理及使用上进行必要的规划和实现。
2。2 课程设计任务
针对某管理信息系统的需求,设计一个数据库系统。具体内容如下:
(1) 根据需求,建立ER模型.通过ER图表示.
(2) 在此基础上,设计物理表结构,编写创建数据库表的语句.较高要求为在设计创建数据表语句的同时考虑性能上的要求,采用相关的磁盘存储技术。
(3) 从实际查询应用出发,为一些主要的应用模块设计至少3个参数化视图。
(4) 针对常用的业务,创建包,同时实现一个函数放入包中。
(5) 从数据检验的角度出发,为相关的表建立至少1个触发器.
(6) 从数据更新或修改的角度出发,设计至少1个存储过程。
(7) 从安全的角度出发,规划系统的角色、用户、权限,并通过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 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 constraints
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 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/Recreate 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
in_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 支出表
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_auto_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;
—-给角色授权
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 with 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)复制所有数据文件、联机重做文件以及控制文件到备份磁盘可以直接在操作系统中使用复制、粘贴方式进行
(5)重新启动数据库
SQL〉STARTUP
4 课程设计总结
4。1运行结果如下图所示:
图4—1 个人记账管理界面
图4—2 收入记录界面
图4-3支出记录界面
图4-4 查询收入支出界面
图4—5 报表界面
4。2、设计总结
这次我们的课程设计题目是个人记账管理系统.通过此次课程设计,掌握到了数据库系统的开发方法。同时也加深了对刚刚学习的JAVA的印象。整个代码在写的过程中出现了很多问题.有的实在解决不了的问题,就去问教我们JAVA的柳小文老师,老师也非常乐意帮助我解决一些困难.有的时候不懂的问题就去上网搜索答案,或者自己去看书。学习需要自主,对这一点我颇有感触。
此次课程设计结束之后,我还意犹未尽,因为从中感觉到了写代码的趣味。于是,我就开始想方设法找点小的应用程序去写.因为这样的学习方法是最快也是最有效的方式。比老师上课讲要好的多.而且大学生也应该培养自己的动手能力.而动手能力只能来自于自己从头到尾的去写一个不大的应用程序。了解整个创作的一个大体思路,在写的过程中还要不断地去请教我们的老师.因为他们对实际应用程序的把握比我们要强的多.
当然,学无止境,不能因为这么一点小的成就就止步不前.前路很漫长,但我相信只要自己肯用心去学习,Nothing is impossible!
参考文献
[1]孙风栋,刘蕾等。Oracle 10g数据库基础教程[M].北京:电子工业出版社,2012。10。
[2]王珊,萨师煊。数据库系统概论[M]北京:高等教育出版社,2006。5。
[3]Java Programming Java程序设计[M]北京:清华大学出版社,2010。1.
致 谢
感谢我们的指导老师柳小文老师,谢谢她在我们的课程设计过程中提出了指导性的方案和架构,并指引我们阅读相关的资料和书籍,使我们在不熟悉的领域中仍能迅速掌握新的方法和技术.
同时也感谢校领导给我们这次难得的锻炼机会,让我们能更好的理解和实践Oracle数据库,让我们对数据库有了更深刻的认知,对已学知识有了更进一步的巩固。
总之,通过这次课程设计,我获益良多.
附 录
主要代码:
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 getConn(){
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;
}
/**
* 专用于关闭连接
* @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;
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=DBUtil。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, 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.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="jdbc: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.getOutDate());
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;
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 {
/**
* 取得数据的记录,并封装成集合
* @return
*/
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查询,得到结果集
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, 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;
ResultSet rs=null;
//新建一个集合用来装out
ArrayList<Out〉 outList=new ArrayList〈Out〉();
try {
//得到连接
conn=DBUtil.getConn();
//SQL语句执行器
stat=conn.prepareStatement(”select * from bank_out”);
//执行SQL查询,得到结果集
rs=stat.executeQuery();
while(rs。next()){
//从记录中取值 参数类型 字段名
String outName=rs。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();
}finally{
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。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。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 ActionListener {
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 reportFrame();
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) {
//只销毁本窗口,不退出虑拟机
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));
setContentPane(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);
//======================
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);
textf = 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);
contentPane.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());
}
});
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。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={”收入/支出项”,”日期",”金额”,"备注"};
//建数据模型
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);
JLabel 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\uFF1A”);
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);
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;
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<InCome> inList=queryDao。getInList();
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(insum));
}
//显示在表格中
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));
展开阅读全文