前几天用集合作为临时容器写了一个简单的学生管理系统,但是毕竟数组不能真正作为数据库来长期存储,所以这次我就用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层)
- 前面我们在使用JDBC时解决的都是一些很简单的问题,例如简单的增、删、改、查等等,所以直接把代码写在了main方法中。
- 这种写法很容易出现代码冗余、耦合度高、不能模块化开发等等诸多弊端,特别是将来我们做大型实战项目时该怎么办呢?这时业务会更加复杂。DAO模式就可以解决这个问题。
- DAO(Data Access Object)即:数据存取对象,它是位于业务逻辑和底层数据库之间,专门使用JDBC实现数据持久化的一种“套路”,通常称之为DAO模式
- 使用DAO模式进行项目开发主要有以下两个好处:
- 1. 隔离了业务逻辑代码和数据访问代码,分工明确,降低耦合性,提高可重用性。
- 2. 采用面向接口编程,提高了项目的可扩展性和可维护性。
- 一个典型的DAO模式主要有以下几部分组成:
- 1. 一个工厂类,主要负责创建和关闭Connection对象
-
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(); } } } } }
- 2. DAO接口,定义业务方法
-
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<Student> queryAll(); }
- 3. DAO实现类,实现DAO接口,完成具体功能
-
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<Student> queryAll() { Connection conn = null; PreparedStatement st = null; ResultSet rs = null; List<Student> 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; } }
- 4. 实体类,储存和传递数据
-
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 <Student> 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修改:
好了,这样我们的学生管理系统基本功能就实现了。