温馨提示,本篇文章中所写代码非常不规范,可以根据自己的需要对代码进行更改
有任何课程设计或者是毕业设计的问题都可询问
本文章的系统直接使用控制台输出,使用Mysql数据库存储,如果有需要使用文档文本进行存储可将Dao改为用Stream读取保存,需要使用其他数据库自行将驱动换成对应的驱动。
下载并导入JDBC驱动
image
如果速度太慢可考虑国内网站,版本号不需要在意
下载完成后解压缩,将jar包随便放在一个地方(最好是在项目中新建一个文件夹放置),然后导入jar包
eclipse导入,右键项目选择properties
idea导入,打开Project Structure
Project Structure
选择jar包
新建实体类
新建名为Student的类,代码如下
/**
* 学生类
* @author KartZan
*/
public class Student {
/** 学号 */
private int id;
/** 姓名 */
private String name;
/** 语文成绩 */
private int chnGrade;
/** 数学成绩 */
private int mathGrade;
/** 英语成绩 */
private int engGrade;
public Student() {
}
public Student(String name, int chnGrade, int mathGrade, int engGrade) {
this.name = name;
this.chnGrade = chnGrade;
this.mathGrade = mathGrade;
this.engGrade = engGrade;
}
public Student(int id, String name, int chnGrade, int mathGrade, int engGrade) {
this.id = id;
this.name = name;
this.chnGrade = chnGrade;
this.mathGrade = mathGrade;
this.engGrade = engGrade;
}
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 int getChnGrade() {
return chnGrade;
}
public void setChnGrade(int chnGrade) {
this.chnGrade = chnGrade;
}
public int getMathGrade() {
return mathGrade;
}
public void setMathGrade(int mathGrade) {
this.mathGrade = mathGrade;
}
public int getEngGrade() {
return engGrade;
}
public void setEngGrade(int engGrade) {
this.engGrade = engGrade;
}
@Override
public String toString() {
return "学号=" + id +
", 名称='" + name + '\'' +
", 语文成绩=" + chnGrade +
", 数学成绩=" + mathGrade +
", 英语成绩=" + engGrade
;
}
}
该类的属性可根据自己的需要修改,有属性变化记得改写toString()方法
新建数据库
新建一个名为dev的数据库,在dev数据库中新建一张名为student的表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`ID` int(0) NOT NULL AUTO_INCREMENT,
`NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`CHN_GRADE` int(0) NOT NULL,
`MATH_GRADE` int(0) NULL DEFAULT NULL,
`ENG_GRADE` int(0) NULL DEFAULT NULL,
PRIMARY KEY (`ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
新建完后的数据库结构如下:
数据库
编写JDBCUtil
要操作数据库总是手动的获取Connection是很麻烦的一件事情,所以我们需要编写一个JDBCUtil可以帮助我们快速的操作Connection。
新建一个JDBCUtil类
需要更改URL和PASSWORD为自己的数据库地址和密码,数据库装在自己电脑上的话一般地址为localhost
/**
* @author KartZan
*/
public class JDBCUtil {
private static final String URL = "jdbc:mysql://地址:3306/dev"; //FIXME !!!需要更改
private static final String USER = "root";
private static final String PASSWORD = "密码"; //FIXME !!!需要更改
private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
public static Connection getConn() {
try {
Class.forName(DRIVER);
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static void close(Connection connection){
try {
if(connection != null ){
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException();
}
}
}
编写Dao层
Dao层就是操作数据库的一层,本文章只实现了简单的增删改查功能,有需要可以自己添加功能
首先编写新增(插入)
public void insert(Student stu) {
Connection conn = JDBCUtil.getConn();
try {
String sql = "insert into student (`name`, chn_grade, math_grade, eng_grade) values (?, ?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, stu.getName());
pstmt.setInt(2, stu.getChnGrade());
pstmt.setInt(3, stu.getMathGrade());
pstmt.setInt(4, stu.getEngGrade());
pstmt.execute();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn);
}
}
如果你的数据库字段名和我的不一样,需要改成你自己的
然后是删除
public void delete(int id) {
Connection conn = JDBCUtil.getConn();
try {
String sql = "delete from student where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, id);
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn);
}
}
修改
public void update(Student stu) {
Connection conn = JDBCUtil.getConn();
try {
String sql = "update student set `name` = ?, chn_grade = ?, math_grade = ?, eng_grade = ? where id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, stu.getName());
pstmt.setInt(2, stu.getChnGrade());
pstmt.setInt(3, stu.getMathGrade());
pstmt.setInt(4, stu.getEngGrade());
pstmt.setInt(5, stu.getId());
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn);
}
}
最后是查询
public List<Student> search() {
Connection conn = JDBCUtil.getConn();
List<Student> list = new ArrayList<Student>();
try {
String sql = "select * from student";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
Student stu = new Student();
stu.setId(rs.getInt(1));
stu.setName(rs.getString(2));
stu.setChnGrade(rs.getInt(3));
stu.setMathGrade(rs.getInt(4));
stu.setEngGrade(rs.getInt(5));
list.add(stu);
}
return list;
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtil.close(conn);
}
return Collections.emptyList();
}
编写主程序入口
编写完Dao层以后,程序已经完成大半了,接下来只需要编写程序入口就完成了
新建一个Main类
如果看见在一些莫名其妙的地方出现sc.nextLine(),说明该地方需要清除回车符,nextLine()会读取回车导致我们不能正常输入数据
/**
* @author KartZan
*/
public class Main {
/** 程序退出标记 */
private static volatile boolean exitFlag = false;
/** 输入 */
private static Scanner sc = new Scanner(System.in);
/** Dao层 */
private static StudentDao dao = new StudentDao();
}
接下来我们需要一个打印菜单的方法:
private static void menu() {
System.out.println("1.查询学生名单");
System.out.println("2.新增学生");
System.out.println("3.修改学生信息");
System.out.println("4.删除学生");
System.out.println("0.退出");
}
以及调用Dao层方法的一个方法
private static void func(int i) {
switch (i) {
case 1: {
List<Student> list = dao.search();
for (Student stu : list) {
System.out.println(stu);
}
break;
}
case 2: {
Student student = getStudent(true);
dao.insert(student);
break;
}
case 3: {
Student student = getStudent(false);
dao.update(student);
break;
}
case 4: {
System.out.println("输入要删除的学生学号:");
dao.delete(sc.nextInt());
break;
}
case 0 : {
exitFlag = true;
break;
}
default: {
System.out.println("输入错误,重新输入");
break;
}
}
}
getStudent()方法为根据输入的数据生成Student实体类
private static Student getStudent(boolean isNew) {
int id = 0;
Student stu = null;
if (!isNew) {
System.out.println("输入学生对应学号:");
id = sc.nextInt();
}
sc.nextLine();
System.out.println("输入学生的名称:");
String name = sc.nextLine();
System.out.println("输入学生的语文成绩:");
int chnGrade = sc.nextInt();
System.out.println("输入学生的数学成绩:");
int mathGrade = sc.nextInt();
System.out.println("输入学生的英语成绩:");
int engGrade = sc.nextInt();
if (!isNew) {
stu = new Student(id, name, chnGrade, mathGrade, engGrade);
} else {
stu = new Student(name, chnGrade, mathGrade, engGrade);
}
return stu;
}
最后编写一个main函数,就大功告成啦!
public static void main(String[] args) {
while (!exitFlag) {
menu();
int choose = sc.nextInt();
func(choose);
}
}
来看一下最终的效果:
GIF 2021-8-16 22-29-41.gif