需求分析:
一、语言和环境
A、实现语言:Java
B、环境要求:JDK 8.0、Eclipse 、MySQL 5.6
二、功能要求
学校即将举办第五届春季运动会,为更方便管理报名信息,现要求开发基于控制台的学校运动会报名系统。具体要求如下:
1.主菜单:显示系统主菜单,每执行完一项功能后菜单循环显示,如图1所示,菜单功能包括:
1) 学生报名
2) 按比赛项目查询
3) 按班级查询
4) 取消报名
5) 退出系统
2.学生报名:输入学生姓名、年龄、班级号、报名项目编号,正确录入以上信息后,显示“报名成功!”。
3.按比赛项目查询:提示选择要查询的比赛项目,查询出相关学生信息,包括项目名、姓名、班级、年龄。
4.按班级查询:提示选择要查询的班级,查询出相关学生信息,包括项目名、姓名、班级、年龄。
5.取消报名:提示输入要取消报名的学生姓名,从报名信息表中删除该学生记录。成功后提示“取消报名成功!”
6.退出系统:提示“谢谢使用!”后退出系统
三、具体要求及推荐实现步骤
1.创建数据库表apply_info,添加测试数据不少于4条,表结构如表1所示。
系统目录结构如下图所示:
2.创建实体类ApplyInfo,根据业务提供需要的构造方法和setter/getter方法。
1 package top.hinux.entity; 2 3 /** 4 * <p>报名信息实体类</p> 5 * @author HSH 6 * 7 */ 8 public class ApplyInfo { 9 10 private int applyId;//编号 11 private String name;//姓名 12 private int age;//年龄 13 private String className;//班级 14 private String game;//比赛项目 15 16 17 /** 18 * 生成构造方法 19 * @param applyId 20 * @param name 21 * @param age 22 * @param className 23 * @param game 24 */ 25 public ApplyInfo(String name, int age, String className, String game) { 26 this.name = name; 27 this.age = age; 28 this.className = className; 29 this.game = game; 30 } 31 32 33 //生成get(),set() 方法。 34 public int getApplyId() { 35 return applyId; 36 } 37 public void setApplyId(int applyId) { 38 this.applyId = applyId; 39 } 40 public String getName() { 41 return name; 42 } 43 public void setName(String name) { 44 this.name = name; 45 } 46 public int getAge() { 47 return age; 48 } 49 public void setAge(int age) { 50 this.age = age; 51 } 52 public String getClassName() { 53 return className; 54 } 55 public void setClassName(String className) { 56 this.className = className; 57 } 58 public String getGame() { 59 return game; 60 } 61 public void setGame(String game) { 62 this.game = game; 63 } 64 65 66 @Override 67 public String toString() { 68 return "ApplyInfo [applyId=" + applyId + ", name=" + name + ", age=" + age + ", className=" + className 69 + ", game=" + game + "]"; 70 } 71 72 73 74 }
3.创建JDBCTools类,实现数据库连接和关闭功能。
1 package top.hinux.dao; 2 3 import java.io.IOException; 4 5 import java.io.InputStream; 6 import java.sql.Connection; 7 import java.sql.DriverManager; 8 import java.sql.PreparedStatement; 9 import java.sql.ResultSet; 10 import java.sql.SQLException; 11 import java.sql.Statement; 12 import java.util.Properties; 13 14 15 /** 16 * <p>实现数据库连接和关闭功能</p> 17 * @author Administrator 18 * 19 */ 20 public class JDBCTools { 21 22 private static String driver; 23 private static String url; 24 private static String user; 25 private static String password; 26 private static Connection conn; 27 private JDBCTools(){ 28 29 } 30 static { 31 InputStream in=DBUtils.class.getResourceAsStream("/db.properties"); 32 Properties pro=new Properties(); 33 try { 34 pro.load(in); 35 driver=pro.getProperty("driver"); 36 url=pro.getProperty("url"); 37 user=pro.getProperty("user"); 38 password=pro.getProperty("password"); 39 Class.forName(driver); 40 conn=DriverManager.getConnection(url,user,password); 41 } catch (IOException e) { 42 e.printStackTrace(); 43 System.out.print("配置文件加载失败!"); 44 } catch (ClassNotFoundException e) { 45 e.printStackTrace(); 46 } catch (SQLException e) { 47 e.printStackTrace(); 48 } 49 } 50 51 public static Connection getConnection() { 52 try { 53 if (conn == null || conn.isClosed()) 54 conn = DriverManager.getConnection(url, user, password); 55 } catch (SQLException e) { 56 e.printStackTrace(); 57 } 58 return conn; 59 } 60 public static void close(){ 61 colse(null,null); 62 } 63 public static void close(Statement stm){ 64 colse(null,stm); 65 } 66 public static void colse(ResultSet rs, Statement stm){ 67 if(rs!=null){ 68 try { 69 rs.close(); 70 } catch (SQLException e) { 71 e.printStackTrace(); 72 } 73 } 74 if(stm!=null){ 75 try { 76 stm.close(); 77 } catch (SQLException e) { 78 e.printStackTrace(); 79 } 80 } 81 } 82 83 public static void colse(PreparedStatement sta) { 84 85 } 86 }
创建DBUtils类,写通用的增删改查的方法。
package top.hinux.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import top.hinux.entity.ApplyInfo; /** * <p>写通用的增删改查的方法。</p> * @author HSH * */ public class DBUtils { /** * <p>插入数据</p> * @param applyinfo * @return */ public static int insert(ApplyInfo applyinfo) { Connection conn = JDBCTools.getConnection(); int i = 0; String sql = "insert into Apply_Info (Name,Age,class,Game) values(?,?,?,?)"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); pstmt.setString(1, applyinfo.getName()); pstmt.setLong(2, applyinfo.getAge()); pstmt.setString(3, applyinfo.getClassName()); pstmt.setString(4, applyinfo.getGame()); i = pstmt.executeUpdate(); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return i; } /** * <p>删除记录</p> * @param sql * @param args */ public static int delete(String name) { Connection conn = JDBCTools.getConnection(); int i = 0; String sql = "delete from Apply_Info where Name='" + name + "'"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); i = pstmt.executeUpdate(); //System.out.println("resutl: " + i); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return i; } /** * <p>修改记录</p> * @param sql * @param args */ public static int update(ApplyInfo applyinfo) { Connection conn = JDBCTools.getConnection(); int i = 0; String sql = "update apply_info set Age='" + applyinfo.getAge() + "' where Name='" + applyinfo.getName() + "'"; PreparedStatement pstmt; try { pstmt = (PreparedStatement) conn.prepareStatement(sql); i = pstmt.executeUpdate(); System.out.println("resutl: " + i); pstmt.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } return i; } /** * <p>查询记录</p> * @param sql * @param args */ public static Integer getTableInfo(String sql,Object...prarm) { Connection conn = JDBCTools.getConnection(); PreparedStatement pstmt; try { pstmt = (PreparedStatement)conn.prepareStatement(sql); if (prarm!=null) { for (int i = 0; i <prarm.length ; i++) { pstmt.setObject(i+1,prarm[i]); } } ResultSet rs = pstmt.executeQuery(); int col = rs.getMetaData().getColumnCount(); System.out.println("============================================"); System.out.println("编号 姓名 年龄 班级 项目"); while (rs.next()) { for (int i = 1; i <= col; i++) { System.out.print(rs.getString(i) + " "); if ((i == 2) && (rs.getString(i).length() < 8)) { // System.out.print(" "); // System.out.println("aaa"); } } System.out.println(""); } System.out.println("============================================"); } catch (SQLException e) { e.printStackTrace(); } return null; } }
4.创建DAO接口ApplyInfoDao,定义学生报名,按班级查询,按比赛项目,取消报名的方法。
1 package top.hinux.service; 2 3 import top.hinux.entity.ApplyInfo; 4 5 /** 6 * 定义学生报名,按班级查询,按比赛项目,取消报名的方法。 7 * @author Administrator 8 * 9 */ 10 public interface ApplyInfoDao { 11 /** 12 * <p>定义学生报名</p> 13 */ 14 void studentReg(ApplyInfo appinfo); 15 /** 16 * <p>按班级查询</p> 17 */ 18 void selectClass(String sql,String ClassName); 19 /** 20 * <p>按比赛项目查询</p> 21 */ 22 void selectGame(String sql,String game); 23 /** 24 * <p>取消报,</p> 25 */ 26 void removeMessage(String name); 27 }
5.创建DAO实现类ApplyInfoDaoImpl,实现ApplyInfoDao接口,使用JDBC完成相应数据库操作。
1 package top.hinux.utils; 2 3 import top.hinux.dao.DBUtils; 4 import top.hinux.entity.ApplyInfo; 5 import top.hinux.service.ApplyInfoDao; 6 7 public class ApplyInfoDaoImpl implements ApplyInfoDao{ 8 9 @Override 10 public void studentReg(ApplyInfo appinfo) { 11 // TODO Auto-generated method stub 12 DBUtils.insert(appinfo); 13 System.out.println("信息插入成功!"); 14 } 15 16 @Override 17 public void selectClass(String sql,String ClassName) { 18 // TODO Auto-generated method stub 19 DBUtils.getTableInfo(sql, ClassName); 20 } 21 22 @Override 23 public void selectGame(String sql,String game) { 24 // TODO Auto-generated method stub 25 DBUtils.getTableInfo(sql, game); 26 } 27 28 @Override 29 public void removeMessage(String name) { 30 // TODO Auto-generated method stub 31 DBUtils.delete(name); 32 } 33 34 }
6.创建ApplyMgr类,完成在控制台的报名信息操作,启动和运行系统。
package top.hinux.utils; import java.util.Scanner; import top.hinux.entity.ApplyInfo; /** * <p>完成在控制台的报名信息操作,启动和运行系统。</p> * @author HSH * */ public class ApplyMgr { //菜单数组 private static String[] munu = { "1、学生报名", "2、按比赛项目查询", "3、按班级查询", "4、取消报名", "5、退出系统" }; //班级列表 private static String[] classNames = { "一班", "二班", "三班" }; //运动会项目列表 private static String[] games = { "跳远", "接力跑", "跳绳" }; // 取消报名 public static void dropUser() { Scanner sc = new Scanner(System.in); System.out.println("请输入您的名字:"); String userName = sc.next(); System.out.println("*********************正在取消报名*****************"); //生成ApplyInfoDaoImpl对象 ApplyInfoDaoImpl apdi = new ApplyInfoDaoImpl(); apdi.removeMessage(userName); System.out.println(userName + "取消报名成功!"); } // 按班级查询 public static void selectClass() { Scanner sc = new Scanner(System.in); System.out.println(" 请选择您的班级,输入编号:(1、一班,2、二班,3、三班)"); int className = sc.nextInt(); System.out.println("正在按照班级信息查询!"); System.out.println("********************"); System.out.println("按班级信息查询结果如下:"); //生成ApplyInfoDaoImpl对象 ApplyInfoDaoImpl apdi = new ApplyInfoDaoImpl(); String sql = "select *from Apply_Info where class=?"; apdi.selectClass(sql, classNames[className-1]); } // 查询比赛项目 public static void selectGame() { Scanner sc = new Scanner(System.in); System.out.println("请选择您的项目,输入编号:(1、跳远,2、接力跑,3、跳绳)"); int game = sc.nextInt(); System.out.println("正在按照比赛项目信息查询!"); System.out.println("********************"); System.out.println("按比赛项目信息查询结果如下:"); //生成ApplyInfoDaoImpl对象 ApplyInfoDaoImpl apdi = new ApplyInfoDaoImpl(); String sql ="select *from Apply_Info where game=?"; apdi.selectGame(sql, games[game-1]); } /** * <p> * 学生报名 * </p> * @author HSH */ public static void regUser() { try { Scanner sc = new Scanner(System.in); System.out.println("请输入姓名:"); String userName = sc.next(); System.out.println("请输入您的年龄:"); int age = sc.nextInt(); System.out.println(" 请选择您的班级,输入编号:(1、一班,2、二班,3、三班)"); int className = sc.nextInt(); System.out.println("请选择您的项目,输入编号:(1、跳远,2、接力跑,3、跳绳)"); int game = sc.nextInt(); System.out.println("user:" + userName + " age:" + age + " className:" + classNames[className - 1] + " game:" + games[game-1]); // 在此处写报名数据存取操作 ApplyInfo ai = new ApplyInfo( userName, age, classNames[className-1], games[game-1]); //生成ApplyInfoDaoImpl对象 ApplyInfoDaoImpl apdi = new ApplyInfoDaoImpl(); apdi.studentReg(ai); } catch (Exception e) { // TODO Auto-generated catch block //e.printStackTrace(); System.out.println("信息输入格式不正确!请重新输入!"); } } /** * <p> * 显示菜单 * <p> * * @author HSH */ public static void showMune() { System.out.println("*********************************************"); System.out.println("**** 欢迎进入运动会报名系统 ****"); for (String string : munu) { System.out.print(string + " "); } System.out.println(); System.out.println("*********************************************"); } /** * <p> * 退出系统成功 * </p> * * @author HSH */ public static void exitSys() { System.out.println("退出系统成功!"); } }
7.创建主类(Manager)用于实现系统整体流程
package top.hinux; import java.util.Scanner; import top.hinux.utils.ApplyMgr; public class Manager { /** * <p> 程序主函数,实现系统功能</p> * @author HSH * @param args */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); ApplyMgr.showMune(); while (true) { try { System.out.println("请输入您要办理的业务!"); int select = sc.nextInt(); switch (select) { case 1: ApplyMgr.regUser();//学生报名 break; case 2: ApplyMgr.selectGame();//查询比赛项目 break; case 3: ApplyMgr.selectClass();// 按班级查询 break; case 4: ApplyMgr.dropUser();//取消报名 break; case 5: ApplyMgr.exitSys();//退出系统 return; default: System.out.println("输入错误!"); } } catch (Exception e) { //e.printStackTrace(); sc.nextLine(); System.out.println("信息输入错误,请重新输入:"); } ApplyMgr.showMune(); } } }