一、实验目的和要求:
①目的:
1) 复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握;
2) 课程设计为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力。提高学生适应实际,实践编程的能力;
3) 培养学生在项目开发中团队合作精神、创新意识及能力。
②要求:
1) 对系统进行功能模块分析、控制模块分析正确,符合课题要求,实现相应功能;可以加以其他功能或修饰,使程序更加完善、合理;
2) 系统设计要实用,编程简练,可用,功能全面
3) 说明书、流程图要清楚
4) 记录设计情况(备查,也为编写设计说明书作好准备);
5) 要求采用模块化程序设计方法,及锯齿型书写格式,要求上机调试通过和按设计报告格式。
6) 设计上交内容:设计报告一组一份(按格式书写);心得体会每人一份;源程序文件。
二、任务书
程序设计是一个团队的工作,需要合理的分工、共同努力才能做出好结果!
本组成员:甲 乙 丙
成员任务分配:甲负责程序中数据库的连接与实现
乙负责实现学生信息的查询
丙负责设计中计算的实现,如平均成绩、最高分、排序等
具体实施:下载MySQL数据库,询问老师数据库的使用方法,建立数据库的连接。
建立程序的大概框架,植入函数方法,实现类的执行,最终完成设计!
三、源代码
action包:
package com.iapp.action;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import com.iapp.dao.GoddessDao;
import com.iapp.model.Goddess;
public class GoddessAction {
GoddessDao dao=new GoddessDao();
//动作控制
public void add(Goddess goddess) throws Exception{
dao.addGoddess(goddess);
}
public void edit(Goddess goddess) throws Exception{
dao.updateGoddess(goddess);
}
//查询所有学生的基本信息
public List<Goddess> query() throws Exception{
return dao.query();
}
//查询单个学生详细信息
public Goddess get(Integer id) throws SQLException{
return dao.get(id);
}
public Goddess get(String name) throws SQLException{
return dao.get(name);
}
public void del(Integer id) throws SQLException{
dao.delGoddess(id);
}
//各科的平均分,最高分和最低分
//通过姓名查询学生的详细信息
public int[] queryScore()throws Exception{
return dao.queryScore();
}
public List<Integer> queryScore4()throws Exception{
return dao.queryScore4();
}
public int[] queryScore1()throws Exception{
return dao.queryScore1();
}
public int[] queryScore2()throws Exception{
return dao.queryScore2();
}
public Goddess query(String name) throws Exception{
return dao.get(name);
}
}
Dao包:
package com.iapp.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.iapp.db.DBUtil;
import com.iapp.model.Goddess;
public class GoddessDao {
//方法
@SuppressWarnings("null")
public List<Integer> queryScore4(){
ArrayList<Integer> values = new ArrayList<Integer>();
Connection conn=DBUtil.getConnection();
String sql="select ((Math + Java + Com + English) / 4) avg_score from student_info order by avg_score desc";
PreparedStatement ptmt=null;
ResultSet rs = null;
try {
conn.prepareStatement(sql);
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
while(rs.next()){
values.add(rs.getInt(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
return values;
}
public int[] queryScore(){
int[] scores = new int[4];
Connection conn=DBUtil.getConnection();
String sql="select max(math),max(java),max(com),max(english) from student_info";
PreparedStatement ptmt=null;
ResultSet rs = null;
try {
conn.prepareStatement(sql);
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
if(rs.next()){
scores[0] = rs.getInt(1);
scores[1] = rs.getInt(2);
scores[2] = rs.getInt(3);
scores[3] = rs.getInt(4);
}
} catch (SQLException e) {
e.printStackTrace();
}
return scores;
}
public int[] queryScore2(){
int[] scores = new int[4];
Connection conn=DBUtil.getConnection();
String sql="select avg(math),avg(java),avg(com),avg(english) from student_info";
PreparedStatement ptmt=null;
ResultSet rs = null;
try {
conn.prepareStatement(sql);
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
if(rs.next()){
scores[0] = rs.getInt(1);
scores[1] = rs.getInt(2);
scores[2] = rs.getInt(3);
scores[3] = rs.getInt(4);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn != null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return scores;
}
public int[] queryScore3(){
int[] scores = new int[4];
Connection conn=DBUtil.getConnection();
String sql="select avg(math),avg(java),avg(com),avg(english) from student_info";
PreparedStatement ptmt=null;
ResultSet rs = null;
try {
conn.prepareStatement(sql);
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
if(rs.next()){
scores[0] = rs.getInt(1);
scores[1] = rs.getInt(2);
scores[2] = rs.getInt(3);
scores[3] = rs.getInt(4);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(conn != null)conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return scores;
}
public int[] queryScore1(){
int[] scores2 = new int[4];
Connection conn=DBUtil.getConnection();
String sql="select min(math),min(java),min(com),min(english) from student_info";
PreparedStatement ptmt=null;
ResultSet rs = null;
try {
conn.prepareStatement(sql);
ptmt = conn.prepareStatement(sql);
rs = ptmt.executeQuery();
if(rs.next()){
scores2[0] = rs.getInt(1);
scores2[1] = rs.getInt(2);
scores2[2] = rs.getInt(3);
scores2[3] = rs.getInt(4);
}
} catch (SQLException e) {
e.printStackTrace();
}
return scores2;
}
public void addGoddess(Goddess g) throws Exception{
Connection conn=DBUtil.getConnection();
String sql="" +
"insert into student_info" +
"(id,s_name,Math,Java,Com,English)" +
"values(" +
"?,?,?,?,?,?)";
PreparedStatement ptmt=conn.prepareStatement(sql);
ptmt.setInt(1,g.getId());
ptmt.setString(2, g.getS_name());
ptmt.setInt(3, g.getMath());
ptmt.setInt(4, g.getJava());
ptmt.setInt(5, g.getCom());
ptmt.setInt(6, g.getEnglish());
ptmt.execute();
}
public void updateGoddess(Goddess g) throws SQLException{
Connection conn=DBUtil.getConnection();
//加空格 小心在一行报SQL错误
String sql="" +
" update student_info " + /*无into*/
" set id=?,s_name=?,Math=?,Java=?,Com=?,English=?" +
" where id =? ";
PreparedStatement ptmt=conn.prepareStatement(sql);
ptmt.setInt(1,g.getId());
ptmt.setString(2, g.getS_name());
ptmt.setInt(3, g.getMath());
ptmt.setInt(4, g.getJava());
ptmt.setInt(5, g.getCom());
ptmt.setInt(6, g.getEnglish());
ptmt.setInt(7, g.getId()); //少了一句这个
ptmt.execute();
}
public void delGoddess(Integer id) throws SQLException{
Connection conn=DBUtil.getConnection();
String sql="" +
" delete from student_info " +//这里曾经有错误
" where id=? ";
PreparedStatement ptmt=conn.prepareStatement(sql);
ptmt.setInt(1, id);
ptmt.execute();
}
//查询所有学生的基本信息
public List<Goddess> query() throws Exception{
List<Goddess> result=new ArrayList<Goddess>();
Connection conn=DBUtil.getConnection();
StringBuilder sb=new StringBuilder();
sb.append("select id,s_name from student_info ");
PreparedStatement ptmt=conn.prepareStatement(sb.toString());
ResultSet rs=ptmt.executeQuery();
Goddess g=null;
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setS_name(rs.getString("s_name"));
result.add(g);
}
return result;
}
public Goddess get(Integer id) throws SQLException{
Goddess g=null;
Connection conn=DBUtil.getConnection();
//加空格 小心在一行报SQL错误
String sql="" +
" select * from student_info " +
" where id =? ";
PreparedStatement ptmt=conn.prepareStatement(sql);
ptmt.setInt(1,id);
ResultSet rs=ptmt.executeQuery();//这里曾经有错误*
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setS_name(rs.getString("s_name"));
g.setMath(rs.getInt("math"));
g.setJava(rs.getInt("java"));
g.setCom(rs.getInt("com"));
g.setEnglish(rs.getInt("english"));
}
return g;
}
public Goddess get(String name) throws SQLException {
Connection conn=DBUtil.getConnection();
String sql="" +
" select * from student_info " +
" where s_name =? ";
PreparedStatement ptmt=conn.prepareStatement(sql);
ptmt.setString(1,name);
ResultSet rs=ptmt.executeQuery();//这里曾经有错误*
Goddess g = null;
while(rs.next()){
g=new Goddess();
g.setId(rs.getInt("id"));
g.setS_name(rs.getString("s_name"));
g.setMath(rs.getInt("math"));
g.setJava(rs.getInt("java"));
g.setCom(rs.getInt("com"));
g.setEnglish(rs.getInt("english"));
}
return g;
}
}
Db包:
package com.iapp.db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
//获得和数据库的连接
private static final String URL="jdbc:mysql://127.0.0.1:3306/imooc";
private static final String USER="root";
private static final String PASSWORD="123456";
private static Connection conn=null;//不是只有同一个类才可以访问吗?
static {
try {
//1.加载驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.获得数据库的连接
conn=DriverManager.getConnection(URL, USER, PASSWORD);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Connection getConnection(){
return conn;
}
}
Modle包:
package com.iapp.model;
//实体类第一个字母要大写
public class Goddess {
private Integer id;
private String s_name;
private Integer Math;
private Integer Java;
private Integer Com;
private Integer English;
public int getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getS_name() {
return s_name;
}
public void setS_name(String s_name) {
this.s_name = s_name;
}
@Override
public String toString() {
return "Student [id=" + id + ", s_name=" + s_name + ", Math=" + Math + ", Java=" + Java + ", Com=" + Com
+ ", English=" + English + "]";
}
public String toString1() {
return "Student [id=" + id + ", s_name=" + s_name + "]";
}
public Integer getMath() {
return Math;
}
public void setMath(Integer math) {
Math = math;
}
public int getJava() {
return Java;
}
public void setJava(Integer java) {
Java = java;
}
public Integer getCom() {
return Com;
}
public void setCom(Integer com) {
Com = com;
}
public Integer getEnglish() {
return English;
}
public void setEnglish(Integer english) {
English = english;
}
}
View包:
package com.iapp.view;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import com.iapp.action.GoddessAction;
import com.iapp.model.Goddess;
public class View {
/*
* 程序启动后 一直保持在运行状态 循环接受控制台的输入参数 调用Action响应,并将返回结果展示出来
* 知道输入特定的输入标记(如EXIT)后,程序推出 问题点
1.循环接收参数
2保持一个特定的功能
*/
private static final String CONTEXT = "欢迎来到学生成绩管理系统:\n" +
"下面是学生成绩管理系统的功能列表:\n" +
"[MAIN/M]:主菜单\n"+
"[QUERY/Q]:查看全部学生的信息\n" +
"[GET/G]:查看某位学生的详细信息\n" +
"[ADD/A]:添加学生信息\n" +
"[UPDATE/U]:更新学生信息\n"+
"[DELETE/D]:删除学生信息\n" +
"[SEARCH/S]:查询学生信息(根据姓名查询)\n" +
"[RESULT/R]:输出全组各科平均分,最高分,最低分\n" +
"[COMPUTER/C]:计算出平均成绩 平均成绩降序输入\n"+
"[EXIT/E]:退出成绩管理系统\n" +
"[BREAK/B]:退出当前功能,返回主菜单";
private static final String OPERATION_MAIN = "MAIN";
private static final String OPERATION_QUERY = "QUERY";
private static final String OPERATION_GET = "GET";
private static final String OPERATION_ADD = "ADD";
private static final String OPERATION_UPDATE = "UPDATE";
private static final String OPERATION_DELETE = "DELETE";
private static final String OPERATION_SEARCH = "SEARCH";
private static final String OPERATION_EXIT = "EXIT";
private static final String OPERATION_BREAK = "BREAK";
private static final String OPERATION_RESULT = "RESULT";
private static final String OPERATION_COMPUTER = "COMPUTER";
private static Scanner scan;
/**
* @param args
* @throws Exception
*/
@SuppressWarnings("null")
public static void main(String[] args) throws Exception {
System.out.println(CONTEXT);
// 怎么保持程序一直运行
scan = new Scanner(System.in);
Goddess goddess = new Goddess();
GoddessAction action = new GoddessAction();
String prenious = null;
Integer step = 1;
String pervious = null;
Goddess go = null;
// 有输入值循环没有不循环
while (scan.hasNext()) {
String in = scan.next().toString();
if (OPERATION_EXIT.equals(in.toUpperCase()) || OPERATION_EXIT.substring(0, 1).equals(in.toUpperCase())) {
System.out.println("您已成功退出学生成绩管理系统。");
break;
}
else if(OPERATION_COMPUTER.equals(in.toUpperCase())
||OPERATION_COMPUTER.substring(0, 1).equals(in.toUpperCase())){
System.out.println("下列依次是平均分的降序排列: ");
List<Integer> list = action.queryScore4();
for (int k =0;k<list.size();k++)
System.out.print(list.get(k)+",");
}
else if(OPERATION_RESULT.equals(in.toUpperCase())
||OPERATION_RESULT.substring(0, 1).equals(in.toUpperCase())){
//数学最高分,最低分,平均分
//首先要获得数学所有分数 存在一个数组里面
System.out.println("下列依次是数学,Java,大学计算机基础,英语的最高分: ");
int list[] = action.queryScore();
for (int k =0;k<list.length;k++)
System.out.print(list[k]+" ");
System.out.println("");
System.out.println("下列依次是数学,Java,大学计算机基础,英语的最低分: ");
int[] list1 = action.queryScore1();
for (int k =0;k<list1.length;k++)
System.out.print(list1[k]+" ");
System.out.println("");
System.out.println("下列依次是数学,Java,大学计算机基础,英语的平均分: ");
int[] list2 = action.queryScore2();
for (int j =0;j<list2.length;j++) {
System.out.print(list2[j]+" ");
} }
else if(OPERATION_BREAK.equals(in.toUpperCase())
||OPERATION_BREAK.substring(0, 1).equals(in.toUpperCase())){
step = 1;
pervious = null;
go = null;
System.out.println(CONTEXT);
}
else if (OPERATION_MAIN.equals(in.toUpperCase())
|| OPERATION_MAIN.substring(0, 1).equals(in.toUpperCase())) {
step = 1;
pervious = null;
go = null;
System.out.println(CONTEXT);
} else if(OPERATION_GET.equals(in.toUpperCase())
||OPERATION_GET.substring(0, 1).equals(in.toUpperCase())
||OPERATION_GET.equals(pervious)){
pervious=OPERATION_GET;
if(1==step){
System.out.println("请输入查询的学生学号:");
}else if(step>1){
Integer id=null;
Goddess g;
try {
id = Integer.valueOf(in);
try {
g = action.get(id);
if(g==null){
System.out.println("查询学生信息失败");
}else{
System.out.println(g.toString());
}
} catch (Exception e) {
System.out.println("查询学生信息失败");
}
} catch (Exception e) {
System.out.println("请输入正确的学生学号:");
}
}
step++;
}else if (OPERATION_QUERY.equals(in.toUpperCase())
|| OPERATION_QUERY.substring(0, 1).equals(in.toUpperCase())) {
List<Goddess> list = action.query();
for (Goddess god : list) {
System.out.println(god.toString1());
}
} else if (OPERATION_UPDATE.equals(in.toUpperCase())
|| OPERATION_UPDATE.substring(0, 1).equals(in.toUpperCase()) || OPERATION_UPDATE.equals(pervious)) {
pervious = OPERATION_UPDATE;
if (1 == step) {
System.out.println("请输入要修改的学生学号:");
} else if (2 == step) {
Integer id = null;
try {
id = Integer.valueOf(in);
try {
go = action.get(id);
if (go == null) {
System.out.println("查询学生信息失败");
step = 1;
}
} catch (Exception e) {
System.out.println("查询学生信息失败");
step = 1;
}
} catch (Exception e) {
System.out.println("请输入正确的学生学号:");
step = 1;
}
System.out.println("请输入新的学生信息[姓名],如果不修改该值,请输入-1:");
} else if (3 == step) {
if (-1 != Integer.valueOf(in)) {
go.setS_name(in);
}
System.out.println("请输入新的学生信息[数学成绩],如果不修改该值,请输入-1:");
} else if (4 == step) {
Integer math = null;
try {
math = Integer.valueOf(in);
if (-1 != math) {
go.setMath(math);
}
System.out.println("请输入新的学生信息[Java成绩],如果不修改该值,请输入-1:");
} catch (Exception e) {
step = 3;
System.out.println("请输入正确学生的信息[Java成绩]:");
}
} else if (5 == step) {
Integer java = null;
try {
if (-1 != Integer.valueOf(in)) {
java = Integer.valueOf(in);
go.setJava(java);
}
System.out.println("请输入新的学生信息[Com成绩],如果不修改该值,请输入-1:");
} catch (Exception e) {
step = 4;
System.out.println("请输入正确学生信息[Com成绩]:");
}
} else if (6 == step) {
Integer com = null;
if (-1 != Integer.valueOf(in)) {
com = Integer.valueOf(in);
go.setJava(com);
}
System.out.println("请输入新的学生信息[英语成绩],如果不修改该值,请输入-1:");
} else if (7 == step) {
Integer english = null;
if (-1 != Integer.valueOf(in)) {
english = Integer.valueOf(in);
go.setEnglish(english);
}
try {
action.edit(go);
} catch (Exception e) {
System.out.println("更新学生信息失败");
}
System.out.println("更新学生信息成功");
step = 1;
pervious = null;
}
if (OPERATION_UPDATE.equals(pervious)) {
step++;
}
} else if (OPERATION_DELETE.equals(in.toUpperCase())
|| OPERATION_DELETE.substring(0, 1).equals(in.toUpperCase()) || OPERATION_DELETE.equals(pervious)) {
pervious = OPERATION_DELETE;
if (1 == step) {
System.out.println("请输入要删除的学生学号:");
} else if (2 == step) {
Integer id = null;
try {
id = Integer.valueOf(in);
try {
action.del(id);
step = 1;
System.out.println("删除学生信息成功");
} catch (Exception e) {
System.out.println("删除学生信息失败");
}
} catch (Exception e) {
System.out.println("请输入正确的学生学号:");
step = 1;
}
}
if (OPERATION_DELETE.equals(pervious)) {
step++;
}
} else if (OPERATION_SEARCH.equals(in.toUpperCase())
|| OPERATION_SEARCH.substring(0, 1).equals(in.toUpperCase()) || OPERATION_SEARCH.equals(pervious)) {
pervious = OPERATION_SEARCH;
if(1==step){
System.out.println("请输入查询的学生姓名:");
}else if(step>1){
String name=null;
Goddess g;
try {
name = in;
try {
g = action.get(name);
if(g==null){
System.out.println("查询学生信息失败");
}else{
System.out.println(g.toString());
}
} catch (Exception e) {
System.out.println("查询学生信息失败");
}
} catch (Exception e) {
System.out.println("请输入正确的学生姓名:");
}
}
step++;
}
else if (OPERATION_QUERY.equals(in.toUpperCase())
|| OPERATION_QUERY.substring(0, 1).equals(in.toUpperCase())) {
try {
List<Goddess> list = action.query();
for (Goddess go1 : list) {
System.out.println(go1.getId() + ",姓名:" + go1.getS_name());
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if (OPERATION_ADD.equals(in.toUpperCase()) || OPERATION_ADD.substring(0, 1).equals(in.toUpperCase())
|| OPERATION_ADD.equals(prenious)) {
prenious = OPERATION_ADD;
// 新增学生
if (1 == step) {
System.out.println("请输入学生的[学号]");
} else if (2 == step) {
goddess.setId(Integer.valueOf(in));
System.out.println("请输入学生的[姓名]");
}
else if (3 == step) {
goddess.setS_name(in);
System.out.println("请输入学生的[数学成绩]");
} else if (4 == step) {
goddess.setMath(Integer.valueOf(in));
System.out.println("请输入学生的[java成绩]");
} else if (5 == step) {
goddess.setJava(Integer.valueOf(in));
System.out.println("请输入学生的[英语成绩]");
}
else if (6 == step) {
goddess.setEnglish(Integer.valueOf(in));
System.out.println("请输入学生的[计算机成绩]");
}
else if (7 == step) {
goddess.setCom(Integer.valueOf(in));
try {
action.add(goddess);
System.out.println("新增学生信息成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("新增学生信息失败");
}
}
if (OPERATION_ADD.equals(prenious)) {
step++;
}
}
else{
System.out.println("您输入的值为:"+in);
}
}
}
public static String getOperationMain() {
return OPERATION_MAIN;
}
public static String getOperationGet() {
return OPERATION_GET;
}
public static String getOperationBreak() {
return OPERATION_BREAK;
}
public static String getOperationSearch() {
return OPERATION_SEARCH;
}
public static String getOperationUpdate() {
return OPERATION_UPDATE;
}
public static String getOperationDelete() {
return OPERATION_DELETE;
}
public static String getOperationResult() {
return OPERATION_RESULT;
}
public static String getOperationComputer() {
return OPERATION_COMPUTER;
}
}
四、程序功能介绍
我们组课设题目是学生成绩管理系统,实现的功能相对来说比较熟悉!
简单的介绍一下:成绩管理系统首先得实现学生成绩的存储及查询,所以我们在代码中利用db包连接了数据库,这样就能实现此功能!一个程序就如同人一般,要各方面协调才能执行任务,我们程序利用各个包的协调联系实现一系列功能。利用action包中方法,db包中的数据,dao包中方法调用,view包最终实现界面显示!
五、主体内容介绍
①设计分析:在设计该课题过程中,我们组的大致思路是先设计出大致的框架,然后再进行填充,实现具体的功能!
③模块介绍
Action包和dao包:属于控制层,实现程序中方法的调用和方法的定义。
View包:实现界面显示,供用户查询,属于视图层。
Db包:实现数据库的连接,进行数据的操作,实现供用户查询的后台数据。
六、实验心得
本次课程设计,通过自己创造一个学生成绩管理系统,更加深刻的理解了JAVA程序编程语言,了解了设计一个程序是非常系统而又复杂的过程,每一个细节都要考虑到,都要仔细的敲,错一个标点符号都不行,要严谨而且细致,并且最重要的是让我亲身体验了这个过程,让我对创造一个程序每一个步骤和小细节都有了深刻的认识,更让我体验了自学,独自广泛涉猎,出现问题解决问题的过程,收获颇多,为以后的学习和深入研究打下了一个好的基础。
其次,这次课程设计让我们系统学习数据库知识,这对我们的编程能力有很大的提高。更为重要的是,这次课程设计是我们小组3人一起合力完成的,让我们深刻体会到团队合作的重要性。