import java.sql.*;
import java.util.ArrayList;
// 描述:描述表Person的一个记录,为了简化,这个类的所有属性都声明为公有属性!
// 作者:周晓聪
// 版本:1.0
// 日期:2003.09.12
class PersonRecord {
public String id; // 代码
public String name; // 姓名
public boolean sex; // 性别:女为true,男为false
public Date birthday; // 出生日期
public String address; // 家庭地址
public String resume; // 个人简历
}
// 描述:人员类,负责与数据库进行交互,负责完成插入、删除、修改和查找人员等功能
// 作者:周晓聪
// 版本:1.0
// 日期:2003.09.12
// 生存期:必须先调用open()方法建立与数据库的连接,然后才能调用其他方法,
// 最后应该调用close()方法关闭与数据库的连接
class Person {
private final static String TABLE_NAME = "Person";
private DatabaseAccess databaseAccess = null;
private DatabaseTableColumn[] columns = null;
// 功能:建立与数据库的连接
public void open() throws Exception {
try {
databaseAccess = new DatabaseAccess();
} catch (SQLException exc) {
throw new Exception("不能打开人员数据库!");
}
// 初始化表列信息
initializeColumns();
}
// 功能:获取有关数据库表的列信息
public DatabaseTableColumn[] getColumns() { return columns; }
// 功能:获取关键字段的信息
public String getKeyField() { return "id"; }
// 功能:添加一个人员信息,人员信息在aPerson中
public void add(PersonRecord aPerson) throws Exception {
// 查找是否已经存在相同代码的人员信息,如果已经存在则不能再插入
if (findById(aPerson.id) != null)
throw new Exception ("代码为" + aPerson.id + "的人员信息已经存在!");
String sql = "INSERT INTO " + TABLE_NAME +
" (id, name, sex, birthday, address, resume) " +
" VALUES (?, ?, ?, ?, ?, ?)";
try {
databaseAccess.prepare(sql);
databaseAccess.setParameter(1, aPerson.id);
databaseAccess.setParameter(2, aPerson.name);
databaseAccess.setParameter(3, aPerson.sex);
databaseAccess.setParameter(4, aPerson.birthday);
databaseAccess.setParameter(5, aPerson.address);
databaseAccess.setParameter(6, aPerson.resume);
databaseAccess.preparedUpdate();
} catch (SQLException exc) {
// 打印抛出异常的详细信息供程序编写人员调试程序
exc.printStackTrace();
// 抛出另一最终用户能够理解的异常向最终用户报告发生的问题!
throw new Exception("插入代码为" + aPerson.id + "的人员信息失败!");
}
}
// 功能:修改人员的信息,人员信息在aPerson中
public void update(PersonRecord aPerson) throws Exception {
String sql = "UPDATE " + TABLE_NAME +
" SET name = ?, sex = ?, birthday = ?, " +
"address = ?, resume = ? WHERE id = ?";
try {
databaseAccess.prepare(sql);
databaseAccess.setParameter(1, aPerson.name);
databaseAccess.setParameter(2, aPerson.sex);
databaseAccess.setParameter(3, aPerson.birthday);
databaseAccess.setParameter(4, aPerson.address);
databaseAccess.setParameter(5, aPerson.resume);
databaseAccess.setParameter(6, aPerson.id);
databaseAccess.preparedUpdate();
} catch (SQLException exc) {
// 打印抛出异常的详细信息供程序编写人员调试程序
exc.printStackTrace();
// 抛出另一最终用户能够理解的异常向最终用户报告发生的问题!
throw new Exception("修改代码为" + aPerson.id + "的人员信息失败!");
}
}
// 功能:修改人员的信息
// 参数:String personId - 要修改的人员的代码
// String modifyField - 要修改的字段
// Object value - 该字段的新值
public void update(String personId, String modifyField, Object value)
throws Exception {
int sqlType = getFieldSqlType(modifyField);
String sql = "UPDATE " + TABLE_NAME + " SET " + modifyField + " = ? " +
" WHERE id = ?";
try {
databaseAccess.prepare(sql);
databaseAccess.setParameter(1, value, sqlType);
databaseAccess.setParameter(2, personId);
databaseAccess.preparedUpdate();
} catch (SQLException exc) {
// 打印抛出异常的详细信息供程序编写人员调试程序
exc.printStackTrace();
// 抛出另一最终用户能够理解的异常向最终用户报告发生的问题!
throw new Exception("修改代码为" + personId + "的人员信息失败!");
}
}
// 功能:删除人员的信息
// 参数:String personId - 要删除的人员的代码
public void remove(String personId) throws Exception {
String sql = "DELETE FROM " + TABLE_NAME + " WHERE id = ?";
try {
databaseAccess.prepare(sql);
databaseAccess.setParameter(1, personId);
databaseAccess.preparedUpdate();
} catch (SQLException exc) {
// 打印抛出异常的详细信息供程序编写人员调试程序
exc.printStackTrace();
// 抛出另一最终用户能够理解的异常向最终用户报告发生的问题!
throw new Exception("删除代码为" + personId + "的人员信息失败!");
}
}
// 功能:查找所有人员的信息
// 返回:返回所有人员信息,这些信息放在ArrayList中,其中每一个元素为一个Object[]数组,
// 该数组的长度与columns.length相同
public ArrayList findAll() throws Exception {
String sql = "SELECT * FROM " + TABLE_NAME;
ResultSet result = null;
try {
result = databaseAccess.query(sql);
} catch (SQLException exc) {
exc.printStackTrace();
throw new Exception("查找所有的人员信息失败!");
}
// 将数据库中的数据装入ArrayList类型的data
ArrayList data = new ArrayList();
while (result.next()) {
Object[] record = new Object[columns.length];
for (int i = 0; i < columns.length; i++) {
record[i] = result.getObject(columns[i].getField());
}
data.add(record);
}
result.close();
return data;
}
// 功能:查找某个人员的信息
// 参数:String PersonId - 要查找人员的代码
// 返回:返回某个人员信息,这些信息放在PersonRecord,如果要查找的人员不存在则返回null
public PersonRecord findById(String personId) throws Exception {
String sql = "SELECT * FROM " + TABLE_NAME + " WHERE id = ?";
ResultSet result = null;
try {
databaseAccess.prepare(sql);
databaseAccess.setParameter(1, personId);
result = databaseAccess.preparedQuery();
} catch (SQLException exc) {
// 打印抛出异常的详细信息供程序编写人员调试程序
exc.printStackTrace();
// 抛出另一最终用户能够理解的异常向最终用户报告发生的问题!
throw new Exception("查找代码为" + personId + "的人员信息失败!");
}
PersonRecord record = null;
if (result.next()) {
record = new PersonRecord();
try {
record.id = result.getString("id");
record.name = result.getString("name");
record.birthday = result.getDate("birthday");
record.sex = result.getBoolean("sex");
record.address = result.getString("address");
record.resume = result.getString("resume");
} catch (SQLException exc) {
exc.printStackTrace();
throw new Exception("装入代码为" + personId + "的人员信息失败!");
}
}
return record;
}
// 功能:使用组合条件查询某个人员的信息
// 参数:Object[] conditions - 组合条件,其中:
// conditions[0] - 指定代码,为null表示不指定代码,可使用通配符
// conditions[1] - 指定姓名,为null表示不指定姓名,可使用通配符
// conditions[2] - 指定性别,为null表示不指定
// conditions[3] - 指定起始出生日期(包含该日期),为null表示不指定起始日期
// conditions[4] - 指定终止出生日期(不包含该日期),为null表示不指定终止日期
// conditions[5] - 指定家庭地址,为null表示不指定,可使用通配符
// 返回:返回查找的结果
public ArrayList findByCondition(Object[] conditions) throws Exception {
final int MAX = 6; // 查询条件的最大数目
Object[] values = new Object[MAX]; // 记录非空查询条件的值
int[] types = new int[MAX]; // 记录非空查询条件的相应类型
int counter = 0; // SQL语句的参数计数器
String sql = null;
// 根据组合条件构造SQL语句
String sqlFrom = "SELECT * FROM " + TABLE_NAME;
String sqlWhere = " WHERE (0 = 0)";
if (conditions != null) {
if (conditions.length > 0 && conditions[0] != null) {
String pattern = (String) conditions[0];
if ((pattern.indexOf('%')) >= 0 || (pattern.indexOf('_') >= 0)) {
// 查询条件有通配符%和_时采用SQL的WildCard匹配
sqlWhere = sqlWhere + " AND (id LIKE ?)";
} else sqlWhere = sqlWhere + " AND (id = ?)";
values[c