前几天用集合作为临时容器写了一个简单的学生管理系统,但是毕竟数组不能真正作为数据库来长期存储,所以这次我就用MySQL数据库作为数据库来存数据,用java中jdbc来操作数据库。
工具:STS,MYSQL数据库。
实现思想:将整个系统分为三层
1.界面层(User Interface layer)
2.业务逻辑层(Business Logic Layer)
3.数据访问层(Data access layer)
创建实体对象,通过数据访问层来实现与数据库的交互,通过业务逻辑层来实现一些增删改查的方法,界面层实现与用户的交互,方便用户对其进行操作。
实现过程:
一、创建数据库,建表来存储学生对象,这里我使用mysql建立了一个mangerstore数据库,建了一个student表。里面存储的学生对象属性有学号,名字,年龄,性别
二、开始搭建我们的三层架构
1.界面层(User Interface layer)
2.业务逻辑层(Business Logic Layer)
3.数据访问层(Data access layer):
三、创建数据访问层(DAO层)
package com.xintouyun.sm.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;
public final class ConnectionFactory {
private static String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static String URL="jdbc:mysql:///mangerstore";
private static String USER = "root";
private static String PASSWORD = "123456";
static {
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
try {
return DriverManager.getConnection(URL, USER, PASSWORD);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public static void closeAll(ResultSet rs, Statement st, Connection conn) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (st != null)
st.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (conn != null)
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
package com.xintouyun.sm.dao;
import java.util.List;
import com.xintouyun.sm.entity.Student;
public interface StudentDao {
int save(Student student);
int delete(String studentNo);
Student queryStudentBySno(String sno);
int update(String studentNo,String name,int age,String sex);
List queryAll();
}
package com.xintouyun.sm.dao.impl;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import com.xintouyun.sm.dao.StudentDao;
import com.xintouyun.sm.entity.Student;
import com.xintouyun.sm.util.ConnectionFactory;
public class StudentDaoImpl implements StudentDao {
@Override
public int save(Student student) {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
int affectedRow = 0;
try {
conn = ConnectionFactory.getConnection();
st = conn.prepareStatement("insert into student (studentNo,name,sex,age) values(?,?,?,?)");
st.setString(1, student.getNum());
st.setString(2, student.getName());
st.setString(3, student.getSex());
st.setInt(4, student.getAge());
affectedRow = st.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeAll(rs, st, conn);
}
return affectedRow;
}
@Override
public Student queryStudentBySno(String studentNo) {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
Student student = null;
try {
conn = ConnectionFactory.getConnection();
st = conn.prepareStatement("select * from student where studentNo=?");
st.setString(1, studentNo);
rs = st.executeQuery();
while(rs.next()) {
student = new Student();
student.setName(rs.getString("name"));
student.setNum(rs.getString("studentNo"));
student.setAge(rs.getInt("age"));
student.setSex(rs.getString("sex"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeAll(rs, st, conn);
}
return student;
}
@Override
public List queryAll() {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
List students = new ArrayList<>();
try {
conn = ConnectionFactory.getConnection();
st = conn.prepareStatement("select * from student");
rs = st.executeQuery();
while(rs.next()) {
Student student = new Student();
student.setName(rs.getString("name"));
student.setNum(rs.getString("studentNo"));
student.setAge(rs.getInt("age"));
student.setSex(rs.getString("sex"));
students.add(student);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeAll(rs, st, conn);
}
return students;
}
@Override
public int delete(String studentNo) {
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
int affectedRow = 0;
try {
conn = ConnectionFactory.getConnection();
st = conn.prepareStatement("delete from student where studentNo=?");
st.setString(1,studentNo);
affectedRow = st.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeAll(rs, st, conn);
}
return affectedRow;
}
@Override
public int update(String studentNo, String name, int age, String sex) {
// TODO Auto-generated method stub
Connection conn = null;
PreparedStatement st = null;
ResultSet rs = null;
int affectedRow = 0;
try {
conn = ConnectionFactory.getConnection();
st = conn.prepareStatement("update student set name='"+name+"',age='"+age+"',sex='"+sex+"' where studentNo='"+studentNo+"'");
affectedRow = st.executeUpdate();
if(affectedRow>0) {
System.out.println("更新成功");
}else {
System.out.println("更新失败");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionFactory.closeAll(rs, st, conn);
}
return affectedRow;
}
}
package com.xintouyun.sm.entity;
public class Student {
private String name;
private String num;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
这样我们第一层,数据访问层就搭建好了,我们可以通过数据访问层与数据库进行连接。
四、创建业务逻辑层(Business Logic Layer)
1.业务层接口,定义业务方法
package com.xintouyun.sm.service;
import com.xintouyun.sm.entity.Student;
/**
*
* @author Jianghaoqiang
*
*/
public interface MangerStore {
/**
*添加学生方法
* @param student 对象为学生对象
* @return 添加成功返回true,添加失败返回false
*/
boolean addStudent(Student student);
/**
* 查找学生方法
* @param studentNo 根据学生学号查找
* @return 查找成功返回这个学生对象,查找失败返回null
*/
Student findStudent(String studentNo);
/**
* 删除学生方法
* @param studentNo 根据学生学号进行查找,然后删除
* @return 删除成功返回true,删除失败返回false
*/
boolean deleteStudent(String studentNo);
/**
* 修改学生信息方法
* @param studentNo 根据学生学号查找,然后修改信息
* @return 修改成功返回学生对象,修改失败返回null
*/
Student updateStudent(String studentNo,String name,String sex,int age);
/**
* 显示所有学生信息,包括姓名,学号,性别,年龄。
*/
void showAll();
}
2.业务层方法实现类
package com.xintouyun.sm.service.impl;
import java.util.Iterator;
import com.xintouyun.sm.dao.StudentDao;
import com.xintouyun.sm.dao.impl.StudentDaoImpl;
import com.xintouyun.sm.entity.Student;
import com.xintouyun.sm.service.MangerStore;
public class impl4 implements MangerStore{
private StudentDao studentDao = new StudentDaoImpl();
public boolean addStudent(Student student) {
return studentDao.save(student) > 0 ;
}
public Student findStudent(String studentNo) {
return studentDao.queryStudentBySno(studentNo);
}
public boolean deleteStudent(String studentNo) {
Student existStudent = findStudent(studentNo);
if(existStudent!=null) {
return studentDao.delete(studentNo) > 0;
}
return false;
}
public void showAll() {
Iterator it = studentDao.queryAll().iterator();
System.out.println("学号\t姓名\t年龄\t性别");
while(it.hasNext()) {
Student student = it.next();
System.out.println(student.getNum()+"\t"+student.getName()+"\t"+student.getAge()+"\t"+student.getSex());
}
}
@Override
public Student updateStudent(String studentNo, String name, String sex, int age) {
// TODO Auto-generated method stub
Student existStudent=findStudent(studentNo);
if(existStudent!=null) {
studentDao.update(studentNo, name, age, sex);
}
return null;
}
}
六、.创建界面层(User Interface layer)
创建客户端与用户进行交互:
package com.xintouyun.sm;
import java.util.Scanner;
import com.xintouyun.sm.entity.Student;
import com.xintouyun.sm.service.impl.impl4;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
impl4 data=new impl4();
String nextor="y";
System.out.println("-----------------欢迎使用学生管理系统-------------------");
do {
Scanner sc=new Scanner(System.in);
System.out.println("1.添加2.查找3.删除4.修改5.显示");
int i=0;
try {
i=sc.nextInt();
switch(i) {
case 1:
//Student s=new Student();
System.out.println("请输入学生学号");
String id=sc.next();
System.out.println("请输入学生年龄");
int age=sc.nextInt();
System.out.println("请输入学生姓名");
String name=sc.next();
System.out.println("请输入学生性别");
String sex=sc.next();
Student student=new Student();
student.setAge(age);
student.setName(name);
student.setNum(id);
student.setSex(sex);
boolean result=data.addStudent(student);
if(result) {
System.out.println("添加成功");
data.showAll();
}else {
System.out.println("添加失败");
}
break;
case 2:
System.out.println("请输入要查找的学生学号");
id=sc.next();
Student existStudent=data.findStudent(id);
if(existStudent!=null) {
System.out.println("查找到学生信息如下");
System.out.println(existStudent.getAge()+"\t"+existStudent.getName()+"\t"+existStudent.getNum()+"\t"+existStudent.getSex());
}else {
System.out.println("未查找到相关信息");
}
break;
case 3:
System.out.println("请输入要删除的学生学号");
id=sc.next();
result=data.deleteStudent(id);
if(result) {
System.out.println("删除成功");
data.showAll();
}else {
System.out.println("删除失败");
}
break;
case 4:
System.out.println("请输入要更新的学生学号");
id=sc.next();
System.out.println("请输入要更新的学生姓名");
String name1=sc.next();
System.out.println("请输入要更新的学生年龄");
int age1=sc.nextInt();
System.out.println("请输入要更新的学生性别");
String sex1=sc.next();
data.updateStudent(id, name1, sex1, age1);
break;
case 5:
data.showAll();
break;
}System.out.println("是否继续y/n");
nextor=sc.next();
}catch (Exception e) {
}
}while(nextor.equalsIgnoreCase("y"));
}
}
七、进行测试:
这里因为我的数据库中不是空的,我之前添加过数据,如果是第一次建立,数据库还是空的,要先添加几个学生,再进行其他几项操作,不然系统会出错。
这是我之前数据库中存放的五个学生对象,下面我们测试1.添加
好了添加功能测试完毕,测试2.查找:
查找功能测试完毕,我们来测试3.删除:
删除功能测试完毕,我们来测试4修改:
好了,这样我们的学生管理系统基本功能就实现了。