一、系统描述

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之间的连接有了更深的了解,编写一个系统,需要有清晰的思路,从最先开始的无从下手,到后面可以大概知道需要编写几大模块。而在编写的过程中最难受的地方便是修改和删除这个模块。在修改完程序时,编译总会出错,而不知道哪个地方出了问题,这个时候需要找别人和我一起探讨和解决这个问题。在这次设计中遇到很多实际性的问题,在实际设计才发现,书本上理论性的东西与实际运用中的还有有一定的出入,所以有些问题不但要深入理解,还要在解决程序设计中的问题,而程序设计是一个很灵活的东西,它反映了你解决问题的逻辑思维和创新能力。通过这次课程设计我也发现自己的不足,虽然理论上已经掌握,但在实践的过程中会有意想不到的困惑,经过一番的努力才得以解决。

技术
友情链接
码工具
Toolsou
API参考文档
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:766591547
关注微信