Java程序设计实训报告
一、 系统功能说明
“学生成绩查询系统”模仿简单教务系统,通过用户名和密码登陆,可存储用户信息、学生个人信息、课程和成绩等内容,并可进行增删查改四个基本操作。实现“教师录入成绩,学生查询成绩”的目的。
系统的不足之处:系统功能开发不全面,仅能实现记录一门课成绩,无更多增强功能。安全级别不够高,易遭到攻击破坏和篡改。界面不友好、不美观,个别位置有小漏洞:
在选择功能菜单的按钮时,系统只设计了支持阿拉伯数字。当用户输入英文字母或者其他文字时,整个程序则无法运行。
增加学生就是按学生学号增加,系统没有严格规定必须输入相同位数的学生学号。
成绩查询,修改密码和删除学生都是按学生学号实现,在删除学生这个功能里,数据库中没有存的学生信息也可以删除。
二、 数据库的简单介绍
此系统数据库为Access数据库,包括四个表,分别为Student表,SC表,Course表和UserInfo表,分别存储学生信息、成绩、课程和用户信息的内容。 SC表里记录了Sno、Cno、Score信息
Course表里记录Cno、Course、Ccredit、Ctype信息
Student表里记录了Sno、Sname、Sbirth、Sdept信息
Userinfo表里记录了username、password信息
程序通过DBUtil类、SchoolCRUD类实现与数据库相连
三、 程序中的类以及对类的理解
程序中包含10个类:
1、Application类是输出欢迎信息,读取用户的输入信息。
2、ConsoleInputUtil类是读取所输入的用户名和密码数据。
3、ConsoleOutputUtil类是输出欢迎信息,退出信息。
4、DBUtil的功能为用于连接数据库的类。
5、FunctionImplementation类的功能为实现增删查改。
6、FunctionMenu类是显示菜单信息。
7、SchoolCRUD类联系数据库实现增删查改。
8、StudentBean类定义了set和get方法,封装学生属性。
9、UserBean类定义了set和get方法,封装用户属性。
10、UserLoginUtilis类接收user。
其中,我的理解
Application为主类
ConsoleInputUtil、ConsoleOutputUtil这两个类与界面输入输出有关 DBUtil、SchoolCRUD与数据库相连实现相应功能
FunctionMenu类显示菜单信息
FunctionImplementation类主要实现增删查改功能
StudentBean、UserBean实现封装
UserLoginUtilis验证信息,实现用户登录
四、 程序与注释
Application
package cn.edu.buu.it;
public class Application {
public static void main(String[] args) throws Exception {
// 输出欢迎信息
ConsoleOutputUtil.printWelcomeInfo();
// 读取用户的输入信息
UserBean user = null;
user = ConsoleInputUtil.getConsoleInputUserInfo();
System.out.println("用户名:" + user.getUsername());
System.out.println( "密码:" + user.getPassword());
// 用户登录判断
boolean isUsernameRight = UserLoginUtil.isUsernameRight(user);//查询用户名 boolean isPasswordRight = UserLoginUtil.isPasswordRight(user);//查询密码 //判断用户是否存在
if (!isUsernameRight) {
System.out.println("用户名不存在!");
return;
}//判断密码是否正确
else if (!isPasswordRight) {
System.out.println("密码错误!");
return;
}//用户名,密码均正确打印输出语句,显示功能菜单
else {
System.out.println("登录成功!");
}
// 显示功能菜单并进行相应处理
FunctionMenu.showFunctionMenu(user);
//打印输出退出提示信息
} } ConsoleOutputUtil.printGoodbyeInfo();
ConsoleInputUtil
package cn.edu.buu.it;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ConsoleInputUtil {
public static UserBean getConsoleInputUserInfo() throws IOException
{
UserBean user = null;//创建UserBean对象
String username = null;//字符串变量定义
String password = null;
System.out.print("请输入用户名称:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取数据,输入操作,创建BufferedReader对象
username = br.readLine();//读入姓名,保存至username中
System.out.print("请输入用户密码:");
password = br.readLine();//读入密码,保存至password中
user = new UserBean();//实例化UserBean对象
user.setUsername(username);//通过set()方法,为对象赋值
user.setPassword(password);
user = new UserBean(username, password);//实例化User对象,并通过有参构造函数为对象赋初值
return user;//返回对象
}
}
ConsoleOutputUtil
package cn.edu.buu.it;
import java.util.Enumeration;
import java.util.Hashtable;
public class ConsoleOutputUtil {
//运行系统打印输出语句
public static void printWelcomeInfo() {
System.out.println("***********************");
System.out.println("欢迎使用学生成绩查询系统!");
System.out.println("***********************");
}
//退出系统打印输入语句
public static void printGoodbyeInfo() {
System.out.println("***********************");
System.out.println("谢谢使用学生成绩查询系统,再见!");
System.out.println("***********************");
}
//打印输出学生成绩
public static void printScoresInfo(Hashtable scores) throws Exception {
//这些方法主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。枚举也用于将输入流指定到 SequenceInputStream 中
Enumeration e = scores.keys();//将哈希表赋值于Enumeration对象
//实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素
String cname = null;
int score = -1;
//打印所有学生的成绩
while (e.hasMoreElements()) {
cname = (String) e.nextElement();//获取姓名
score = (Integer)scores.get(cname);//通过键名获取学生成绩
System.out.println("\t" + cname + ":" + score);
}
}
}
DBUtil
package cn.edu.buu.it;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* 用于连接数据库的类
* 其它类如果需要访问数据库,可调用该类获取可用的连接对象
* 需要先进行测试,看是否可以正常使用
*/
public class DBUtil {
private static String driver;//定义连接驱动方式字符串
private static String url;//定义连接字符串
private static String user;//定义访问数据库用户名
private static String password;//定义访问数据库密码
static
{
driver = "sun.jdbc.odbc.JdbcOdbcDriver";// 使用 JDBC-ODBC 桥
url = "jdbc:odbc:School";// 访问Access数据库一般不需要用户名称和密码 }
/*
* 获取数据库连接对象
*/
public static Connection getConnection() throws ClassNotFoundException,
SQLException {
Connection conn = null;//创建连接对象
Class.forName(driver);//把JDBC驱动加载到JAVA虚拟机当中
conn = DriverManager.getConnection(url);//加载连接驱动,并与数据库建立连接,其中数据库连接字符串用来标识数据库
return conn;//返回连接连接对象
}
/*
* 关闭数据库连接
*/
public static void closeConnection(Connection conn) {
try { //异常处理
conn.close();//关闭连接对象
} catch (SQLException e) {
e.printStackTrace();//抛出异常
}
}
public static void main(String[] args) {
Connection conn = null;//创建连接对象
try {
conn = DBUtil.getConnection();//获取连接
boolean state = conn.isClosed();
//判断连接是否建立
if (!state) {
System.out.println("已成功建立与数据库的连接!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.closeConnection(conn);//关闭数据库连接
} } } System.out.println("已关闭与数据库的连接!");
FunctionImplementation
package cn.edu.buu.it;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Hashtable;
public class FunctionImplementation {
public static void addStudent() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取数据,输入操作,创建BufferedReader对象
String sno, sname, ssex, sdept;//创建字符串对象变量,学号,姓名,性别,系别 Date sbirth;//date对象
System.out.print("请输入学生学号:");
sno = br.readLine();//读入学号,保存至中
System.out.print("请输入学生姓名:");
sname = br.readLine();//读入姓名,保存至
System.out.print("请输入学生性别:");
ssex = br.readLine();//读入性别,保存至
System.out.print("请输入学生出生日期,格式1989-05-12:");
SimpleDateFormat sdf = new SimpleDateFormat();//创建SimpleDateFormat,日期格式对象
sdf.applyPattern("yyyy-mm-dd");//规定日期格式
sbirth = sdf.parse(br.readLine());//读入出生日期,并进行格式化
System.out.print("请输入学生系别:");
sdept = br.readLine();//读入系别,保存至中
StudentBean student = new StudentBean();//创建学生对象
student.setSno(sno);//为Student对象赋值,通过set()方法
student.setSname(sname);
student.setSsex(ssex);
student.setSbirth(sbirth);
student.setSdept(sdept);
boolean b = SchoolCRUD.addStudent(student);//执行数据插入数据库操作 if (b) {
System.out.println("添加学生成功!");//操作成功,打印输出语句
}
}
public static void listScores() throws Exception {
System.out.print("请输入学号:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取数据,输入操作,创建BufferedReader对象
String sno = br.readLine();//读入学号,保存至
getScoresBySno(sno);//通过学号查询成绩并保存至哈希表中
ConsoleOutputUtil.printScoresInfo(scores);//打印输出学生成绩
}
public static void modifyPassword(UserBean user) throws Exception {
System.out.print("请输入旧密码:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取数据,输入操作,创建BufferedReader对象
String oldPassword = br.readLine();//读入密码,保存至 oldPassword中
//判断输入密码是否正确
if (!oldPassword.equals(user.getPassword())) {
System.out.println("旧密码不正确!");
return;
}
else {
String newPassword = null;
String newPasswordConfirm = null;
int counter = 0;
while (counter < 3) {
System.out.print("请输入新密码:");
newPassword = br.readLine();//读入密码,保存至 newPassword中 System.out.print("请再次输入新密码:");
newPasswordConfirm = br.readLine();//读入密码,保存至
newPasswordConfirm中
//判断两次密码是否正确
if (newPassword.equals(newPasswordConfirm)) {
break;
}
else {
System.out.println("两次输入的密码不一致!");
counter ++;
}
}
//如果连续输入密码错误累计三次退出
if (counter == 3) {
return;
}
//执行密码修改操作
boolean b = SchoolCRUD.modifyPassword(user, newPassword);
if (b) {
System.out.println("修改密码成功!");//操作成功打印输出语句 }
}
}
/*
* 删除学生信息
*/
public static void deleteStudent() throws Exception {
System.out.print("请输入学号:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取数据,输入操作,创建BufferedReader对象
String sno = br.readLine();//读入学号,保存至
System.out.print("你确定要删除该学生吗(y/n)? ");
String input = br.readLine();//读入字符,保存至input中
//判断是否输入y
if (input.equalsIgnoreCase("y")) {
boolean b = SchoolCRUD.deleteStudentBySno(sno);//输入y,执行删除操作,通过学号
if (b) {
System.out.println("删除学生信息成功!");//操作成功打印输出 }
}
else if (input.equalsIgnoreCase("n")) {
return;//输入n,退出系统
}
else {
System.out.println("你的输入不正确!");//输入其他字符,打印输出语句 }
}
}
FunctionMenu
package cn.edu.buu.it;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
* 功能菜单类
*/
public class FunctionMenu {
/*
* 显示功能菜单方法
*/
public static void showFunctionMenu(UserBean user) throws Exception
{
System.out.println("请输入你的选择,1-增加学生,2-查询成绩,3-修改密码,4-删除学生,5-退出:");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//读取数据,输入操作,创建BufferedReader对象
String input = br.readLine();//读入输入字符串
int i = Integer.parseInt(input);//将读入字符串类型转换为int类型,即类型转换 switch (i)
{
case 1: FunctionImplementation.addStudent(); break;//执行添加操作 case 2: FunctionImplementation.listScores(); break;//执行打印输出学生成绩操作
case 3: FunctionImplementation.modifyPassword(user); break;//执行修改用户密码操作
case 4: FunctionImplementation.deleteStudent(); break;//执行删除学生信息操作
case 5: return;//退出系统
default: System.out.println("你的选择非法!");
}
// 直接递归调用,再次显示功能菜单
FunctionMenu.showFunctionMenu(user);
}
}
SchoolCRUD
package cn.edu.buu.it;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Hashtable;
public class SchoolCRUD {
/*
* 添加学生信息,并返回波尔值,判断是否添加成功
*/
public static boolean addStudent(StudentBean student) throws Exception {
boolean result = false;//声明返回值,即是否添加成功
Connection conn = null;//创建连接对象
PreparedStatement pstmt = null;//创建PreparedStatement对象
String sql = "INSERT INTO Student(sno, sname, ssex, sbirth, sdept) VALUES(?,?,?,?,?) ";//插入语句
conn = DBUtil.getConnection();//获取连接
pstmt = conn.prepareStatement(sql);//预编译sql语句
pstmt.setString(1, student.getSno());//为SQL语句参数赋值
pstmt.setString(2, student.getSname());
pstmt.setString(3, student.getSsex());
java.util.Date sbirth = student.getSbirth();//通过对象student的get方法获取出生日期值
java.sql.Date date = new Date(sbirth.getTime());//创建date对象,并将出生日期转换为date类型
pstmt.setDate(4, date);//为SQL语句参数赋值
pstmt.setString(5, student.getSdept());//为SQL语句参数赋值,设置插入系别的值
int i = pstmt.executeUpdate();//执行插入操作,返回int类型,1:插入数据至数据库操作成功,0:操作失败
if (i == 1) {
result = true;//插入成功返回true
}
else {
result = false;//插入失败返回false
}
pstmt.close();//关闭PreparedStatement对象
conn.close();//关闭数据库连接
return result;
}
public static Hashtable getScoresBySno(String sno) throws Exception {
//类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法
Hashtable table = new Hashtable();//创建一个Hashtable实例
Connection conn = null;
Statement stmt = null;//创建statement对象
ResultSet rs = null;//创建resultSet对象,结果集
// String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据,String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
StringBuffer sql = new StringBuffer();
sql.append("SELECT cname, score ")//将字符串常量追加到StringBuffer类的对象sql的后面
.append("FROM SC, Course ")
.append("WHERE Course.cno = SC.cno AND sno = '")
.append(sno)
.append("'");
conn = DBUtil.getConnection();//获取连接对象
stmt = conn.createStatement();//实例化statement对象
rs = stmt.executeQuery(sql.toString());//执行查询操作,并将查询结果保存至ResultSet对象
String cname = null;//创建姓名字符串
int score = -1;
//若查询不为空
while (rs.next()) {
cname = rs.getString("cname");//姓名赋值操作,将所查到的姓名赋值给CNAME变量
score = rs.getInt("score");//成绩赋值操作
table.put(cname, score);////添加key/键值对,保存到哈希表中,name为键,score为保存值
}
rs.close();//关闭resultSet对象
stmt.close();//关闭statemt对象
conn.close();//关闭Connection对象
return table;
}
/*
* 更新用户密码
*/
public static boolean modifyPassword(UserBean user, String newPassword) throws Exception {
boolean result = false;//创建返回值
Connection conn = null;//创建连接对象
PreparedStatement pstmt = null;//创建PrepareStatement对象
String sql = "UPDATE UserInfo SET password = ? WHERE username = ?";//SQL语句,更新
conn = DBUtil.getConnection();//获取数据库连接对象
pstmt = conn.prepareStatement(sql);//实例化PrepareStatement对象,并进行预编译 pstmt.setString(1, newPassword);//为SQL语句参数赋值
pstmt.setString(2, user.getUsername());
int i = pstmt.executeUpdate();//执行更新操作,返回int类型,1:更新数据操作成功,0:操作失败
if (i == 1) {
result = true;//更新成功返回true
}
else {
result = false;//更新失败返回false
}
pstmt.close();//关闭PreparedStatement对象
conn.close();//关闭Connection对象
return result;//返回是否操作成功
}
public static boolean deleteStudentBySno(String sno) throws Exception {
boolean result = false;//创建返回值
Connection conn = null;//创建连接对象
PreparedStatement pstmt = null;//创建PrepareStatement对象
String sql = "DELETE FROM Student WHERE sno = ?";//SQL语句,删除数据操作
conn = DBUtil.getConnection();//获取数据库连接对象
pstmt = conn.prepareStatement(sql);//实例化PrepareStatement对象,并进行预编译 pstmt.setString(1, sno);//为SQL语句参数赋值
int i = pstmt.executeUpdate();//执行删除操作,返回int类型,1:删除数据操作成功,0:操作失败
if (i == 1) {
result = true;//删除成功返回true
}
else {
result = false;//删除失败返回false
}
pstmt.close();//关闭PreparedStatement对象
conn.close();//关闭Connection对象
return result;//返回是否操作成功
} }
StudentBean
package cn.edu.buu.it;
import java.util.Date;
/*
* Student对象JAVA BEAN
*/
public class StudentBean {
private String sno;//学号属性 private String sname;//学生姓名 private String ssex;//学生性别
private Date sbirth;//学生出生年月日 private String sdept;//学生系别
/*
* 学生属性数据封装
*/
//获取学号
public String getSno() {
return sno;
}
//设置学号参数值
public void setSno(String sno) { this.sno = sno;
}
//获取姓名
public String getSname() { return sname;
}
//设置学生姓名参数
public void setSname(String sname) { this.sname = sname;
}
//获取性别
public String getSsex() {
return ssex;
}
//设置性别参数
public void setSsex(String ssex) { this.ssex = ssex;
} } //获取出生日期 public Date getSbirth() { return sbirth; } //设置出生日期 public void setSbirth(Date sbirth) { this.sbirth = sbirth; } //获取系别 public String getSdept() { return sdept; } //设置系别参数 public void setSdept(String sdept) { this.sdept = sdept; }
UserBean
package cn.edu.buu.it;
// 实体类,与数据库中的 UserInfo 表对应
public class UserBean {
private String username;//用户名属性
private String password;//密码属性
//无参构造函数
public UserBean() { }
//有参构造函数,为属性值赋初值
public UserBean(String username, String password) { this.username = username;
this.password = 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; }
UserLoginUtil
package cn.edu.buu.it;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
public class UserLoginUtil {
public static boolean isUsernameRight(UserBean user)throws Exception
{
boolean result = false;//创建返回值
Connection conn = null;//创建连接对象
Statement stmt = null;//创建statement对象
ResultSet rs = null;//创建resultSet对象,结果集
//String和StringBuffer他们都可以存储和操作字符串,即包含多个字符的字符串数据,String类是字符串常量,是不可更改的常量。而StringBuffer是字符串变量,它的对象是可以扩充和修改的。
StringBuffer sql = new StringBuffer();
sql.append("SELECT username, password ")//将字符串常量追加到StringBuffer类的对象sql的后面
.append("FROM UserInfo ")
.append("WHERE username = '")
.append(user.getUsername())
.append("'");
conn = DBUtil.getConnection();//获取连接对象
stmt = conn.createStatement();//实例化statement对象
rs = stmt.executeQuery(sql.toString());//执行查询操作,并将查询结果保存至ResultSet对象
//执行查询操作,查询不为空,则返回true,查询结果为空,返回false
if (rs.next()) {
result = true;
}
else {
result = false;
}
rs.close();//关闭resultSet对象
stmt.close();//关闭statemt对象
conn.close();//关闭Connection对象
return result;//返回是否操作成功
}
public static boolean isPasswordRight(UserBean user)throws Exception
{
boolean result = false;//创建返回值
Connection conn = null;//创建连接对象
Statement stmt = null;//创建statement对象
ResultSet rs = null;//创建resultSet对象,结果集
StringBuffer sql = new StringBuffer();
sql.append("SELECT username, password ")//将字符串常量追加到StringBuffer类的对象sql的后面
.append("FROM UserInfo ")
.append("WHERE username = '")
.append(user.getUsername())
.append("' AND password = '")
.append(user.getPassword())
.append("'");
conn = DBUtil.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql.toString());
if (rs.next()) {
result = true;
}
else {
result = false;
}
rs.close();
stmt.close();
conn.close();
return result;
}
}
学生实验报告册(理工类)课程名称:JAVA程序设计实验专业班级:M11计算机科学与技术II学生学号:学生姓名:所属院部:XX学院指…
中原工学院信息商务学院Java程序设计实习报告中原工学院信息商务学院经济管理系20xx年6月20号1中原工学院信息商务学院目录一实…
Java程序设计实训报告实训名称仓库管理系统实训专业计算机应用班级计算机10A1学号姓名指导教师侯丽敏20xx年12月8日实训成绩…
Java程序设计实验报告实验一JDK开发环境和结构化程序设计实验学时2实验类型综合性一实验目的1熟悉JDK开发环境2熟悉Ultra…
Java项目开发实训总结设计人:浦江峰班级和班内序号:1132304112项目选题意义:在民营企业、中小型公司高速蓬勃发展的今天,…
Java项目开发实训总结设计人:杨莉莉班级和班内序号:软件11128号项目选题意义:今年来,随着网络的普及,越来越多的企业借用网络…
Java程序设计实训报告实训名称仓库管理系统实训专业计算机应用班级计算机10A1学号姓名指导教师侯丽敏20xx年12月8日实训成绩…
1Java程序设计实训报告班级学号姓名指导教师成绩2实训内容题目1用java语言设计一个关于ATM机的程序并实现相应的功能解题思路…
学生实验报告册(理工类)课程名称:JAVA程序设计实验专业班级:M11计算机科学与技术II学生学号:学生姓名:所属院部:XX学院指…
Java程序设计实验指导报告书目录实验1熟悉Java开发环境2实验2简单的输入输出处理3实验3类的练习6实验4Java图形用户界面…