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

📄 person.java

📁 一个JDBC应用的例子
💻 JAVA
字号:
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[counter] = conditions[0];
				types[counter] = getFieldSqlType("id");
				counter++;
			}
			if (conditions.length > 1 && conditions[1] != null) {
				String pattern = (String) conditions[1];
				if ((pattern.indexOf('%')) >= 0 || (pattern.indexOf('_') >= 0)) {
					// 查询条件有通配符%和_时采用SQL的WildCard匹配
					sqlWhere = sqlWhere + " AND (name LIKE ?)";
				} else  sqlWhere = sqlWhere + " AND (name = ?)";
				values[counter] = conditions[1];
				types[counter] = getFieldSqlType("name");
				counter++;
			}
			if (conditions.length > 2 && conditions[2] != null) {
				sqlWhere = sqlWhere + " AND (sex = ?)";
				values[counter] = conditions[2];
				types[counter] = getFieldSqlType("sex");
				counter++;
			}
			if (conditions.length > 3 && conditions[3] != null) {
				sqlWhere = sqlWhere + " AND (birthday >= ?)";
				values[counter] = conditions[3];
				types[counter] = getFieldSqlType("birthday");
				counter++;
			}
			if (conditions.length > 4 && conditions[4] != null) {
				sqlWhere = sqlWhere + " AND (birthday < ?)";
				values[counter] = conditions[4];
				types[counter] = getFieldSqlType("birthday");
				counter++;
			}
			if (conditions.length > 5 && conditions[5] != null) {
				String pattern = (String) conditions[1];
				if ((pattern.indexOf('%')) >= 0 || (pattern.indexOf('_') >= 0)) {
					// 查询条件有通配符%和_时采用SQL的WildCard匹配
					sqlWhere = sqlWhere + " AND (address LIKE ?)";
				} else  sqlWhere = sqlWhere + " AND (address = ?)";
				values[counter] = conditions[5];
				types[counter] = getFieldSqlType("address");
				counter++;
			}
		}
		sql = sqlFrom + sqlWhere;
		ResultSet result = null;
		try {
			databaseAccess.prepare(sql);
			for (int i = 0; i < counter; i++) {
				databaseAccess.setParameter(i+1, values[i], types[i]);
			}
			result = databaseAccess.preparedQuery();
		} 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;
			else System.out.println("发生了内部错误,遇到了不认识的字段名:" + fieldName);
		}
		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 {
			columns[0] = new DatabaseTableColumn("代码", "id", 
					Class.forName("java.lang.String"), 10, Types.VARCHAR);
			columns[1] = new DatabaseTableColumn("姓名", "name", 
					Class.forName("java.lang.String"), 10, Types.VARCHAR);
			columns[2] = new DatabaseTableColumn("性别", "sex", 
					Class.forName("java.lang.Boolean"), 10, Types.BIT);
			columns[3] = new DatabaseTableColumn("出生日期", "birthday", 
					Class.forName("java.sql.Date"), 10, Types.DATE);
			columns[4] = new DatabaseTableColumn("家庭地址", "address", 
					Class.forName("java.lang.String"), 30, Types.VARCHAR);
			columns[5] = new DatabaseTableColumn("个人简历", "resume", 
					Class.forName("java.lang.String"), 40, Types.LONGVARCHAR);
		} catch (ClassNotFoundException exc) {
			exc.printStackTrace();
		}
	}
	private int getFieldSqlType(String fieldName) {
		for (int i = 0; i < columns.length; i++) {
			if (fieldName.equals(columns[i].getField())) 
				return columns[i].getSqlType();
		}
		// 不应该发生没有找到的问题,如果发生则是一个内部错误,打印信息供程序员调试使用
		System.out.println("没有关于字段" + fieldName + "的类型信息!");
		return Types.VARCHAR;		// 返回一个缺省的类型
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -