📄 person.java
字号:
import java.sql.*;
import java.util.ArrayList;
// 类PersonRecord描述表Person的一个记录,为了简化,这个类的所有属性都声明为公有属性!
class PersonRecord {
public String id; // 代码
public String name; // 姓名
public boolean sex; // 性别:女为true,男为false
public Date birthday; // 出生日期
public String address; // 家庭地址
public String resume; // 个人简历
}
// 类Person是人员类,负责与数据库进行交互,负责完成插入、删除、修改和查找人员等功能
// 注意:必须先调用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 {
// 查找是否已经存在相同代码的人员信息,如果已经存在则不能再插入
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 + "的人员信息失败!");
}
}
// 修改人员的信息
// 参数: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 + "的人员信息失败!");
}
}
// 查找所有人员的信息
// 返回所有人员信息,这些信息放在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;
}
// 将人员记录放置在一个对象数组中,因为表格的数据模型需要使用对象数组形式存放的人员信息。
public Object[] recordToArray(PersonRecord record) {
Object[] array = new Object[columns.length];
for (int i = 0; i < columns.length; i++) {
String fieldName = columns[i].getField();
if (fieldName.equals("id")) array[i] = record.id;
else if (fieldName.equals("name")) array[i] = record.name;
else if (fieldName.equals("sex")) array[i] = new Boolean(record.sex);
else if (fieldName.equals("birthday")) array[i] = record.birthday;
else if (fieldName.equals("address")) array[i] = record.address;
else if (fieldName.equals("resume")) array[i] = record.resume;
}
return array;
}
// 关闭数据库连接
public void close() throws Exception {
try {
databaseAccess.close();
} catch (Exception exc) {
exc.printStackTrace();
throw new Exception("关闭数据库" + TABLE_NAME + "失败!");
}
}
// 初始化数据表的字段信息
private void initializeColumns() {
columns = new DatabaseTableColumn[6];
try {
Class StringClass = Class.forName("java.lang.String");
Class DateClass = Class.forName("java.sql.Date");
Class BooleanClass = Class.forName("java.lang.Boolean");
columns[0] = new DatabaseTableColumn("代码", "id",
StringClass, 10, Types.VARCHAR);
columns[1] = new DatabaseTableColumn("姓名", "name",
StringClass, 10, Types.VARCHAR);
columns[2] = new DatabaseTableColumn("性别", "sex",
BooleanClass, 10, Types.BIT);
columns[3] = new DatabaseTableColumn("出生日期", "birthday",
DateClass, 10, Types.DATE);
columns[4] = new DatabaseTableColumn("家庭地址", "address",
StringClass, 30, Types.VARCHAR);
columns[5] = new DatabaseTableColumn("个人简历", "resume",
StringClass, 40, Types.LONGVARCHAR);
} catch (ClassNotFoundException exc) {
exc.printStackTrace();
}
}
// 返回字段fieldName对应的SQL类型
private int getFieldSqlType(String fieldName) {
for (int i = 0; i < columns.length; i++) {
if (fieldName.equals(columns[i].getField())) return columns[i].getSqlType();
}
return Types.VARCHAR; // 返回一个缺省的类型
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -