这里介绍的是在不使用持久层框架的情况下,用Java反射写的BaseDao,简化Dao层的操作,让Dao的实现层每个方法体只有一行。所有的Dao的实现类继承BaseDao。 下面具体讲如何使用BaseDao 。
1、BaseDao 的写法
package dao;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import utils.DbHelper;
public class BaseDao {
private Connection conn = null;
private PreparedStatement ps = null;
private ResultSet rs = null;
/**
* 查询符合条件的记录数
*
* @param sql
* 要执行的sql语句
* @param args
* 给sql语句中的?赋值的参数列表
* @return 符合条件的记录数
*/
public long getCount(String sql, Object... args) {
conn = DbHelper.getConn();
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
if (rs.next()) {
return rs.getLong(1);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
DbHelper.closeConn(conn, ps, rs);
}
return 0L;
}
/**
* 查询实体对象的,并封装到一个集合
*
* @param <T>
* 要查询的对象的集合
* @param sql
* 要执行的sql语句
* @param clazz
* 要查询的对象的类型
* @param args
* 给sql语句中的?赋值的参数列表
* @return 要查询的类的集合,无结果时返回null
*/
public <T> List<T> executeQuery(String sql, Class<T> clazz, Object... args) {
conn = DbHelper.getConn();
List list = new ArrayList();
try {
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i + 1, args[i]);
}
rs = ps.executeQuery();
Field[] fs = clazz.getDeclaredFields();
String[] colNames = new String[fs.length];
String[] rTypes = new String[fs.length];
Method[] methods = clazz.getMethods();
while (rs.next()) {
for (int i = 0; i < fs.length; i++) {
Field f = fs[i];
String colName = f.getName().substring(0, 1).toUpperCase()
+ f.getName().substring(1);
colNames[i] = colName;
String