一:查詢框架流程(架構(gòu)) 為了實現(xiàn)查詢代碼復(fù)用的效率,因此需要給所有的查詢寫一個抽象類BaseQuery,因此在將來收到頁面的查詢條件數(shù)據(jù),就以BaseQuery的格式傳遞,action到serrvice層以BaseQuery的格式傳遞,service傳到dao的數(shù)據(jù)也以BaseQuery的格式傳遞,在BaseQuey里邊有一個map類型的屬性,查詢條件的拼接都在調(diào)用basequery.buildWhere的時候拼接好了,
這個架構(gòu)應(yīng)該是項目的一個亮點(diǎn)應(yīng)為如何根據(jù)用戶輸入的條件來查詢具體的數(shù)據(jù),這個架構(gòu)大大的提高了代碼的復(fù)用率
BaseQuery是一個基礎(chǔ)的約束類,這個類用于獲取到用戶在頁面輸入的查詢條件,并且將查詢條件進(jìn)行封裝,封裝成map的形式,然后再后臺查詢的時候進(jìn)行hql語句的拼接,hql語句的拼接也是其中的一個亮點(diǎn)
package cn.edu.nwsuaf.GYL.query;import java.util.HashMap;import java.util.Map;//兩個功能//1:提供一個抽象方法,把具體頁面上的表單元素封裝成map,//2:提供一個map,供子類使用public abstract class BaseQuery { //把頁面上表單中的表單元素封裝成map結(jié)構(gòu) PRivate Map<String, Object> keyValues = new HashMap<String, Object>(); //當(dāng)前頁碼,初始化的值為1 private int currentPage = 1; //一頁顯示的條數(shù) private int pageSize = 2; //把頁面上的查詢條件進(jìn)行封裝,封裝成一個map(String ,object)類型 //并且進(jìn)行返回 public abstract Map<String, Object> buildWhere(); public Map<String, Object> getKeyValues() { return keyValues; } public void setKeyValues(Map<String, Object> keyValues) { this.keyValues = keyValues; } public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; }}條件語句的拼接類,這個類使用到了hibernateTemplate的回調(diào)函數(shù),在頁面數(shù)據(jù)查詢的時候,回調(diào)函數(shù)扮演者極為重要的作用,所以這個地方的重點(diǎn)是回調(diào)函數(shù)的使用,下面以查詢某張表的記錄的總的條數(shù)為例子來展示
@Override public int getCount(final BaseQuery baseQuery) { //hibernate的回調(diào)函數(shù) return this.hibernateTemplate.execute(new HibernateCallback<Integer>() { @Override public Integer doInHibernate(session session) throws HibernateException, SQLException { // StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append("select count(*) from Department"); stringBuffer.append(" where 1=1 "); //獲取所有的查詢條件 Map<String, Object> keyValues = baseQuery.buildWhere(); //拼接查詢條件,也就是拼接where條件語句,這個語句是條件的拼接 for(Entry<String, Object> entry:keyValues.entrySet()) { stringBuffer.append("and "+entry.getKey()+"=:"+entry.getKey()); } Query query = session.createQuery(stringBuffer.toString());//存放一個hql語句 System.out.println("拼接的條件語句是:"+stringBuffer.toString()); //接下來進(jìn)行值的拼接,把where條件中的參數(shù)傳遞值的過程 for(Entry<String, Object> entry:keyValues.entrySet()) { query.setParameter(entry.getKey(),entry.getValue()); } //獲取記錄的條數(shù) Long count = (Long) query.uniqueResult(); return count.intValue(); } }); }新聞熱點(diǎn)
疑難解答