第3章 系统详细设计
第3章 系统详细设计
3.1子系统功能模块的实现
3.1.1 包的创建
本宿舍管理系统采用三层架构(即分层)的思想,分为三层:
(1)数据访问层:顾名思义,就是用于专门跟进行交互。执行数据的添加、删除、修改和显示等。需要强调的是,所有的数据对象只在这一层被引用,如
System.Data.SqlClient等,除数据层之外的任何地方都不应该出现这样的引用。
需要创建以下包dao包、daoimpl包,Dao包中存放数据访问的接口,例如:执行数据的添加、删除、修改和显示接口等,DaoImpl中存放对Dao中接口的实现即实现从数据库读取数据
例如实体学生StuDao中的接口
public interface StuDao extends Dao
List
}
例如实体学生StuDaoImpl中向数据库发送的SQL语句:
public static final String INSERT_TB_STU_SQL = \(Sid,Mid,Sname,Sdepart,Sclass,dor) VALUES (?,?,?,?,?,?)\ ;
public static final String DELETE_TB_STU_BY_ID_SQL = \public static final String UPDATE_TB_STU_SQL = \public static final String SELECT_TB_STU_ALL_SQL = \public static final String SELECT_TB_STU_BY_ID_SQL = \
public static final String SELECT_BASE_TB_STU_BY_COND_COUNT_SQL = \public static final String SELECT_BASE_TB_STU_CURR_PAGE_SQL = \ public static final String SELECT_TB_STU_GROUP_BY_MID_SQL = \tb_manager.Mname ,count(*) FROM tb_stu left join tb_manager on tb_stu.mid=tb_manager.mid group by tb_stu.mid\ ;
Sid = ? \ ;
Sname=?,Sdepart=?,Sclass=?,dor=? WHERE Sid = ?\ ; Sid,Mid,Sname,Sdepart,Sclass,dor FROM tb_stu\ ;
Sid,Mid,Sname,Sdepart,Sclass,dor FROM tb_stu WHERE Sid = ?\ ; COUNT(*) FROM tb_stu WHERE 1=1 \ ;
Sid,Mid,Sname,Sdepart,Sclass,dor FROM tb_stu WHERE 1=1\ ;
17
第3章 系统详细设计
(2)业务逻辑层:对一些业务的实现,用于做一些有效性验证的工作,以更好地保证程序运行的健壮性。如完成数据添加、修改和查询业务等;不允许指定的文本框中输入空字符串,数据格 式是否正确及数据类型验证;用户的权限的合法性判断等等,通过以上的诸多判断以决定是否将操作继续向后传递,尽量保证程序的正常运行。
需要创建一下包server包、serverimpl包,Service包中存放需要实现的业务接口,例如:数据的删除,修改,查询,分页等业务的接口,ServicImple中存放对Service中接口中的实现,需要调用数据访问层中DaoImpl的具体方法的返回值来获得数据。
例如实体学生StuService中的接口:
public interface StuService extends SuSheManageService { }
PageResultBean
List
例如实体学生StuServiceImpl中的从daoimpl中获取数据的主要代码:
private StuDao dao=new StuDaoImpl();
(3)表示层:负责直接跟用户进行交互,一般也就是指系统的界面,用于数据录入,数据显示等。意味着只做与外观显示相关的,不属于他的工作不用做。
这个项目创建了view包,存放数据显示的窗体。需要调用serviceimpl中的业务实现方法的返回值来获得数据
所谓的三层开发就是将系统的整个业务应用划分为表示层——业务逻辑层——数据访问层,这样有利于系统的开发、维护、部署和扩展。 宿舍管理系统所创建的包如3.1所示:
图3.1分层思想包的结构创建
18
第3章 系统详细设计
3.1.2 java架包的构建
在写宿舍管理系统时我们需要加一些我们项目中所需要的架包,通过选择“工程”→“右键”→”build path” 命令即可进行添加。本系统程序中需要添加的选项和需要使用的对应jar包,如图3.2所示。
图3.2 项目需要构建的架包
项目需要构建的架包的简单说明:
1. mysal-connector-java-3.0.17-ga-bin,jar是用于连接数据MySql的对应架包; 2. Jcommon-1.0.21.jar 是用来显示关于应用程序信息的用户界面类,布局定制管理器,一个日期选择面板,序列化工具类,XML解析器支持类.
3. hamcrest-library-1.3RCO.jar和junit-4.8.1.jar是用于单元调试所需要的架包
4. jxl.jar是用于导入导出EXCEL文件的架包
5. jfrechart-1.0.jar是用于把数据生成图文形式的架包 3.1.3 公共模块设计
在项目中创建了这样一个包sushemanage.util。这个包中存放工具类,因为这些代码可以重复调用,避免代码的冗余我们创建这些工具类。 util包中有这些工具类如3.3所示:
19
第3章 系统详细设计
图 3.3 项目需要工具类
1. DbUtil.java是数据库连接工具类。下面写数据库交互是具体写。 2. ExcelUtil.java是将数据导入导出成Excel的工具类。 将Excel中数据读入数据库主体代码:
public List
} //read方法,需要传String类型的路径名作为参数
将表中数据导出成到Excel中主体代码:
public boolean write(List
} //write方法,需要传一个list的集合和一个String类型的目标文件参数
3. JfreeChatUtil。Java是生成统计柱状图、折线图、饼图的工具类
生成饼图的主体代码:
public static void createPie(String TITLE_EMPS_PER_DEPT,DefaultPieDataset
dataset){
// create a chart... }
//DefaultPieDataset dataset = new DefaultPieDataset();
生成折线图的主体代码:
public static void createLine(String TITLE_EMPS_PER_DEPT,DefaultCategoryDataset linedataset,String xName,String yName){
}
生成柱状图的主体代码:
public static void createBar(String TITLE_EMPS_PER_DEPT,DefaultCategoryDataset linedataset,String xName,String yName){
}
4. MD5Util.java是MD5加密技术的工具类。 MD5加密主要代码:
public static String md5(String pswd){
try {
MessageDigest md=MessageDigest.getInstance(\); byte[] byteArray=md.digest(pswd.getBytes());
return ByteArrayToString(byteArray); // TODO Auto-generated catch block
20
} catch (NoSuchAlgorithmException e) {
第3章 系统详细设计
}
}
e.printStackTrace();
return null;
用这个技术后数据库用户登录的密码应是加密后的数据如图3.4所示:
图 3.4 加密后的密码
3.1.3 数据库连接配置
数据库连接采用单例设计模式,单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。数据库连接主要代码:
/**
* 使用单例 设计模式,实现 获得数据库连接,和数据连接关闭方法
* 单例中 读取 配置文件只做一次,解析该jdbc.properties只做一次 注册加载数据库厂商提供的工具类 ,只做一次 **/
private DbUtil() {
// 读取jdbc.properties 文件 try {
InputStream is =
\);
DbUtil.class.getClassLoader().getResourceAsStream(
// properties 工具类
username = prop.getProperty(\); password = prop.getProperty(\); url = prop.getProperty(\);
String driverClass = prop.getProperty(\); Class.forName(driverClass); e.printStackTrace();}
21
} catch (Exception e) {