这个内容也是根据企业学员的要求准备的 其实这个小项目是刚毕业时候做的 很多时候我们希望执行下面的SQL/HQL然后得到一个HTML表格输出:
输入: select ID as 编号 NAME as 姓名 AGE as 年龄 from XXX
输出:
编号姓名年龄
要求是如果SQL变动 仍然要显示出来所有的别名字段信息和数据
因为现在Hibernate用的比较广泛 所以优先考虑用Hibernate来实现 结果发现如果是实体映射查询语句 可以方便的用:List QuerygetReturnAliases() 获得别名 然而我们知道查询时有时候语句是很复杂的 不全是HQL 这时候用SQLQuery的时候 惊讶的提示这个方法尚未实现(最新版的Hibernate 是否实现尚未测试) 用的版本是Hibernate 对应的代码是:
DAO
/**
* 根据查询语句返回结果 并包含结果的列名
* @param hql
* @param args
* @return
*/
public List queryAllForReport( final String hql final Object args) {
List list = getHibernateTemplate()executeFind(new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException SQLException {
Query query = sessioncreateQuery(hql);
for(int i =; i < argslength; i++) {
querysetParameter(i args[i]);
}
List list = querylist();
listadd( querygetReturnAliases());
return list;
}
});
// Hibernate做count计算返回一般都是对象
return list;
}
测试代码:
List list = daoqueryAllForReport(select id as 编号
name as 登录名 address as 地址 realName from User);
Systemoutprintln(listsize());
for(Object[] row : list) {
for(Object v : row) {
Systemoutprint(v + \t);
}
Systemoutprintln();
}
最后不得不回到JDBC 用 ResultSet和ResultSetMetaData实现了这个功能 详细代码(自己进行修改即可实现)如下:
﹤%@ page language=java import=javautil* javasql* pageEncoding=UTF%﹥
﹤%@ taglib prefix=c uri=http://javasuncom/jsp/jstl/core %﹥
﹤!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN﹥
﹤html﹥
﹤head﹥
﹤title﹥SQL报表﹤/title﹥
﹤meta httpequiv=pragma content=nocache﹥
﹤meta httpequiv=cachecontrol content=nocache﹥
﹤meta httpequiv=expires content=﹥
﹤/head﹥
﹤body﹥
﹤form action=﹥
﹤textarea name=sql cols= rows=﹥${paramsql}﹤/textarea﹥﹤br﹥
﹤input type=submit value=查询﹥
﹤/form﹥
﹤c:if test=${!empty paramsql}﹥
﹤%
//new oraclejdbcdriverOracleDriver();
Connection conn = DriverManagergetConnection(jdbc:oracle:thin:@::xe hr hr);
Statement stmt = conncreateStatement();
ResultSet rs = stmtexecuteQuery(requestgetParameter(sql));
if(rs == null) {
stmtclose();
connclose();
return;
}
// 取列名
ResultSetMetaData meta = rsgetMetaData();
int cols = metagetColumnCount();
ArrayList colNames = new ArrayList();
for(int i = ; i ﹤= cols; i++) {
colNamesadd(metagetColumnLabel(i));
}
requestsetAttribute(colNames colNames);
%﹥
﹤table border= cellpadding= style=bordercollapse: collapse; width=% bordercolor=# align=center ﹥
﹤tr﹥
﹤c:forEach items=${colNames} var=c﹥
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥
﹤%
while(rsnext()) {
colNamesclear();
for(int i = ; i ﹤= cols; i++) {
Object value = rsgetObject(i);
Systemoutprintln(valuegetClass());
// TODO 更多格式化控制
if(value instanceof javasqlDate) {
value = rsgetTimestamp(i);// 取出精确日期
javatextSimpleDateFormat df = new javatextSimpleDateFormat(yyyy年MM月dd日HH点mm分ss秒EEE);
value = dfformat(value);
}
if(value instanceof javamathBigDecimal) {
javamathBigDecimal v = (javamathBigDecimal)value;
value = vdoubleValue();
// 要求输出时候最少显示两位小数 最多输出小数点后个数
javatextNumberFormat format = javatextNumberFormatgetInstance();// 只对小数格式化
formatsetMaximumFractionDigits();// 最多位小数
formatsetMinimumFractionDigits();// 最少位小数
value = formatformat(value);// ==﹥ String
}
colNamesadd(value);
}
requestsetAttribute(colNames colNames);
%﹥
﹤tr﹥
﹤c:forEach items=${colNames} var=c﹥
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥
﹤%
}
rsclose();
stmtclose();
connclose();
%﹥
﹤/table﹥
﹤/c:if﹥
﹤/body﹥
﹤/html﹥
用到了JSTL和EL 总的来说要改版还是很方便的 但是运行需要比较高的Tomcat版本 如以上 并需要JSTL类库 不过 类似的模版项目开源框架应该是很多很多的 例如众多的Report框架