面向对象程序设计课程设计报告
代码行数 638 项目名称 个人记账簿管理系统 1.实训目的 面向对象程序设计课程设计是计算机科学与技术专业培养计划中的重要实践教学环节,旨在通过一个管理信息系统的开发,加深学生对Java语言的理解和应用,尤其是对面向对象编程思想、Java编码规范、图形用户接口、JDBC访问数据库的理解,巩固软件工程课程的相关知识,了解软件开发的基本流程,进一步提高学生的学习能力、理解能力、表达能力及沟通能力。 2.实训内容 使用MyEclipse为开发工具,使用Press on为建模工具,使用MySQL为数据库服务器,基于JDBC技术,分析、设计并实现一个管理信息系统。 3.需求分析 3.1 需求描述 3.1.1 项目来源及背景 个人记账簿是每个人在生活中都会用到的APP,具有广泛的适用性和应用价值,也具备较易进行分析和设计的特点。 3.1.2 项目需求 主要功能 登录:输入账号和密码,完成登录操作,进入主界面,显示个人记账簿管理系统中所有的账单基本信息(主键、名称、消费时间、花费总额等)以及可进行的相关操作的选项。 退出:登录后可进行退出操作,结束整个程序。 注册:输入账户、密码和确认密码完成新用户的注册。 按创建时间显示所有的账单:登录成功后在主界面中以表格形式按创建时间升序显示所有账单的基本信息(主键、名称、消费时间、花费总额等)。 添加账单:输入一份账单的各项基本信息(名称、消费时间等),再输入这份账单中的各项花销,完成账单的添加操作,添加成功后以表格形式按创建时间升序显示所有账单的基本信息。 删除账单:根据显示的账单基本信息,输入某个账单的主键,完成账单的删除操作,删除成功后以表格形式按创建时间升序显示剩余账单的基本信息。 修改账单:根据显示的账单基本信息,输入某个账单的主键,显示账单的基本信息和账单中的各项花费,根据提示信息,选择要修改账单基本信息或某项花费或要删除的某项花费,输入相应字段值或要删除的某项花费的主键,完成账单信息的修改,修改成功后显示该账单修改后的详细信息。 查询账单:利用主键查询,获得一份账单的详细信息。 扩展功能 可对账单信息进行导出操作,存储至一个文本文档中。 3.2 用例描述 - 1 -
面向对象程序设计课程设计报告
图1 系统用例图 4.功能设计 4.1 系统层次方框图 为保证系统具有较好的可维护性和可扩展性,对系统进行分层设计,共分四层: 视图层:接收用户输入信息,显示界面信息和用户信息 控制层:访问流程控制 业务层:完成具体功能的实现 数据库访问层:完成对数据库访问操作的封装 具体结构如下图所示: DataBase 数据库访问层:DB类 类 业务层:XxxService 控制层:Controller类、 视图层:XxxView类
- 2 -
面向对象程序设计课程设计报告
4.2 算法设计(活动图或时序图)
1.登录功能
图2 登录功能时序图
图3 登录功能活动图
2.注册功能
- 3 -
面向对象程序设计课程设计报告
图4 注册功能时序图
图5 注册功能活动图
- 4 -
面向对象程序设计课程设计报告
3.显示所有用户信息功能
图6 显示所有用户信息时序图
图7 显示所有用户信息活动图
- 5 -
面向对象程序设计课程设计报告
4.添加用户信息功能
图8 用户信息添加时序图
图9 用户信息添加活动图
- 6 -
面向对象程序设计课程设计报告
5.查询用户信息功能
图10 查询用户信息时序图
图11 查询用户信息活动图
- 7 -
面向对象程序设计课程设计报告
5.数据设计
5.1 类图设计
根据分析,系统由13个类构成,分别为: 数据库访问层:DB类
数据封装类:Login类、User类
业务层:LoginService类、UserService类 控制层:Controller类
视图层:AddView类、DeleteView类、ModifyView类、QueryView类、MainView类、
Operation类 其它:Test类
系统中各类之间关系如下图所示:
图12 系统类图
1.数据库访问层
DB类用于封装JDBC的操作,完成对数据库的直接访问,采用单态模式创建对象,具体内容如下所示: - 8 -
面向对象程序设计课程设计报告
图13 数据库访问层类图
2.数据封装类
Login类和User类分别用于登录、注册操作时的数据封装和用户信息管理时的数据封装,具体内容如下图所示:
图14 数据封装类类图
- 9 -
面向对象程序设计课程设计报告
3.业务层
LoginService类进行登录、注册等对Login类的访问操作,UserService类进行用户信息管理的操作,两者均采用单态模式创建对象,具体内容如下图所示:
图15 业务层类图
4.控制层
Controller类用于进行系统的流程控制,具体内容如下所示:
图16 控制层类图
5.视图层
MainView类用于完成登录、注册等提示信息的显示和系统主界面的显示,具体内容如下所示:
图17 MainView类图
Operation接口是增、删、改、查等操作的抽象,AddView类、DeleteView类、ModifyView类和QueryView
- 10 -
面向对象程序设计课程设计报告
类均使用Operation接口,分别完成增、删、改、查等操作,利用简单工厂模式与Controller类建立关系,具体内容如下所示: 图18 视图层类图 6.其它 Test类是程序的主类,用于启动系统,具体内容如下: 图19 Test类图 5.2 数据表设计 t_login表 序号 1 2 3 字段名 id uername password 类型 int varchar varchar t_user表 长度 4 20 20 备注 主键、自增 唯一性、不为空 不为空 序号 1 2 3 4 字段名 id name time total 类型 int varchar date double 长度 11 50 默认 默认 备注 主键、自增 不为空 不为空 不为空 6.运行结果
- 11 -
面向对象程序设计课程设计报告
6.1 注册
程序运行后,首先显示系统的登录界面,在其中可输入账号和密码进行登录操作,或输入“1”进行账户注册。注册成功后需要重新输入账号和密码进行登录。
图20 注册页面
如果输入的密码和确认密码不一致,则需要重新输入。
图21 密码和确认密码不一致
6.2 登录
用户可在系统首界面直接输入账号和密码进行登录,或在注册成功后再进行登录。登录成功后显示所有用户信息和系统主控制界面。
- 12 -
面向对象程序设计课程设计报告
图22 登录成功后的显示
6.3 添加
输入“1”,选择添加用户信息操作。输入“0”表示返回上一级菜单。依次输入用户的姓名、性别和生日,完成添加。添加成功后,显示成功的提示信息,并显示所有用户信息和系统主控制界面。如果添加失败,则显示失败的提示信息,并提示重新输入。
图23 添加后显示
6.4 删除
输入“2”,选择删除用户信息操作。如果输入“0”表示返回上一级菜单。输入要删除的用户的id(主键)值,完成删除。删除成功后,显示成功的提示信息,并显示所有用户信息和系统主控制界面。如果删除失败,则显示删除失败的提示信息,并提示重新输入。
- 13 -
面向对象程序设计课程设计报告
图24 删除后显示
6.5 修改
输入“3”,选择修改用户信息操作。如果输入“0”表示返回上一级菜单。输入要修改的用户的id(主键)值,显示该用户的信息。再依次输入要修改的用户名、时间和金额,执行修改操作。修改成功后,显示成功的提示信息,并显示所有用户信息和系统主控制界面。如果修改失败,则显示删除失败的提示信息,并提示重新输入。
图25 修改后显示
6.6 查询
输入“4”,选择查询用户信息操作。如果输入“0”表示返回上一级菜单。输入要查询的用户名,显示以改名称作为关键字的所有用户的信息,之后显示所有用户信息和系统主控制界面。
- 14 -
面向对象程序设计课程设计报告
如果没有查询到相应信息,则显示没有数据的提示,并可进行重新输入。
图26 查询显示结果
6.7 退出
输入“5”,表示退出系统,结束整个程序。
图27 退出显示
7.关键代码
7.1 数据库访问类(DB.java)
package x;
import java.sql.Connection;
- 15 -
面向对象程序设计课程设计报告
import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
private void buildConnection() { try {
con =
DriverManager.getConnection(\"jdbc:mysql://localhost:3306/user\", \"root\", \"123\");
public ResultSet executeQueryByParam(String sql,Object... o){ this.buildConnection(); try {
pre = con.prepareStatement(sql); } catch (SQLException e) { e.printStackTrace(); } }
public static DB getInstance(){ if(db == null){ db = new DB(); }
return db; }
private DB(){} static { try {
Class.forName(\"com.mysql.jdbc.Driver\"); } catch (ClassNotFoundException e) { e.printStackTrace(); } }
public class DB {
private Connection con;
private PreparedStatement pre; private ResultSet rs; private static DB db;
- 16 -
面向对象程序设计课程设计报告
public int executeUpdate(String sql,Object... o){ this.buildConnection(); try {
pre = con.prepareStatement(sql); for (int i = 0; i < o.length; i++) { pre.setObject(i+1,o[i]); }
int count = pre.executeUpdate(); return count;
} catch (SQLException e) { e.printStackTrace(); return 0; } }
public void close(){ try {
if (rs != null){ rs.close(); }
pre.close(); con.close();
public ResultSet executeQueryNoParam(String sql){ this.buildConnection();; try {
pre = con.prepareStatement(sql); rs = pre.executeQuery(); } catch (SQLException e) { e.printStackTrace(); }
return rs; }
for (int i = 0; i < o.length; i++) { pre.setObject(i+1,o[i]); }
rs = pre.executeQuery(); } catch (SQLException e) { e.printStackTrace(); }
return rs; }
- 17 -
面向对象程序设计课程设计报告
} catch (SQLException e) { e.printStackTrace(); } }
7.2 数据分装类 1.Login.java
package FengZhuang;
public class Login {
private String username;
private String password; public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; } }
2.User.java
package FengZhuang;
import java.util.Date;
public class User {
public int getId() { return id;
- 18 -
private int id; private String name; private Date time; private double total;
面向对象程序设计课程设计报告
}
public void setTotal(double total) { this.total = total; }
public void setTime(Date time) { this.time = time; }
public double getTotal() { return total; }
public Date getTime() { return time; }
public void setName(String name) { this.name = name; }
public String getName() { return name; }
public void setId(int id) { this.id = id; } }
7.3 业务层
1、LoginService.java
package Service;
import FengZhuang.Login; import x.DB;
import java.sql.ResultSet; import java.sql.SQLException;
public class LoginService {
private DB db;
private static LoginService service;
- 19 -
面向对象程序设计课程设计报告
private LoginService() { db = DB.getInstance(); }
public static LoginService getInstatnce() { if (service == null) {
service = new LoginService(); }
return service; }
public boolean login(Login lo) {
String sql = \"select * from t_login where username = ? and password = ?\"; ResultSet rs = db.executeQueryByParam(sql,
lo.getUsername(),lo.getPassword());
try {
if (rs.next()) { return true; }
} catch (SQLException e) { e.printStackTrace(); } finally { db.close(); }
return false; }
public boolean register(Login lo) {
String sql = \"insert into t_login(username,password) values(?,?)\"; int count = db.executeUpdate(sql, lo.getUsername(),lo.getPassword()); db.close(); if (count > 0) { return true; } else {
return false; } } }
- 20 -
面向对象程序设计课程设计报告
2、UserService.java
package Service;
import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List;
import FengZhuang.User; import x.DB;
public class UserService { private DB db;
private static UserService service; private UserService(){ db = DB.getInstance(); }
public static UserService getInstance(){ if(service == null){
service = new UserService(); }
return service; }
public List String sql = \"select * from t_user\"; ResultSet rs = db.executeQueryNoParam(sql); List users = this.getList(rs); } catch (SQLException e) { e.printStackTrace(); }finally { db.close(); } return users; } public List - 21 - 面向对象程序设计课程设计报告 String sql = \"select * from t_user where name like ?\"; ResultSet rs = db.executeQueryByParam(sql,\"%\"+name+\"%\"); List users = this.getList(rs); } catch (SQLException e) { e.printStackTrace(); }finally { db.close(); } return users; } private List while(rs.next()){ user = new User(); user.setId(rs.getInt(1)); user.setName(rs.getString(2)); user.setTime(rs.getDate(3)); user.setTotal(rs.getDouble(4)); users.add(user); } return users; } public boolean insertOneUser(String name,Date time,double total){ String sql = \"insert into t_user(name,time,total) values(?,?,?)\"; int count = db.executeUpdate(sql,name,time,total); db.close(); if(count>0){ return true; }else{ return false; } } public boolean deleteUserById(int id){ String sql = \"delete from t_user where id = ?\"; int count = db.executeUpdate(sql,id); db.close(); - 22 - 面向对象程序设计课程设计报告 if(count > 0){ return true; }else{ return false; } } public boolean updateUser(int id,String name,Date time,double total){ String sql = \"update t_user set name = ?,sex=?,birthday=? where id = ?\"; int count = db.executeUpdate(sql,name,time,total,id); db.close(); if(count > 0){ return true; }else { return false; } } public User getUserById(int id){ String sql = \"select * from t_user where id = ?\"; ResultSet rs = db.executeQueryByParam(sql,id); try { if(rs.next()){ User user = new User(); user.setId(id); user.setName(rs.getString(2)); user.setTime(rs.getDate(3)); user.setTotal(rs.getDouble(4)); return user; } } catch (SQLException e) { e.printStackTrace(); }finally { db.close(); } return null; } } 7.4视图层 1. operation.java - 23 - 面向对象程序设计课程设计报告 package view; import Service.UserService; import java.util.InputMismatchException; public interface operation{ void operation(UserService service) throws InputMismatchException; } 2. AddView.java package view; import Service.UserService; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.InputMismatchException; import java.util.Scanner; public class AddView implements operation { @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input name、time、total to ADD,if return input 0:\"); String name = scan.next(); double total=scan.nextDouble(); String time0 = scan.next(); SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd\"); Date time = new Date(); try { time = format.parse(time0); } catch (ParseException e) { e.printStackTrace(); } - 24 - 面向对象程序设计课程设计报告 boolean flag = service.insertOneUser(name, new java.sql.Date(time.getTime()),total); if(flag){ System.out.println(\"add success~~~~~~\"); //scan.close(); return; }else{ System.out.println(\"add failure,try again~~~~~~\"); } } } } 3. DeleteView.java package view; import Service.UserService; import java.util.InputMismatchException; import java.util.Scanner; public class DeleteView implements operation { @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input user'id to DELETE,if return input 0:\"); int id = scan.nextInt(); if(id == 0){ break; } boolean flag = service.deleteUserById(id); if(flag){ System.out.println(\"delete success~~~~~~\"); //scan.close(); return; }else{ System.out.println(\"delete failure~~~~~~\"); } } } } - 25 - 面向对象程序设计课程设计报告 4.ModifyView.java package view; import controller.Controller; import FengZhuang.User; import Service.UserService; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.InputMismatchException; import java.util.Scanner; public class ModifyView implements operation{ @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input user'id to MODIFY,if return input 0:\"); int id = scan.nextInt(); if (id == 0) { return; } else { User user = service.getUserById(id); if (user != null) { MainView.showTable(); MainView.showUser(user); System.out.println(\"please input new name:\"); String newName = scan.next(); System.out.println(\"please input new time:\"); String newTime = scan.next(); SimpleDateFormat format = new SimpleDateFormat(\"yyyy-MM-dd\"); Date Time; java.sql.Date sqlTime = null; try { Time = format.parse(newTime); sqlTime = new java.sql.Date(Time.getTime()); } catch (ParseException e) { e.printStackTrace(); } System.out.println(\"please input new total:\"); double newTotal=scan.nextDouble(); - 26 - 面向对象程序设计课程设计报告 boolean flag = service.updateUser(id,newName,sqlTime,newTotal); if(flag){ System.out.println(\"modify success~~~~~~\"); //scan.close(); return; }else{ System.out.println(\"modify failure~~~~~~\"); } }else{ System.out.println(\"id is error,try again!\"); } } } } } 5. QueryView.java package view; import controller.Controller; import FengZhuang.User; import Service.UserService; import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; public class QueryView implements operation { @Override public void operation(UserService service) throws InputMismatchException { Scanner scan = new Scanner(System.in); while(true){ System.out.println(\"please input name to query,if return input 0:\"); String name = scan.next(); if(\"0\".equals(name)){ break; } List - 27 - 面向对象程序设计课程设计报告 } return; }else{ System.out.println(\"no result......\"); } } } } 6. MainView.java package view; import controller.Controller; import FengZhuang.Login; import FengZhuang.User; import Service.LoginService; import Service.UserService; import java.util.InputMismatchException; import java.util.List; import java.util.Scanner; public class MainView { public static void start(){ Scanner scan = new Scanner(System.in); while (true) { LoginService service; System.out.println(\"please input your account and password to login,enter 1 for register one new user.\"); String username = scan.next(); String password; while (\"1\".equals(username)) { System.out.println(\"please input account:\"); String newUsername = scan.next(); String newPwd; while (true) { System.out.println(\"please input password:\"); newPwd = scan.next(); System.out.println(\"please input confirmation password:\"); String confirmPwd = scan.next(); if (newPwd.equals(confirmPwd)) { break; - 28 - 面向对象程序设计课程设计报告 } else { System.out.println(\"password is not equals confirmation password,input again!\"); } } service = LoginService.getInstatnce(); Login lo = new Login(); lo.setUsername(newUsername); lo.setPassword(newPwd); boolean f = service.register(lo); if(f){ System.out.println(\"register success!\"); System.out.println(\"please input your account:\"); username = scan.next(); }else{ System.out.println(\"register failure!try again~~~\"); } } System.out.println(\"please input your password:\"); password = scan.next(); service = LoginService.getInstatnce(); Login lo = new Login(); lo.setUsername(username); lo.setPassword(password); boolean flag = service.login(lo); if (flag) { Controller mv = new Controller(); try { mv.controller(); break; } catch (InputMismatchException e) { System.out.println(\"input exception,try again!\"); } } else { System.out.println(\"login failure!please input again~~~~~~\"); } } scan.close(); } public static void showTable(){ - 29 - 面向对象程序设计课程设计报告 System.out.println(\"----------------------------------------------------\"); System.out.println(\" id | name | time | total\"); System.out.println(\"----------------------------------------------------\"); } public static void showUser(User u){ System.out.print(\" \"+u.getId() + \" \"); System.out.print(u.getName() + \" \"); System.out.print(u.getTime()+ \" \"); System.out.println(u.getTotal()); } public static void showMain() { System.out.println(\"welcome to you!\"); showTable(); UserService userService = UserService.getInstance(); List } 7.5控制器类(Controller.java) package controller; import Service.UserService; import view.*; import java.util.InputMismatchException; import java.util.Scanner; public class Controller { public void controller() throws InputMismatchException{ Scanner scan = new Scanner(System.in); while (true) { MainView.showMain(); System.out.println(\"please select your operation:\"); - 30 - 面向对象程序设计课程设计报告 System.out.println(\"1.insert 2.delete 3.modify 4.query 5.exit\"); int i = scan.nextInt(); UserService service = UserService.getInstance(); operation o = null; boolean flag = true; switch (i) { case 1: o = new AddView(); break; case 2: o = new DeleteView(); break; case 3: o = new ModifyView(); break; case 4: o = new QueryView(); break; case 5: System.out.println(\"Bye~~~~~~~~~\"); return; default: //scan.close(); System.out.println(\"input error,please input 1~5!\"); flag = false; } if(flag){ o.operation(service); } } } } 7.6 主类 package test; import view.MainView; public class Test { public static void main(String[] args) { MainView.start(); - 31 - 面向对象程序设计课程设计报告 } } 8.实训总结 通过这次实训,实践体验到了MySQL数据库和JDBC的使用,综合这一学期的知识,结合到此次的实训课程当中,让我更深一步的学习到了数据库的建立和使用;加深了我对Java语言的理解和应用,尤其是对面向对象编程思想、Java编码规范、图形用户接口、JDBC访问数据库的理解,巩固了我在软件工程课程的相关知识并了解软件开发的基本流程。 本次实训也是对我这一学期以来的个人学习情况的总结,其中,知道了我本身在知识上存在的不足与欠缺,在做此次管理系统时,也遇到了很多代码上以及数据连接时的问题,后来经过一系列的改动代码等操作,最终使结果运行出来,实现数据库的增删改查等功能,这过程也是对自己知识的查缺补漏,通过对问题的解决,能使我快速的掌握这些欠缺的方面,是对自我的一种强化和对所学知识的深度理解。本次实训,使我受益颇深,从中学也学习到了很多新的知识,让我更好的具备了编程思维,同时也是对自我的一种检测,重要的是学习到了软件开发的基本步骤和如何通过JDBC访问数据库的操作流程。 成 绩 Score 教师签字 日期 - 32 - 因篇幅问题不能全部显示,请点此查看更多更全内容