一、系统描述
1、介绍开发的系统的功能:学生信息管理系统可以根据学生表里的姓名,对学生信息进行联合删除,同时也可以实现对学生个人信息进行添加,修改,删除和查询功能
2、解决的问题:通过与数据库连接,在运行界面显示出学生的信息,和执行各个功能
二、系统分析与设计
1、软件需求;eclipse,MySQL,Navicat for MySQL
2、功能设计;学生信息包括学号,姓名,密码,类型(通过类型判断是管理员还是学生),进入相应的界面
图1-1 学生信息管理系统功能结构图
3、数据库设计(或数据结构设计);在创建好的数据库Studentgradessystem中有学生信息表(info)这个表通过Navicat for MySQL来建立很简单的,连接了MySQL后,新建表即可
图1-2 学生信息表
4、系统详细设计文档(类的划分及相互关系、接口设计、算法设计等);
1、com.tjl.dbc------------------数据库连接
JDBCUtils.java----------封装JDBC工具类,连接,释放资源
package com.tjl.dbc;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import javax.sql.ConnectionEvent;
public class JDBCUtils
{
private static String driver;
private static String url;
private static String username;
private static String sex;
private static String userpassword;
//静态语句块
static
{
//JDBCUtils.class用来获得对象
//getClassLoader()类加载器
//getResourceAsStream("db.properties")加载资源文件放到输出流中
//用流的形式来读取这个文件
InputStream resourceAsStream = JDBCUtils.class.getClassLoader().getResourceAsStream("db.properties");
//创建一个properties的对象
Properties p=new Properties();
//加载流文件
try {
p.load(resourceAsStream);
driver = p.getProperty("driver");//读取这个driver 并赋值给一个变量driver就是我想要的驱动名称
url=p.getProperty("url");
username=p.getProperty("username");
userpassword=p.getProperty("userpassword");
Class.forName(driver);//加载MySQL驱动
System.out.println("驱动加载成功");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获得对象的方法
public static Connection getConnection()
{
try
{
System.out.println("数据库连接成功");
System.out.println();
//return DriverManager.getConnection(url,username,userpassword);
return DriverManager.getConnection("jdbc:mysql://localhost:3306/StudentgradesSystem","root","msh8426pou");
}catch(SQLException e)
{
System.out.println("数据库连接失败");
e.printStackTrace();
}
return null;
}
//释放资源的方法
public static void close(Connection connection,Statement statement,ResultSet result)
{
try {
if(result!=null)//先判断一下,这个结果集是否为空。如果结果集里不为空,则把结果关掉
{
result.close();
result=null;//到这java会回收结果,赋值为空,先创建的后关闭
}
if(statement!=null)
{
statement.close();
statement=null;
}
if(connection!=null)
{
connection.close();
connection=null;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
2、com.tjl.view-----------------视图包
View.java-----------------包含各类视图菜单类
package com.tji.view;
import java.util.Scanner;
import com.tji.bean.User;
public class View
{
private static Scanner input=new Scanner(System.in);
//首页视图
public static User indexView()
{
System.out.println("***********************************************************");
System.out.println("*************\t\t学生成绩管理系统\t\t***********");
System.out.println("*************\t\t根据输入下列信息\t\t***********");
System.out.println("*************\t\t请输入账号\t\t***************");
String username = input.nextLine();//根据用户输入的账号返回它的名字
System.out.println("**************\t\t请输入密码\t\t**************");
System.out.println("*************************************************************");
String userpassword = input.nextLine();
return new User(username,userpassword);
}
//管理员菜单视图
public static int managerMeunView()
{
System.out.println("***********************************************************");
System.out.println("***********************************************************");
System.out.println("*************\t\t欢迎管理员回来\t\t***********");
System.out.println("*************\t\t请根据提示操作\t\t***********");
System.out.println("*************\t0.退出\t\t***********");
System.out.println("*************\t1.添加学生信息\t\t***********");
System.out.println("*************\t2.删除学生信息\t\t***********");
System.out.println("*************\t3.修改学生信息\t\t***********");
System.out.println("*************\t4.查询学生信息\t\t***********");
System.out.println("***********************************************************");
System.out.println("***********************************************************");
//获取用户输入信息
String type=input.nextLine();
//将获取到的数据转换为int类型
int item = Integer.parseInt(type);
//判断用户输入是否在0~4之间,如果超出范围,提示用户"输入错误,请重新输入",并留在视图页面,如果输入正确,将用户输入的选项返回
if(item<0||item>4)
{
System.out.println("输入错误,请重新输入!");
return managerMeunView();//方法的回调
}
//如果输入正确,则将用户输入的选项返回
System.out.println("**************************************************************");
return item;
}
//添加学生信息视图,返回一个新的User对象(username,userpassword)
public static User addMeunView()
{
System.out.println("***************************************************************");
System.out.println("***************************************************************");
System.out.println("*************\t\t请根据提示操作\t\t***********");
System.out.println("*************\t\t请输入账号\t\t***************");
String username = input.nextLine();//根据用户输入的账号返回它的名字
System.out.println("**************\t\t请输入密码\t\t**************");
System.out.println("*************************************************************");
System.out.println("*************************************************************");
String userpassword = input.nextLine();
return new User(username,userpassword);
}
//删除学生信息
public static String deleteMeunView()
{
System.out.println("***************************************************************");
System.out.println("*************\t\t请根据提示操作\t\t***********");
System.out.println("*************\t\t请输入要删除的学生账号\t\t***************");
String username = input.nextLine();//根据用户输入的账号返回它的名字
System.out.println("*************************************************************");
return username;
}
//修改学生信息
public static User updateMeunView()
{
System.out.println("***************************************************************");
System.out.println("*************\t\t请根据提示操作\t\t***********");
System.out.println("*************\t\t请输入要修改的账号\t\t***************");
String username = input.nextLine();//根据用户输入的账号返回它的名字
System.out.println("**************\t\t请输入新的密码\t\t**************");
String userpassword = input.nextLine();
System.out.println("*************************************************************");
return new User(username,userpassword);
}
//查询学生信息
public static String selectMeunView()
{
System.out.println("***************************************************************");
System.out.println("*************\t\t请根据提示操作\t\t***********");
System.out.println("*************\t\t请输入要查询的学生账号\t\t***************");
String username = input.nextLine();//根据用户输入的账号返回它的名字
System.out.println("*************************************************************");
return username;
}
//输出学生信息的方法
public static void printUser(User user)
{
System.out.println("用户的id:"+user.getId());
System.out.println("用户名:"+user.getUsername());
System.out.println("用户密码:"+user.getUserpassword());
if(user.getType()==1)
{
System.out.println("用户权限:管理员");
}
else
{
System.out.println("用户权限:学生");
}
}
}
3、com.tjl.test------------------测试包
JDBCUtilsTest.java---------测试mysql执行语句类
package com.tjl.test;
import static org.junit.Assert.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
import com.tji.bean.User;
import com.tjl.dao.UserDao_Imp;
import com.tjl.dbc.JDBCUtils;
public class JDBCUtilsTest
{
@Test
public void jdbcConnectionTest() throws Exception
{
Connection connection = JDBCUtils.getConnection();//通过类名点直接调用getConnection这个方法。会返回一个jdbcConnectionTest的对象
Statement statement = connection.createStatement();//创建一个执行环境,拿到一个执行的对象叫statement
ResultSet result = statement.executeQuery("SELECT * FROM user");//拿着statement执行sequel语句,查询的结果在结果集里,把结果的对象result记录一下
while(result.next())//查询以下结果,如果有结果就输出来
{
System.out.print(result.getString("id"));
System.out.print(result.getString("username"));
System.out.println(result.getString("userpassword"));
}
}
//测试登录系统
@Test
public void loginTest() throws Exception
{
UserDao_Imp userDao_Imp=new UserDao_Imp();//先实例化一个UserDao_Imp的对象,用这个对象去调用login方法,里面有一个user,要先实例化一个user的对象
User user=new User("王萌萌","12345");
int type = userDao_Imp.login(user);
System.out.println(type);
}
//测试添加学生信息
@Test
public void insertTest() throws Exception
{
UserDao_Imp userDao_Imp = new UserDao_Imp();//new了一个对象,并返回一个值
User user = new User("李逵","12345");
boolean flag = userDao_Imp.insert(user);//拿着这个对象去调用insert()这个方法
System.out.println(flag);
}
//测试删除学生信息
@Test
public void deleteTest() throws Exception
{
UserDao_Imp userDao_Imp = new UserDao_Imp();
User user = new User("李逵","12345");
boolean flag = userDao_Imp.delete(user.getUsername());
System.out.println(flag);
}
//测试修改学生信息
@Test
public void updateTest() throws Exception
{
UserDao_Imp userDao_Imp = new UserDao_Imp();
User user = new User("李逵","1234");
boolean flag = userDao_Imp.update(user);
System.out.println(flag);
}
//测试查询学生信息
@Test
public void selectTest() throws Exception
{
UserDao_Imp userDao_Imp = new UserDao_Imp();
User user = new User("李逵","1234");
User username = userDao_Imp.select(user.getUsername());
System.out.println(username);
}
}
ViewTest.java-----------测试各类视图的类
package com.tjl.test;
import static org.junit.Assert.*;
import org.junit.Test;
import com.tji.bean.User;
import com.tji.view.View;
public class ViewTest
{
@Test//测试登录页面
public void indexViewTest() throws Exception
{
User user1 = View.indexView();
System.out.println(user1);
}
//测试管理员菜单视图
@Test
public void managerMeunViewTest() throws Exception
{
int item= View.managerMeunView();//调用View类中的managerMeunViewTest()方法,返回一个int类型的值
System.out.println(item);
}
//测试增加学生信息视图
@Test
public void addMeunViewTest() throws Exception
{
User user = View.addMeunView();
System.out.println(user);
}
//测试删除学生信息视图、
@Test
public void deleteMeunViewTest() throws Exception
{
String user = View.deleteMeunView();
System.out.println(user);
System.out.println("删除成功");
}
//测试修改学生信息视图
@Test
public void updateMeunViewTest() throws Exception
{
User user = View.updateMeunView();
System.out.println(user);
System.out.println("修改成功");
}
//测试查询学生信息视图
@Test
public void selectMeunView() throws Exception
{
String user = View.selectMeunView();
System.out.println(user);
}
}
4、com.tjl.bean----------------用户类
User.java-----------------封装类
package com.tji.bean;
public class User
{
private int id;
private String username;
private String userpassword;
private int type;
public User() {
super();
}
public User(String username, String userpassword) {
super();
this.username = username;
this.userpassword = userpassword;
}
public User(String username, String userpassword, int type) {
super();
this.username = username;
this.userpassword = userpassword;
this.type = type;
}
public User(int id, String username, String userpassword, int type) {
super();
this.id = id;
this.username = username;
this.userpassword = userpassword;
this.type = type;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the username
*/
public String getUsername() {
return username;
}
/**
* @param username the username to set
*/
public void setUsername(String username) {
this.username = username;
}
/**
* @return the userpassword
*/
public String getUserpassword() {
return userpassword;
}
/**
* @param userpassword the userpassword to set
*/
public void setUserpassword(String userpassword) {
this.userpassword = userpassword;
}
/**
* @return the type
*/
public int getType() {
return type;
}
/**
* @param type the type to set
*/
public void setType(int type) {
this.type = type;
}
}
5、com.tjl.dao------------------对数据库访问的实现类
UserDao.java------------接口(登录,增,删,改,查)
package com.tjl.dao;
import com.tji.bean.User;
public interface UserDao
{
/**验证登录的方法
* @param user是要登录的用户,username账户,userpassword密码
* @return int类型-1登录失败 1管理员登录 2学生登录
*/
int login(User user);//抽象方法
/**用来添加学生信息的抽象方法
* @param user要添加的对象,包含账户和密码
* @return 如果添加成功放回true,添加失败返回false
*/
boolean insert(User user);
/**用来删除学生信息的抽象方法
* @param username要删除的学生中的账号和密码
* @return 如果删除成功,则返回true,如果删除失败,则返回false
*/
boolean delete (String username);
/**用于修改学生信息的方法
* @param user是要修改的学生信息
* @return 修改成功则返回true,修改失败则返回false
*/
boolean update(User user);
/**用来查询学生的抽象方法
* @param username是要查询的学生的信息
* @return 查询成功,则返回user,查询失败则返回null
*/
User select(String username);
}
UserDao_Imp.java-----接口的实现类(mysql的具体执行语句)
package com.tjl.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.tji.bean.User;
import com.tjl.dbc.JDBCUtils;
public class UserDao_Imp implements UserDao {
private static final String SQL_USER_LOGIN="SELECT type from user WHERE username=? AND userpassword=?";
private static final String SQL_USER_INSERT = "INSERT into `user` VALUES(id,?,?,2)";//这个常量来存放我添加的这个SQL语句
private static final String SQL_USER_DELETE ="DELETE FROM `user`WHERE username=?" ;//这个常量用来放我要删除学生的名字
private static final String SQL_USER_UPDATE = "UPDATE `user`SET userpassword= ?WHERE username=?";
private static final String SQL_USER_SELECT = "SELECT *FROM `user` WHERE username=?";
//动态的参数用?替代,第一个问号要得到user的名字,第二个user要得到账号的密码
@Override
public int login(User user) {
// 连接数据库,创建连接对象connection
Connection connection = JDBCUtils.getConnection();
//创建执行环境statement
//执行sql语句用 Query方法,得到结果集对象result
PreparedStatement prepareStatement =null;
ResultSet result=null;
try {
//创建预编译环境
prepareStatement = connection.prepareStatement(SQL_USER_LOGIN);//创建预编译环境,SQL_USER_LOGIN是临时设置的一个常量
//设置SQL语句中的参数
prepareStatement.setString(1,user.getUsername());
prepareStatement.setString(2,user.getUserpassword());
//执行语句
result = prepareStatement.executeQuery();
while(result.next())
{
//用结果集查询当前用户权限
int type=result.getInt("type");
return type;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
JDBCUtils.close(connection,prepareStatement,result);//关闭资源
}
return -1;
}
@Override
public boolean insert(User user) {
//INSERT into `user` VALUES(id,"高亮","12345",2)
// 连接数据库,创建连接对象connection
Connection connection = JDBCUtils.getConnection();
//创建执行环境
PreparedStatement prepareStatement =null;
try {
prepareStatement = connection.prepareStatement(SQL_USER_INSERT);
//设置SQL语句中的参数
prepareStatement.setString(1,user.getUsername());//第一个参数要替换成新增加的用户的名字
prepareStatement.setString(2,user.getUserpassword());//第二个参数要替换成用户的密码
int line = prepareStatement.executeUpdate();//返回一个受影响的行数,如果Line值是大于0则返回一个true,如果小于0则返回false
if(line>0)
{
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
JDBCUtils.close(connection,prepareStatement,null);
}
return false;
}
@Override
public boolean delete(String username)
{
// 连接数据库,创建连接对象connection
Connection connection = JDBCUtils.getConnection();
//创建执行环境
PreparedStatement prepareStatement =null;
try {
prepareStatement = connection.prepareStatement(SQL_USER_DELETE);
//设置SQL语句中的参数
prepareStatement.setString(1,username);//第一个参数要替换成新增加的用户的名字
int line = prepareStatement.executeUpdate();//返回一个受影响的行数,如果Line值是大于0则返回一个true,如果小于0则返回false
if(line>0)
{
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
JDBCUtils.close(connection,prepareStatement,null);
}
return false;
}
@Override
public boolean update(User user)
{
Connection connection = JDBCUtils.getConnection();
//创建执行环境
PreparedStatement prepareStatement =null;
try {
prepareStatement = connection.prepareStatement(SQL_USER_UPDATE);
//设置SQL语句中的参数
prepareStatement.setString(1,user.getUserpassword());//第一个参数要替换成修改的用户的密码
prepareStatement.setString(2,user.getUsername());//第一个参数要替换成修改的用户的名字
int line = prepareStatement.executeUpdate();//返回一个受影响的行数,如果Line值是大于0则返回一个true,如果小于0则返回false
if(line>0)
{
return true;
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
JDBCUtils.close(connection,prepareStatement,null);
}
return false;
}
@Override
public User select(String username) {
Connection connection = JDBCUtils.getConnection();
//创建执行环境
PreparedStatement prepareStatement =null;
try {
prepareStatement = connection.prepareStatement(SQL_USER_SELECT);
//设置SQL语句中的参数
prepareStatement.setString(1, username);;//第一个参数要替换成要查询的用户的密码
ResultSet result = prepareStatement.executeQuery();//返回一个受影响的行数,如果Line值是大于0则返回一个true,如果小于0则返回false
while(result.next())
{
int id = result.getInt("id");
username = result.getString("username");//传参的时候已经定义了一个username,就不再重复定义
String userpassword = result.getString("userpassword");
int type = result.getInt("type");//获得类型,如果是1则是管理员,如果是2则是学生
return new User(id,username,userpassword,type);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
JDBCUtils.close(connection,prepareStatement,null);
}
return null;
}
}
6、com.tjl.controller----------控制层
Control.java-------------系统的入口,控制业务逻辑及调用
package com.tjl.controller;
import com.tji.bean.User;
import com.tji.view.View;
import com.tjl.dao.UserDao_Imp;
public class Control
{
public static void main(String args[])
{
while(true)
{
//给用户展示登录界面
User user = View.indexView();//拿到要登录的人的信息,拿去跟数据库比对
UserDao_Imp userDao_Imp = new UserDao_Imp();
int type = userDao_Imp.login(user);//这个值返回的是type的值,如果是1则是管理员,进入增删改查界面, 如果是2则是学生
switch(type)
{
case -1:
System.out.println("输入有误,请重新输入!");
break;
case 1:
System.out.println("欢迎管理员回来!");
managerServer();
break;
case 2:
System.out.println("恭喜学生登录成功!");
studentServer();
default:
break;
}
}
}
private static void managerServer()
{
UserDao_Imp userDao_Imp = new UserDao_Imp();
while(true)
{
//展示管理员菜单视图
int managerMeunView = View.managerMeunView();//返回一个整数型的值,根据管理员选择的数字不同
boolean flag;
switch(managerMeunView)
{
case 0://退出
System.exit(-1);
break;
case 1://添加学生信息
User user = View.addMeunView();//新增返回的学生用户
flag = userDao_Imp.insert(user);//添加成功,返回一个布尔型的值,每一个都要返回一个值,直接在外面定义一个flag
System.out.println(flag?"添加成功":"添加失败");
break;
case 2://删除学生信息
String username = View.deleteMeunView();//返回的被删除的账号的姓名
flag = userDao_Imp.delete(username);
System.out.println(flag?"删除成功":"删除失败");
break;
case 3://修改学生信息
User updateusername = View.updateMeunView();//返回要修改的学生信息
flag = userDao_Imp.update(updateusername);
System.out.println(flag?"修改成功":"修改失败");
break;
case 4://查询学生信息
String selectusername = View.selectMeunView();//返回要查询的学生账号
User selectedUser= userDao_Imp.select(selectusername);//返回那个被查到的学生信息
View.printUser(selectedUser);//声名一个方法去输出这个学生信息
break;
default:
break;
}
}
}
private static void studentServer()
{
// TODO Auto-generated method stub
}
}
5、各个模块的实现方法描述;
(1)加载JDBC驱动——>实例化连接驱动类,并将其注册到DriverManger中——>连接数据库,并获得Connection对象——>访问数据库——>处理结果集——>关闭数据库连接
(2)登录页面的设计
(3)各功能的实现及测试
(4)用户的信息,根据用户输入的姓名,密码返回数据库比对,找到所输入的用户的权限,如果是1,则是管理员,进入管理员界面,如果是2,则是学生,则进入学生界面,如果返回-1,则输入错误,提示重新输入
三、设计总结
在学生信息管理系统中,重点加深学习了类型,变量,接口,输入输出流,分析异常,抛出异常,界面设计,对于数据库与Java之间的连接有了更深的了解,编写一个系统,需要有清晰的思路,从最先开始的无从下手,到后面可以大概知道需要编写几大模块。而在编写的过程中最难受的地方便是修改和删除这个模块。在修改完程序时,编译总会出错,而不知道哪个地方出了问题,这个时候需要找别人和我一起探讨和解决这个问题。在这次设计中遇到很多实际性的问题,在实际设计才发现,书本上理论性的东西与实际运用中的还有有一定的出入,所以有些问题不但要深入理解,还要在解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力。通过这次课程设计我也发现自己的不足,虽然理论上已经掌握,但在实践的过程中会有意想不到的困惑,经过一番的努力才得以解决。