1.5 公共类设计

1.5 公共类设计

在项目开发中会使用类型的形式来封装一些常用的属性和方法,这样可以大大提高代码的重用率,同样也可以方便代码的管理。本系统一共包含7个公共类,分别是DBConnection类、Page类、PageUtil类、Employee类、Message类、Reply类以及Criticism类。下面来详细介绍这7个类的开发。

1.5.1 封装数据库操作JavaBean开发

在项目开发中,很多地方都需要使用操作数据库,这时就需要在每一个JSP中获得数据库连接对象。这时我们就希望能够有一个公用类,通过该类能方便地获得数据库连接对象。这个类就是下面要介绍的公共数据库访问连接类。在该类中的所有方法都是静态的,这时候就没必要创建该类的实例对象,直接通过类名就可以调用。该类通常包含4个方法,一个获得方法,用来获得连接对象;3个关闭方法,分别用来关闭连接对象、预处理对象、结果集对象

下面就来分步介绍如何创建公共数据库访问连接类,其创建步骤如下。
(1)导入所需的类,这些类都需要在程序中使用,代码如下所示。

例程1.1代码位置:/JavaPrj_1/src/com/sanqing/util/DBConnection.java

1
2
3
4
5
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

代码中导入了DBConnection类所需的5个类,分别为Connection类、DriverManager类、PreparedStatement类、ResultSet类和SQLException类。

(2)声明常量并赋值,这些常量用来获得数据库连接对象,代码如下所示
例程1.2代码位置:/JavaPrj_1/src/com/sanqing/util/DBConnection.java

1
2
3
4
private static final String DBDRIVER = "com.mysql.jdbc.Driver" ;            //驱动类类名
private static final String DBURL = "jdbc:mysql://localhost:3306/db_affairmanage";//连接URL
private static final String DBUSER = "root" ; //数据库用户名
private static final String DBPASSWORD = "admin"; //数据库密码

代码第1行声明了一个常量DBDRIVER,用来表示驱动类的类名。
代码第2行声明了个常量DBURL,用来表示数据库连接URL
代码第3行声明了一个常量DBUSER,用来表示数据库的用户名。
代码第4行声明了一个常量DBPASSWORD,用来表示数据库的密码。

(3)创建获得数据库连接对象方法getConnection(),代码如下所示。

1
2
3
4
5
6
7
8
9
10
11
12
public static Connection getConnection(){
Connection conn = null; //声明一个连接对象
try {
Class.forName(DBDRIVER); //注册驱动
conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD); //获得连接对象
} catch (ClassNotFoundException e) { //捕获驱动类无法找到异常
e.printStackTrace();
} catch (SQLException e) { //捕获SQL异常
e.printStackTrace();
}
return conn;
}

代码第4行使用Class类的forName注册驱动类com.mysqljdbcDriver。代码第5行通过DriverManager类的getConnection方法,传入数据库连接URL、数据库用户名以及数据库密码来获得数据库连接对象。
(4)创建关闭连接对象方法cose( Connection conn),方法中通过参数获得连接对象,通过调用其close方法来进行关闭,代码如下所示。

1
2
3
4
5
6
7
8
9
public static void close(Connection conn) {//关闭连接对象
if(conn != null) { //如果conn连接对象不为空
try {
conn.close(); //关闭conn连接对象对象
} catch (SQLException e) {
e.printStackTrace();
}
}
}

代码第2行通过i语句对conn对象进行判断,如果conn对象不为空,则调用其close方法对其进行关闭。
(5)创建关闭预处理对象方法close( PreparedStatement pstm),方法中通过参数获得预处理对象,通过调用其cose方法来进行关闭,代码如下所示。

1
2
3
4
5
6
7
8
9
public static void close(PreparedStatement pstmt) {//关闭预处理对象
if(pstmt != null) { //如果pstmt预处理对象不为空
try {
pstmt.close(); //关闭pstmt预处理对象
} catch (SQLException e) {
e.printStackTrace();
}
}
}

代码第2行判断预处理对象pstm是否为空,如果不为空,则调用其close方法对其进行关闭。
(6)创建关闭结果集对象方法close( Resultset rs),方法中通过参数获得结果集对象,通过调用其close方法来进行关闭,代码如下所示。

1
2
3
4
5
6
7
8
9
public static void close(ResultSet rs) {//关闭结果集对象
if(rs != null) { //如果rs结果集对象不为null
try {
rs.close(); //关闭rs结果集对象
} catch (SQLException e) {
e.printStackTrace();
}
}
}

1.5.2 分页信息类开发

分页信息类用来封装分页的所有信息,如每页显示多少记录、总记录数、总页数、当前页、是否有上一页等等信息

/JavaPrj_1/src/com/sanqing/util/Page.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.sanqing.util;
public class Page {
private int everyPage; //每页显示记录数
private int totalCount; //总记录数
private int totalPage; //总页数
private int currentPage; //当前页
private int beginIndex; //查询起始点
private boolean hasPrePage; //是否有上一页
private boolean hasNextPage; //是否有下一页
public Page(int everyPage, int totalCount, int totalPage,
int currentPage,int beginIndex, boolean hasPrePage,
boolean hasNextPage) { //自定义构造方法
this.everyPage = everyPage;
this.totalCount = totalCount;
this.totalPage = totalPage;
this.currentPage = currentPage;
this.beginIndex = beginIndex;
this.hasPrePage = hasPrePage;
this.hasNextPage = hasNextPage;
}
// 省略getter和setter方法以及默认构造函数
}

代码第3行至第9行声明了7个属性,分别为everyPage(每页显示记录数)、totalCount(总记录数)、totalPage(总页数)、currentPage(当前页)、beginIndex(查询起始点)、hasPrePage(是否有上一页)以及hasNextPage(是否有下一页)。代码第10行至第20行自定义了一个构造方法,该构造方法接收分页信息的所有参数,然后对其属性进行设置。

1.5.3 分页辅助类开发

在进行分页的时候,必须知道3个信息,分别是当前页、每页显示记录数以及总记录数只要知道了这3个信息,就可以通过计算得到分页信息的其他信息。这部分计算操作就交给分页辅助类来处理了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package com.sanqing.util;
/*
* 分页信息辅助类
*/
public class PageUtil {
public static Page createPage(int everyPage,int totalCount,int currentPage) {//创建分页信息对象
everyPage = getEveryPage(everyPage);
currentPage = getCurrentPage(currentPage);
int totalPage = getTotalPage(everyPage, totalCount);
int beginIndex = getBeginIndex(everyPage, currentPage);
boolean hasPrePage = getHasPrePage(currentPage);
boolean hasNextPage = getHasNextPage(totalPage, currentPage);
return new Page(everyPage, totalCount, totalPage, currentPage,
beginIndex, hasPrePage, hasNextPage);
}
public static int getEveryPage(int everyPage) { //获得每页显示记录数
return everyPage == 0 ? 10 : everyPage;
}
public static int getCurrentPage(int currentPage) { //获得当前页
return currentPage == 0 ? 1 : currentPage;
}
public static int getTotalPage(int everyPage,int totalCount) {//获得总页数
int totalPage = 0;
if(totalCount != 0 &&totalCount % everyPage == 0) {
totalPage = totalCount / everyPage;
} else {
totalPage = totalCount / everyPage + 1;
}
return totalPage;
}
public static int getBeginIndex(int everyPage,int currentPage) {//获得起始位置
return (currentPage - 1) * everyPage;
}
public static boolean getHasPrePage(int currentPage) {//获得是否有上一页
return currentPage == 1 ? false : true;
}
public static boolean getHasNextPage(int totalPage, int currentPage) { //获得是否有上一页
return currentPage == totalPage || totalPage == 0 ? false : true;
}
}

代码第3行创建了静态方法createPage,该方法接收3个参数,分别为everyPagetotalCount以及currentPage。通过这3个参数然后调用PageUtil类的其他静态方法即可返回封装好了所有信息的分页对象。代码第13行创建了静态方法getEveryPage,该方法判断每页显示记录数是否为零,如果为零则设置其值为10。代码第16行创建静态方法getCurrentPage,该方法判断当前页是否为零,如果为零则设置其值为1。代码第19行创建了静态方法getTotalPage,该方法判断总页数是否能整除每页显示记录数,如果可以则直接返回总页数除以每页显示记录数,否则在其基础上再加一。代码第28行创建了静态方法getBeginlndex,该方法通过对当前页减一然后乘以每页显示记录数,从而计算出查询起始点。代码第31行创建了静态方法getAsPrePage,判断当前页是否为第一页,如果为第一页则返回false,否则返回true。代码第34行创建了静态方法getAsNextPage,判断当前页是否等于最后一页或者等于零,如果等于则返回false,否则返回true

1.5.4 员工信息类

员工信息类封装了员工的所有信息,包括员工编号、员工姓名、员工性别、出生日、办公室电话、住址、录入时间、系统口令、是否为管理层领导信息

/JavaPrj_1/src/com/sanqing/bean/Employee.java
1
2
3
4
5
6
7
8
9
10
11
12
public class Employee {
private int employeeID; //员工编号
private String employeeName; //员工姓名
private boolean employeeSex; //员工性别
private Date employeeBirth; //出生日期
private String employeePhone; //办公室电话
private String employeePlace; //住址
private Date joinTime; //录入时间
private String password; //系统口令
private boolean isLead; //是否为管理层领导
// 此处省略getter和setter方法,请自己补上
}

代码第2行至第11行声明了9个属性,分别为employeeID,EmployeeName,EmployeeSex,employeeBirth,EmployeePhone,EmployeePlace,JoinTime,Password,IsLead,并添加了其settergetter方法,在这里因为篇幅原因省略了代码,读者可以参考光盘中的代码。

1.5.5 消息信息类

消息信息类封装了消息的所有信息,包括消息ID、消息标题、消息内容、发布人ID、发布时间信息。

/JavaPrj_1/src/com/sanqing/bean/Message.java
1
2
3
4
5
6
7
8
public class Message {
private int messageID; //消息ID
private String messageTitle; //消息标题
private String messageContent; //消息内容
private int employeeID; //发布人ID
private Date publishTime; //发布时间
// 此处省略getter和setter方法,请自己补上
}

代码第2行至第6行声明了5个属性,分别为messaged,MessageTitle,MessageContentemployeeID,PublishTime。代码第7行添加了所有属性的etrgetter方法。

1.5.6 回复信息类

回复信息类封装了回复的所有信息,包括消息回复ID、回复内容、回复人ID、回复时间以及消息ID

/JavaPrj_1/src/com/sanqing/bean/Reply.java
1
2
3
4
5
6
7
8
public class Reply {
private int replyID; //回复ID
private String replyContent;//回复内容
private int employeeID; //回复人ID
private Date replyTime; //回复时间
private int messageID; //消息ID
// 此处省略getter和setter方法,请自己补上
}

代码中声明了5个属性分别为reply,ReplyContent,,EmployeeID,ReplyTime,MessageID代码第7行为所有属性添加了settergetr方法。

1.5.7 批复信息类

/JavaPrj_1/src/com/sanqing/bean/Criticism.java
1
2
3
4
5
6
7
8
9
10
package com.sanqing.bean;
import java.util.Date;
public class Criticism {
private int criticismID; //批复ID
private String criticismContent;//批复内容
private int employeeID; //批复人ID
private Date criticismTime; //批复时间
private int messageID; //消息ID
// 此处省略getter和setter方法,请自己补上
}

代码中声明了5个属性,分别为criticism,CriticismContent,EmployeeID,CriticismTime,messageID。代码第7行为所有属性添加了settergetter方法。