一、系统描述

1、介绍开发的系统的功能:学生信息管理系统可以根据学生表里的姓名,对学生信息进行联合删除,同时也可以实现对学生个人信息进行添加,修改,删除和查询功能

2、解决的问题:通过与数据库连接,在运行界面显示出学生的信息,和执行各个功能

二、系统分析与设计

1、软件需求;eclipse,MySQL,Navicat for MySQL

2、功能设计;学生信息包括学号,姓名,密码,类型(通过类型判断是管理员还是学生),进入相应的界面

java添加学生信息的代码 java学生信息表_User

 

                                             图1-1  学生信息管理系统功能结构图

3、数据库设计(或数据结构设计);在创建好的数据库Studentgradessystem中有学生信息表(info)这个表通过Navicat for MySQL来建立很简单的,连接了MySQL后,新建表即可

java添加学生信息的代码 java学生信息表_System_02

 

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