⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 person.java

📁 一个JDBC应用的例子
💻 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 + -