本文参考了:Java反射机制在DAO层的应用实例
所完成的功能是:由于Dao层有很多代码都是重复的,故想要使用几个类封装一下这个过程。
结果实现:完成Dao层的基础功能,更多的功能可以继续封装,也可以由开发者自己实现。代码在下边,需要的请自取。
基本思路是:
首先创建一个连接池存储数据库链接,再使用一个类 DataSourceDeal 封装了处理数据库的过程,完成包括取数据库连接,传sql语句,执行sql语句,处理结果集,关闭PreStatement和ResultSet,回收数据库连接等一系列动作。在处理除了select操作外其他操作都可以直接传入sql语句,然后执行就可以获得操作结果。需要处理select操作时,也仅仅只需重写getObjectFromResult()方法。最后使用一个类 DaoUtil 使用反射机制封装了将Entity转变成执行sql的过程,也就是说仅仅调用DaoUtil中的方法,提供一个Entity实例参数就可以完成数据库的处理了。 是不是很简单?
简单是有代价的,其实也不算代价,只是将一些编写数据库的常用的行为规范化起来而已。
1:Entity的成员变量中必须有一个标识号,名字必须以id结尾,而且不能只是id。
2:Entity中只能有一个以Id结尾的成员变量。
3:Entity中的成员变量由至少两个单词组成,单词用驼峰命名法。
4:数据库中字段命名和Entity一样。
主要部分代码(仅展示部分代码一部分完整版可去下方下载):
/**
*这部分代码主要功能是向数据库中插入一个bean对象
*
*/
// 完成对象的插入
public static Object insertObject(Object obj) {
StringBuilder sb = new StringBuilder("insert into ");
// 获取表名
Class<?> c = obj.getClass();
// 添加到sql语句中
sb.append(getTableNameFromClass(c));
// 获取所有的Field和Method
Method[] methods = c.getDeclaredMethods();
// 存放表名和值的容器
List<String> tableNames = new ArrayList<String>();
final List tableValues = new ArrayList();
// 填充容器
for (Method m : methods) {
String mName = m.getName();