实训目的:让学生综合运用J2SE有关知识开发【学生信息管理系统】。主要涉及程序控制结构、面向对象编程、图形用户界面、Java数据库应用、MySQL数据库这几个方面的内容。通过本项目的开发,让学生了解系统开发的一般流程,初步了解MVC模式与单元测试,巩固所学的Java理论知识,提高Java数据库应用编程的基本技能。
项目说明:本实训案例教学,利用Java SE基本知识是开发【学生信息管理系统】。本系统包括登录注册、系统设置(设置学校信息、设置状态栏信息、修改用户密码)、数据操作(增加学生记录、编辑学生记录、删除学生记录、浏览学生记录)、查询学生(按学号查询、按姓名查询、按班级查询、按系部查询)、人数统计(按性别统计人数、按班级统计人数、按系部统计人数)等功能。
一、系统功能需求
1、可设置学校信息(学校名、校长、创立时间、联系电话、邮箱、通信地址、学校简况)
2、可设置状态栏信息(学校名、版本号、作者、联系电话、通信地址、邮箱)
3、登录与注册功能(用户:用户名、密码、联系电话、注册时间)
4、登录用户修改密码功能
5、对学生记录增加和修改(学生:学号、姓名、性别、年龄、系部、班级、联系电话)
6、查询:按学号、姓名、班级和系部进行查询
7、删除:按学号、班级、系部删除记录
8、统计:按性别、班级、系部统计人数
实训的项目已经看见,下面是我做的项目功能结构图
创建数据库
建表
1.t_college表
t_student表
t_status表
t_user表
数据库脚本
/*
Navicat Premium Data Transfer
Source Server : java_mysql
Source Server Type : MySQL
Source Server Version : 50562
Source Host : localhost:3306
Source Schema : student
Target Server Type : MySQL
Target Server Version : 50562
File Encoding : 65001
Date: 17/06/2019 15:22:51
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_college
-- ----------------------------
DROP TABLE IF EXISTS `t_college`;
CREATE TABLE `t_college` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学校名称',
`president` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '校长',
`start_time` timestamp NULL DEFAULT NULL COMMENT '建校时间',
`telephone` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`email` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电子邮箱',
`address` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通讯地址',
`profile` varchar(10000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '学校简介',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_college
-- ----------------------------
INSERT INTO `t_college` VALUES (1, '泸州职业技术学院', '贺元成', '2003-04-23 00:00:00', '3152608', 'lzy2003@lzy.com', '泸州市江阳区瓦窑坝',
' 泸州职业技术学院是经四川省人民政府批准、国家教育部备案的综合性公办普通高等学校,占地面积655.1亩,按照新校区建设规划占地面积将达到1500亩左右,
是省级园林式单位、市级文明单位。2011年批准为四川省示范高职院校建设单位。 \n\n 学院现有商学院、机械工程系、电子工程系、建筑工程系、信息工程系、
人文社科系、外语系、艺术系、基础部、思政教研部等十个教学单位。开办机械、土建、商务、电子信息、生物工程、财经、旅游、文化教育等类别的高职专科教育专业35个,
拥有各类在校生8000多人。\n \n 一、悠久的办学历史和鲜明的办学特色\n\n 学院荟萃着光荣传统、优良校风和丰富的高等教育办学经验,其前身可以追溯
到创建于1901年的川南经纬学堂。学院坚持“瞄准社会需求,培养创业技能,造就优秀人才”的办学理念和“传承百年文化、服务地方产业、助推区域发展”的办学思路,弘扬
“自强不息,勤奋敬业”校训精神,实施“质量立校,文化塑校,人才强校”发展战略,形成了“四合四共”(合作办学、合作育人、合作就业、合作发展,人才共育、过程共管、
成果共享、责任共担)的“政园企校”四方共建机制,逐步完善了“五位一体”(校地发展共生一体、校企合作产教一体、专业产业对接一体、人才培养工学一体、技术研发校企
一体)办学模式,主动适应地方经济社会发展需要,以服务为宗旨、就业为导向,走产学研结合之路,培养高素质技能型人才。\n\n 二、雄厚的师资力量和完备的
教学设施\n\n 学院现有教职工509人,其中专任教师388人;专任教师中,教授9人,副教授83人,高级工程师、高级实验师等其他高级职称9人,具有博士、硕士学位
人员201人,长驻外籍教师2人;拥有省级突出贡献专家1人,省级学术和技术带头人后备人选1人;市级学术和技术带头人3人,市级学术和技术带头人后备人选2人,泸州市
拔尖人才3人,泸州市“知名教师”13人;学院学科带头人7人,专业带头人19人,中青年骨干教师41人;程序员、工程师、建造师等各类“双师型”教师182人;省级优秀教学团队
2个,院级优秀教学团队11个;建立了由200多名行业企业专家、经理、技术能手组成的兼职教师资源库。\n\n 学院拥有现代化图书馆藏书42.5万余册,数字资源10TB;
建有人文艺术中心、工程实训中心、玉阶素质教育基地、标准田径运动场、网球场等完备的教育教学设施;建有中央财政支持的电工电子与自动化国家级实训基地,拥有实验室、
实训室178间,生产性实训基地6个,校外实习实训基地93个。\n\n 三、丰硕的科研成果和良好的社会服务\n\n 学院完成科技部项目1项,现有省级项目27项,
市级项目104项,院级项目112个,横向委托项目22项;获省级教学成果奖1项、省级教育科研成果奖16项、市级科技进步奖5项、市级哲学社会科学成果奖33项;院级教学成果奖
11项;教师共发表核心期刊论文160余篇,其中《机械工程学报》等一级期刊论文6篇,EI和ISTP收录11篇;教师获专利10项;拥有省级精品课程5门,省级教改项目9项,省级
精品教材建设项目1项;院级精品课程51门,院级教改项目93项。\n \n 学院是国家职业技能鉴定站的挂牌单位,能承担机械及制造、电子电工、建筑、管理及服务、
计算机及信息、教师职业技能等8大类别的68种职业技能鉴定。学院立足泸州、面向四川、辐射滇黔渝,积极开展继续教育和职业培训,是“省委组织部大学生村干部创业培训
基地”、“四川省乡村旅游实用人才开发示范单位”、“泸州市白酒产业高技能人才培养基地”、“泸州市装备制造业高技能人才培养基地”、“泸州市现代服务业高技能人才培养基地”、
“市委组织部农村基层干部培训基地”。近年来,承担各类社会培训200多项近30000人次。\n\n 四、优异的竞赛成绩和畅通的就业渠道\n\n 2007年以来,学院
学生先后在Honda中国节能竞技大赛、全国电子专业人才设计与技能大赛、全国高校市场营销大赛、全国旅游院校服务技能大赛等国家级技能大赛和四川省大学生电子设计大赛、
四川省大学生旅游艺术设计大赛等省级技能大赛中获奖270余人次。\n \n 我院与泸州老窖集团、四川郎酒集团、四川邦立重机有限责任公司、宜宾五粮液集团、
宜宾丝丽雅集团、Intel公司、富士康科技集团、康佳集团、格力电器、中铁五局、中建八局、华西集团等1000多家企业开展就业合作关系,建立起了以泸州及成渝经济区为主,
包含珠三角、长三角地区在内的就业网络,形成了畅通的就业渠道,为毕业生提供可靠的就业保障,毕业生就业率连续6年保持在97%以上。');
-- ----------------------------
-- Table structure for t_status
-- ----------------------------
DROP TABLE IF EXISTS `t_status`;
CREATE TABLE `t_status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`college` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '学校名称',
`version` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '系统版本',
`author` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '作者',
`telephone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`address` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '通讯地址',
`email` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_status
-- ----------------------------
INSERT INTO `t_status` VALUES (1, '泸职院', 'V1.0', '华卫', '15892921170', '泸职院信息工程系', 'maths007@163.com');
-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student` (
`id` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '学号',
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
`sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '性别',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
`department` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '系部',
`class` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '班级',
`telephone` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_student
-- ----------------------------
INSERT INTO `t_student` VALUES ('10080301', '陈刚', '男', 20, '外语系', '10英教1班', '13934345678');
INSERT INTO `t_student` VALUES ('10080302', '李煜', '男', 19, '外语系', '10英教1班', '13989896656');
INSERT INTO `t_student` VALUES ('10080303', '钟磊', '女', 20, '外语系', '10英教1班', '13867674534');
INSERT INTO `t_student` VALUES ('10080804', '吴欣', '女', 20, '外语系', '10英教1班', '13956561123');
INSERT INTO `t_student` VALUES ('11040201', '李阳', '男', 19, '建筑系', '11建工1班', '13978561130');
INSERT INTO `t_student` VALUES ('11040202', '陈洁', '女', 20, '建筑系', '11建工1班', '13978564530');
INSERT INTO `t_student` VALUES ('11040203', '吴刚', '男', 19, '建筑系', '11建工1班', '13978234530');
INSERT INTO `t_student` VALUES ('11040204', '吴灵', '女', 19, '建筑系', '11建工1班', '13878234530');
INSERT INTO `t_student` VALUES ('11080301', '武陵', '男', 19, '外语系', '11英教1班', '13567671130');
INSERT INTO `t_student` VALUES ('11080302', '王菲', '女', 20, '外语系', '11英教1班', '13567981123');
INSERT INTO `t_student` VALUES ('11080303', '陈俊', '男', 20, '外语系', '11英教1班', '13945455656');
INSERT INTO `t_student` VALUES ('11080304', '向刚', '男', 19, '外语系', '11英教1班', '13978781130');
INSERT INTO `t_student` VALUES ('11080305', '李文', '女', 20, '外语系', '11英教1班', '13978381130');
INSERT INTO `t_student` VALUES ('11080306', '吴刚', '男', 19, '外语系', '11英教1班', '15878381130');
INSERT INTO `t_student` VALUES ('11080307', '陈宇', '男', 20, '外语系', '11英教1班', '12878381130');
INSERT INTO `t_student` VALUES ('11080308', '华晨', '男', 19, '外语系', '11英教1班', '13978381130');
INSERT INTO `t_student` VALUES ('11090701', '李强', '男', 20, '信息工程系', '11软件2班', '13890901120');
INSERT INTO `t_student` VALUES ('11090702', '张红', '女', 20, '信息工程系', '11软件2班', '13834341128');
INSERT INTO `t_student` VALUES ('11090703', '文雯', '女', 19, '信息工程系', '11软件2班', '13956756567');
INSERT INTO `t_student` VALUES ('11090704', '吴刚', '男', 19, '信息工程系', '11软件2班', '13844455678');
INSERT INTO `t_student` VALUES ('15012456', '李玉仙', '女', 18, '信息工程系', '15软件1班', '15890904567');
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户名',
`password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户密码',
`telephone` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '联系电话',
`register_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '注册时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, '李刚', '123', '15888781123', '2012-05-21 09:26:10');
INSERT INTO `t_user` VALUES (2, '王霞', '123244', '13990901140', '2012-06-08 12:49:27');
INSERT INTO `t_user` VALUES (3, '段誉', '123', '12345678907', '2012-06-08 12:50:23');
INSERT INTO `t_user` VALUES (4, 'admin', '12345', '13989891123', '2012-06-08 16:52:26');
INSERT INTO `t_user` VALUES (5, '李红', '222222', '15888781123', '2012-06-08 16:53:17');
INSERT INTO `t_user` VALUES (6, 'browser', '11111', '13853452232', '2012-06-11 12:55:46');
INSERT INTO `t_user` VALUES (7, 'operater', '22222', '1234567890', '2012-06-11 12:55:36');
INSERT INTO `t_user` VALUES (8, '王平', '33333', '1234500000', '2012-06-11 12:57:54');
SET FOREIGN_KEY_CHECKS = 1;
创建java项目
创建项目名
在项目名里创建文件夹
help:帮助文档存放处
lib:连接MySQL数据库的jar包
message:一些图片,用于装饰程序
在src目录里创建net.hw.student.bean包
bean:存放实体类
在bean包里创建四个实体类分别和数据库的表一一对应
例如创建College实体类对应数据库的t_college表
然后按住Alt+Ins弹出生成菜单
至于笔记本ins键有些品牌可能设计在数字键盘上,切换方法就是先按Numlk键屏蔽数字键盘再执行操作
弹出的全部勾上执行成功会出现如下代码
public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPresident() { return president; } public void setPresident(String president) { this.president = president; } public Date getStartTime() { return startTime; } public void setStartTime(Date startTime) { this.startTime = startTime; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getProfile() { return profile; } public void setProfile(String profile) { this.profile = profile; }
再调出菜单选择toString()
然后全勾上
成功会出现如下代码
@Override public String toString() { return "College{" + "id=" + id + ", name='" + name + '\'' + ", president='" + president + '\'' + ", startTime=" + startTime + ", telephone='" + telephone + '\'' + ", email='" + email + '\'' + ", address='" + address + '\'' + ", profile='" + profile + '\'' + '}'; }
至此College实体类创建成功
之后的三个实体类创建过程和之前的一样
最终图
数据库连接管理类ConnectionManager
package net.hw.student.dbutil; import javax.swing.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 功能:数据库连接管理类 * 作者:龚敬 * 日期:2019年6月26日 */ public class ConnectionManager { /** * 数据库驱动程序 */ private static final String DRIVER = "com.mysql.jdbc.Driver"; /** * 数据库统一资源标识符 */ private static final String URL = "jdbc:mysql://localhost:3306/student"; /** * 数据库用户 */ private static final String USER = "root"; /** * 数据库密码 */ private static final String PASSWORD = "200024"; /** * 私有化构造方法,拒绝实例化 */ private ConnectionManager() { } /** * 获取数据库连接静态方法 * * @return 数据库连接对象 */ public static Connection getConnection() { // 定义数据库连接 Connection conn = null; try { // 安装数据库驱动程序 Class.forName(DRIVER); // 获取数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } // 返回数据库连接 return conn; } /** * 关闭数据连接静态方法 * * @param conn */ public static void closeConnection(Connection conn) { // 判断数据库连接是否非空 if (conn != null) { try { // 判断连接是否未关闭 if (!conn.isClosed()) { // 关闭数据库连接 conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } /** * 主方法:测试两个静态方法 * * @param args */ public static void main(String[] args) { // 获取数据库连接 Connection conn = getConnection(); // 判断数据库连接是否成功 if (conn != null) { JOptionPane.showMessageDialog(null, "恭喜,数据库连接成功!"); } else { JOptionPane.showMessageDialog(null, "遗憾,数据库连接失败!"); } // 关闭数据库连接 closeConnection(conn); } }
运行程序看是否能够连接数据库
数据访问接口
DAO: Data Acess Object
系统有四张表:College、Status、Student与User表,对这四张表的操作就在相应的数据访问接口里进行规定,有四个数据访问接口:CollegeDao、StatusDao、StudentDao与UserDao。注意,这些接口要放到dao子包里。
对应的代码
1:
package net.hw.student.dao; import net.hw.student.bean.College; /** * 功能:学校数据访问接口 * 作者:龚敬 * 日期:2019年6月26日 */ public interface CollegeDao { College findById(int id); int update(College college); }
2:
package net.hw.student.dao; import net.hw.student.bean.Status; /** * 功能:状态数据访问接口 * 作者:龚敬 * 日期:2019年6月26日 */ public interface StatusDao { Status findById(int id); int update(Status status); }
3:
package net.hw.student.dao; import net.hw.student.bean.Student; import java.util.List; import java.util.Vector; /** * 功能:学生数据访问接口 * 作者:龚敬 * 日期:2019年6月26日 */ public interface StudentDao { int insert(Student student); int deleteById(String id); int deleteByClass(String clazz); int deleteByDepartment(String department); int update(Student student); Student findById(String id); List<Student> findByName(String name); List<Student> findByClass(String clazz); List<Student> findByDepartment(String department); List<Student> findAll(); Vector findRowsBySex(); Vector findRowsByClass(); Vector findRowsByDepartment(); }
4:
package net.hw.student.dao; import net.hw.student.bean.User; import java.util.List; /** * 功能:用户数据访问接口 * 作者:龚敬 * 日期:2019年6月26日 */ public interface UserDao { int insert(User user); int deleteById(int id); int update(User user); User findById(int id); List<User> findAll(); User login(String username, String password); }
数据访问接口实现类
在dao子包里创建impl子包,然后在里面创建四个数据访问接口的实现类。
学校数据访问接口实现类CollegeDaoImpl
package net.hw.student.dao.impl; import net.hw.student.bean.College; import net.hw.student.dao.CollegeDao; import net.hw.student.dbutil.ConnectionManager; import java.sql.*; /** * 功能:学校数据访问接口实现类 * 作者:龚敬 * 日期:2019年6月26日 */ public class CollegeDaoImpl implements CollegeDao { @Override public College findById(int id) { // 声明学校对象 College college = null; // 1. 获取数据库连接 Connection conn = ConnectionManager.getConnection(); // 2. 定义SQL字符串 String strSQL = "select * from t_college where id = ?"; try { // 3. 创建预备语句对象 PreparedStatement pstmt = conn.prepareStatement(strSQL); // 4. 设置占位符的值 pstmt.setInt(1, id); // 5. 执行SQL,返回结果集 ResultSet rs = pstmt.executeQuery(); // 6. 判断结果集是否有记录 if (rs.next()) { // 实例化学校对象 college = new College(); // 利用当前记录字段值去设置学校对象的属性 college.setId(rs.getInt("id")); college.setName(rs.getString("name")); college.setPresident(rs.getString("president")); college.setStartTime(rs.getDate("start_time")); college.setTelephone(rs.getString("telephone")); college.setEmail(rs.getString("email")); college.setAddress(rs.getString("address")); college.setProfile(rs.getString("profile")); } // 7. 关闭预备语句对象 pstmt.close(); // 8. 关闭结果集对象 rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 ConnectionManager.closeConnection(conn); } // 返回学校对象 return college; } @Override public int update(College college) { // 定义更新记录数 int count = 0; // 1. 获取数据库连接 Connection conn = ConnectionManager.getConnection(); // 2. 定义SQL字符串 String strSQL = "update t_college set name = ?, president = ?, start_time = ?," + " telephone = ?, email = ?, profile = ? where id = ?"; try { // 3. 创建预备语句对象 PreparedStatement pstmt = conn.prepareStatement(strSQL); // 4. 设置占位符的值 pstmt.setString(1, college.getName()); pstmt.setString(2, college.getPresident()); pstmt.setTimestamp(3, new Timestamp(college.getStartTime().getTime())); pstmt.setString(4, college.getTelephone()); pstmt.setString(5, college.getEmail()); pstmt.setString(6, college.getProfile()); pstmt.setInt(7, college.getId()); // 5. 执行SQL,返回更新记录数 count = pstmt.executeUpdate(); // 6. 关闭预备语句对象 pstmt.close(); } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭数据库连接 ConnectionManager.closeConnection(conn); } // 返回更新记录数 return count; } }