要想重复造轮子就要造得好用一些才行:
我也造了一个轮子,下面这样的效果。
代码片段:
// 构建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);
}
}
回复 更多评论