溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用JSP實(shí)現(xiàn)簡易的SQL報(bào)表

發(fā)布時(shí)間:2021-08-31 09:35:24 來源:億速云 閱讀:160 作者:chen 欄目:編程語言

這篇文章主要介紹“如何使用JSP實(shí)現(xiàn)簡易的SQL報(bào)表”,在日常操作中,相信很多人在如何使用JSP實(shí)現(xiàn)簡易的SQL報(bào)表問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何使用JSP實(shí)現(xiàn)簡易的SQL報(bào)表”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

這個(gè)內(nèi)容也是根據(jù)企業(yè)學(xué)員的要求準(zhǔn)備的. 其實(shí)這個(gè)小項(xiàng)目是剛畢業(yè)時(shí)候做的, 很多時(shí)候我們希望執(zhí)行下面的SQL/HQL然后得到一個(gè)HTML表格輸出

輸入: select ID as 編號, NAME as 姓名, AGE as 年齡 from XXX

輸出:

編號姓名年齡
   

要求是如果SQL變動, 仍然要顯示出來所有的別名字段信息和數(shù)據(jù).

因?yàn)楝F(xiàn)在Hibernate用的比較廣泛, 所以優(yōu)先考慮用Hibernate來實(shí)現(xiàn), 結(jié)果發(fā)現(xiàn)如果是實(shí)體映射查詢語句, 可以方便的用:ListQuery.getReturnAliases() 獲得別名, 然而我們知道查詢時(shí)有時(shí)候語句是很復(fù)雜的, 不全是HQL, 這時(shí)候用SQLQuery的時(shí)候, 驚訝的提示這個(gè)方法尚未實(shí)現(xiàn)(***版的Hibernate 3.3 是否實(shí)現(xiàn)尚未測試), 用的版本是Hibernate 3.2, 對應(yīng)的代碼是:

DAO

/**
 * 根據(jù)查詢語句返回結(jié)果, 并包含結(jié)果的列名
 * @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 = session.createQuery(hql);
         
         for(int i =0; i < args.length; i++) {
             query.setParameter(i, args[i]);
         }
         

         List list = query.list();
         list.add(0, query.getReturnAliases());
         
         return list;
         }
        });
    
    // Hibernate做count計(jì)算返回一般都是對象
    
    return list;        
}

測試代碼:

Listlist = dao.queryAllForReport("select id as 編號, 
name as 登錄名, address as 地址, realName from User");

  System.out.println(list.size());

for(Object[] row : list) {
    for(Object v : row) {
        System.out.print(v + "\t");
        
    }
    
    System.out.println();
}

***不得不回到JDBC, 用 ResultSet和ResultSetMetaData實(shí)現(xiàn)了這個(gè)功能, 詳細(xì)代碼(自己進(jìn)行修改即可實(shí)現(xiàn))如下:

﹤%@ page language="java" import="java.util.*, java.sql.*" pageEncoding="UTF-8"%﹥
﹤%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %﹥

﹤!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"﹥
﹤html﹥
﹤head﹥

﹤title﹥SQL報(bào)表﹤/title﹥

﹤meta http-equiv="pragma" content="no-cache"﹥
﹤meta http-equiv="cache-control" content="no-cache"﹥
﹤meta http-equiv="expires" content="0"﹥   


﹤/head﹥

﹤body﹥
﹤form action=""﹥
﹤textarea name=sql cols=80 rows=10﹥${param.sql}﹤/textarea﹥﹤br﹥
﹤input type=submit value=查詢﹥
﹤/form﹥

﹤c:if test="${!empty param.sql}"﹥

   ﹤%
//new oracle.jdbc.driver.OracleDriver();
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.41:1521:xe", "hr", "hr");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(request.getParameter("sql"));

if(rs == null) {
stmt.close();
conn.close();
return;
}

// 取列名
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
ArrayList colNames = new ArrayList();

for(int i = 1; i ﹤= cols; i++) {
colNames.add(meta.getColumnLabel(i));
}

request.setAttribute("colNames", colNames);
%﹥
﹤table border="1"  cellpadding="0"   width="100%" bordercolor="#000000" align=center ﹥

﹤tr﹥
﹤c:forEach items="${colNames}" var="c"﹥
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥

﹤%
while(rs.next()) {
colNames.clear();

for(int i = 1; i ﹤= cols; i++) {
Object value = rs.getObject(i);
System.out.println(value.getClass());

// TODO 更多格式化控制
if(value instanceof java.sql.Date) {
value = rs.getTimestamp(i);// 取出精確日期
java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyy年MM月dd日HH點(diǎn)mm分ss秒EEE");
value = df.format(value);
}

if(value instanceof java.math.BigDecimal) {
java.math.BigDecimal v = (java.math.BigDecimal)value;
value = v.doubleValue();
// 要求輸出時(shí)候最少顯示兩位小數(shù), 最多輸出小數(shù)點(diǎn)后3個(gè)數(shù)
java.text.NumberFormat format = java.text.NumberFormat.getInstance();// 只對小數(shù)格式化
format.setMaximumFractionDigits(2);// 最多3位小數(shù)
format.setMinimumFractionDigits(1);// 最少2位小數(shù)
value = format.format(value);// ==﹥ String
}

colNames.add(value);
}

request.setAttribute("colNames", colNames);

%﹥
﹤tr﹥
﹤c:forEach items="${colNames}" var="c"﹥
﹤td﹥${c}﹤/td﹥
﹤/c:forEach﹥
﹤/tr﹥
﹤%

}

rs.close();
stmt.close();
conn.close();
%﹥
﹤/table﹥
﹤/c:if﹥
﹤/body﹥
﹤/html﹥

用到了JSTL和EL, 總的來說要改版還是很方便的. 但是運(yùn)行需要比較高的Tomcat版本, 如5.5以上, 并需要JSTL類庫. 不過, 類似的模版項(xiàng)目開源框架應(yīng)該是很多很多的, 例如眾多的Report框架.

到此,關(guān)于“如何使用JSP實(shí)現(xiàn)簡易的SQL報(bào)表”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI