概述
目录
班级表设计
学生表设计
结构设计
bean实体层
dao数据库操作层
FuncServeInte接口
StudentServiceInte接口
ClassesDaoInte接口
service业务操作层
FuncServeInte接口
StudentServiceInte接口
ClassesServiceInte接口
servlet控制中转层
班级表设计
因为学生与班级的关系是n:1,也就是说,学生表中需要有班级外键,所以需要先设计班级表。
在表中,id是自动递增的主键;name设置成unique唯一索引。
学生表设计
学生表中需要有外键class_id。
在表中,id是自动递增的主键;class_id是外键。
结构设计
采取的是分层设计,将dao层(数据库操作层)、service层(业务操作层)、servlet层(控制中转层)作为三层结构,除此之外,还有bean层(实体对象层)、util层(工具类层)、test层(测试功能层)。
下面来思考一下如何设计结构:
bean实体层
两个实体,Student(学生实体)和Classes(班级实体)
每个实体需要实现Serializable接口(序列化接口)。
那么目前就可以写出:
public class Student implements Serializable{ ... }
public class Classes implements Serializable{ ... }
但是之后的设计中还会在此层中添加一个Bean接口,这是多态的一种小的运用。
dao数据库操作层
学生管理系统,需要连接数据库,连接之后进行SQL操作来实现想要实现的功能,关于数据库的连接可以放在一个专门的工具类中实现,可以稍微提升代码的灵活度(如果要换数据库,只需要改变工具类即可,而不用更改dao层中的代码。
所以我在utils层中第一个添加的工具类是JDBCUtils类。
下面要根据功能来设计dao层中的接口以及规范的方法。
管理学生的基础功能包含有:添加学生、学生列表、删除学生、修改学生、按条件查询学生;
管理班级的基础功能也类似:添加班级、班级列表、删除班级、修改班级。
可以很容易发现,其实这些的功能都是很相似的,那么就意味着可以使用接口来规定某些共同的方法。
所以我定义了一个通用功能接口:
FuncServeInte接口
/**
* 通用业务功能接口
* @author newre
*/
public interface FuncServeInte {
/**
* 查找表中所有实体对象
* @return 实体对象列表
*/
List<? extends Bean> queryAll();
/**
* 添加实体对象
* @param bean 实体对象
* @return 是否添加成功
*/
Boolean add(Bean bean);
/**
* 删除表中所有数据
* @return 是否删除成功
*/
Integer deleteAll();
/**
* 按筛选条件查找实体列表
* @param filter 筛选条件
* @return 实体列表
*/
List<? extends Bean> queryFilter(String... filter);
/**
* 分页,返回此页的实体列表
*
* @param offset 分页偏移量,从第几条数据开始
* @param pageSize 一页数据的最大数量
* @return 实体列表
*/
List<? extends Bean> querySplit(int offset, int pageSize);
/**
* 数据的个数
*
* @return 数据个数
*/
Integer count();
}
可以看到,这里面悄然出现了Bean这个接口,这也正是我需要在bean层中添加Bean接口的原因——统一管理实体对象。
至于涉及到具体属性的方法,并没有写在这里,尽可能保护通用接口的通用性。
然后又写了两个具体的dao接口:
StudentServiceInte接口
/**
* 学生表操作的相关SQL语句
* @author newre
*/
public interface StudentDaoInte extends FuncDaoInte {
/**
* 查询指定id的学生信息
* @param id 学生id
* @return 学生实体
*/
Student queryById(Integer id);
/**
* 查询某班所有学生
* @param class_id 班级id
* @return 学生实体列表
*/
List<Student> queryByClassId(Integer class_id);
/**
* 通过名字查询学生(可能不止一个)
* @param name 学生姓名
* @return 学生实体列表
*/
List<Student> queryByName(String name);
/**
* 删除指定id的学生
* @param id 学生id
* @return 发生变更的行数
*/
Integer deleteById(Integer id);
/**
* 删除某班所有学生
* @param class_id 班级id
* @return 发生变更的行数
*/
Integer deleteByClass(Integer class_id);
/**
* 修改指定id的学生信息
* @param id 学生id
* @param student 更改后的学生实体
* @return 发生变更的行数
*/
Integer updateById(Integer id, Student student);
/**
* 分页,返回此页的实体列表
*
* @param currentPage 当前页码
* @param pageSize 一页数据的最大数量
* @return 实体列表
*/
List<? extends Bean> querySplit(int currentPage, int pageSize);
/**
* 数据的个数
*
* @return 数据个数
*/
Integer count();
}
ClassesDaoInte接口
/**
* 班级表操作的相关SQL语句
* @author newre
*/
public interface ClassesDaoInte extends FuncDaoInte {
/**
* 查询指定id的班级信息
* @param id 班级id
* @return 班级实体
*/
Classes queryById(Integer id);
/**
* 查询指定班级名的班级信息
* @param name 班级名字
* @return 班级实体
*/
Classes queryByName(String name);
/**
* 查询指定专业的班级信息
* @param major 专业名
* @return 班级实体列表
*/
List<Classes> queryByMajor(String major);
/**
* 查询指定id的班级人数
* @param id 班级id
* @return 班级人数
*/
Integer getNum(Integer id);
/**
* 删除指定id的班级
* @param id 班级id
* @return 发生变更的行数
*/
Integer deleteById(Integer id);
/**
* 删除指定名字的班级
* @param name 班级名字
* @return 发生变更的行数
*/
Integer deleteByName(String name);
/**
* 修改指定id的班级信息
* @param id 班级id
* @param clz 更改后的班级实体
* @return 发生变更的行数
*/
Integer updateById(Integer id, Classes clz);
}
service业务操作层
业务操作层负责的是调用dao层的东西(可以一次调用多个),也和dao层一样的思路。
FuncServeInte接口
/**
* 通用业务功能接口
* @author newre
*/
public interface FuncServeInte {
/**
* 查找表中所有实体对象
* @return 实体对象列表
*/
List<? extends Bean> queryAll();
/**
* 添加实体对象
* @param bean 实体对象
* @return 是否添加成功
*/
Boolean add(Bean bean);
/**
* 删除表中所有数据
* @return 是否删除成功
*/
Integer deleteAll();
/**
* 按筛选条件查找实体列表
* @param filter 筛选条件
* @return 实体列表
*/
List<? extends Bean> queryFilter(String... filter);
}
StudentServiceInte接口
/**
* 学生操作业务接口
* @author newre
*/
public interface StudentServiceInte extends FuncServeInte {
/**
* 查询指定id的学生信息
* @param id 学生id
* @return 学生实体
*/
Student queryById(Integer id);
/**
* 查询某班所有学生
* @param class_id 班级id
* @return 学生实体列表
*/
List<Student> queryByClassId(Integer class_id);
/**
* 删除指定id的学生
* @param id 学生id
* @return 是否删除成功
*/
Boolean deleteById(Integer id);
/**
* 修改指定id的学生信息
* @param id 学生id
* @param student 更改后的学生实体
* @return 是否修改成功
*/
Boolean updateById(Integer id, Student student);
}
ClassesServiceInte接口
/**
* 学生操作业务接口
*
* @author newre
*/
public interface ClassesServiceInte extends FuncServeInte {
/**
* 查询指定id的班级信息
* @param id 班级id
* @return 班级实体
*/
Classes queryById(Integer id);
/**
* 查询指定班级名的班级信息
* @param name 班级名
* @return 班级实体
*/
Classes queryByName(String name);
/**
* 修改指定id的班级信息
* @param id 班级id
* @param clz 更改后的班级实体
* @return 是否修改成功
*/
Boolean updateById(Integer id, Classes clz);
Boolean deleteById(Integer id);
}
servlet控制中转层
我的servlet层部分的代码很混乱,基本上是都堆在了一起,相同类型的代码写了很多,需要进一步封装类和封装方法。
最后
以上就是可耐画笔为你收集整理的学生管理系统分层设计结构--20190922班级表设计学生表设计结构设计的全部内容,希望文章能够帮你解决学生管理系统分层设计结构--20190922班级表设计学生表设计结构设计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复