Java程序设计实训报告 原创

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;

}

}

相关推荐