要想重复造轮子就要造得好用一些才行:
我也造了一个轮子,下面这样的效果。
代码片段:
// 构建DAO工厂
AbstractDAOFactory<AccountPOJO, Long> factory = AbstractDAOFactory.newInstance();
// 构建DAO实例
IGenericsDAO<AccountPOJO, Long> dao = factory.buildGenericsDAO();
// 按条件检索数据并自动映射成POJO有序集合
List<AccountPOJO> pojos = dao.find(
	AccountPOJO.class, 
	Condition.valueOf("accountid", Condition.LE, 10),
	Condition.and("birthday", Condition.ISNULL),
	Condition.or("accountname", Condition.LIKE, "邓%"));
// 在控制台输出结果
for (AccountPOJO account : pojos) {
	System.out.println(account);
}
在控制台输出的调试信息为:
2010-04-14 00:48:58,281 main DEBUG [com.china.codingmouse.cmsdk4j.dao.sql.generator.SQLGenerator] 
[CmSdk4j Auto SQL Generator In 2010-04-14 00:48:58.281]
SELECT accountid, accountname, onlinecount, birthday, loginname, loginpassword, email, accountstate FROM account WHERE accountid <= ? AND birthday IS NULL OR accountname LIKE ?
------------------------------
2010-04-14 00:48:58,328 main DEBUG [com.china.codingmouse.cmsdk4j.dao.converter.DataTypeConverter] 
[SQL Parameter List Information In 2010-04-14 00:48:58.328]
No:1
Type:java.lang.Integer
Value:10
------------------------------
2010-04-14 00:48:58,343 main DEBUG [com.china.codingmouse.cmsdk4j.dao.converter.DataTypeConverter] 
[SQL Parameter List Information In 2010-04-14 00:48:58.343]
No:2
Type:java.lang.String
Value:邓%
------------------------------
在控制台输出的程序结果为:
[ accountid = 1, accountname = 邓超, onlinecount = 2203, birthday = 1984-12-26, loginname = CodingMouse, loginpassword = cmsdk4j, email = CodingMouse@gmail.com, accountstate = true ]
[ accountid = 3, accountname = 李四, onlinecount = 932, birthday = null, loginname = LiSi, loginpassword = lisi123, email = lisi123@126.com, accountstate = false ]
[ accountid = 7, accountname = 邓远辰, onlinecount = 429, birthday = null, loginname = ChengCheng, loginpassword = chengchengpwd, email = chengchengdream@gmail.com, accountstate = true ]
我也非常支持重复造轮子的行为,我上面那个泛型DAO的find方法实现是这样的:
/**
 * 获取该类型匹配的模型有序集合。<br><br>
 * 
 * @param clz 注册返回类型。
 * @param conditions SQL条件列表。
 * @return 该类型匹配的全部模型有序集合。
 * @throws DataAccessException 数据访问异常。
 */
public List<T> find(Class<? extends Object> clz, Condition... conditions)
	throws DataAccessException {
	return this.findAction.find(clz, conditions);
}
这段时间一直也在自己琢磨动态SQL的拼装问题,但总是显得对复杂SQL的支持还不够。也许还是只有单独封装个高内聚的SQL查询条件包装器才能达到效果。
由于我的DAO抽象基类还是采用的短事务处理方式,所以,总感觉还是不能完全满足需求:
/**
 * 执行查询SQL命令并返回模型有序集合。<br><br>
 * 
 * @param clz 注册模型类型。
 * @param sql 要执行的带占位符SQL命令字串。
 * @param param SQL参数列表。
 * @return 泛型模型集合。
 * @throws DataAccessException 数据访问异常。
 */
public List<Object> executeQuery(
	Class<? extends Object> clz, 
	String sql, 
	Parameter... param) 
	throws DataAccessException {
	// 数据库连接对象
	Connection conn = null;
	// SQL命令执行对象
	PreparedStatement ps = null;
	// 结果集对象
	ResultSet rs = null;
	// JDBC事务管理对象
	DBTransaction trans = null;
	
	try {
		conn = DB_CONNECTION_POOL.getConnection();
		trans = DBTransaction.begin(conn);
		ps = DataTypeConverter.java2Jdbc(
				conn.prepareStatement(sql), 
			param);
		rs = ps.executeQuery();
		List<Object> modelList = new Vector<Object>();
		while(rs.next()) {
			Object model = DataTypeConverter.jdbc2Java(
				clz, 
				rs);
			modelList.add(model);
		}
		trans.commit();
		return modelList;
	} catch (Throwable e) {
		trans.rollback();
		logger.error(
			this.getClass().getName(), 
			Logger.DIR_INTERNAL, 
			null, 
			Logger.getStackTrace(e));
		throw new DataAccessException(e);
	} finally {
		this.closeAll(rs, ps, conn, trans);
	}
	
}  
回复  更多评论