㈠ 各位大俠們,hibernate怎麼完成動態生成sql語句的啊
Hibernate3支持DetachedCriteria,這是一個非常有意義的特性!我們知道,在常規的Web編程中,有大量的動態條件查詢,即用戶在網頁上面自由選擇某些條件,程序根據用戶的選擇條件,動態生成SQL語句,進行查詢。針對這種需求,對於分層應用程序來說,Web層需要傳遞一個查詢的條件列表給業務層對象,業務層對象獲得這個條件列表之後,然後依次取出條件,構造查詢語句。這里的一個難點是條件列表用什麼來構造?傳統上使用Map,但是這種方式缺陷很大,Map可以傳遞的信息非常有限,只能傳遞name和value,無法傳遞究竟要做怎樣的條件運算,究竟是大於,小於,like,還是其它的什麼,業務層對象必須確切掌握每條entry的隱含條件。因此一旦隱含條件改變,業務層對象的查詢構造演算法必須相應修改,但是這種查詢條件的改變是隱式約定的,而不是程序代碼約束的,因此非常容易出錯。DetachedCriteria可以解決這個問題,即在web層,程序員使用DetachedCriteria來構造查詢條件,然後將這個DetachedCriteria作為方法調用參數傳遞給業務層對象。而業務層對象獲得DetachedCriteria之後,可以在session范圍內直接構造Criteria,進行查詢。就此,查詢語句的構造完全被搬離到web層實現,而業務層則只負責完成持久化和查詢的封裝即可,與查詢條件構造完全解耦,非常完美!這恐怕也是以前很多企圖在web層代碼中構造HQL語句的人想實現的夢想吧!示例代碼片段如下:web層程序構造查詢條件:java代碼:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.add(Restrictions.eq("name", "department")).createAlias("employees", "e").add(Restrictions.gt(("e.age"), new Integer(20)));Department和Employee是一對多關聯,查詢條件為:名稱是「department」開發部門;
部門裡面的雇員年齡大於20歲;業務層對象使用該條件執行查詢:java代碼:detachedCriteria.getExecutableCriteria(session).list();最大的意義在於,業務層代碼是固定不變的,所有查詢條件的構造都在web層完成,業務層只負責在session內執行之。這樣代碼就可放之四海而皆準,都無須修改了。然而Spring和Hibernate3的DetachedCriteria有不兼容的問題,因此在Spring環境下面使用Hibernate3需要注意:Spring的HibernateTemplate提供了Hibernate的完美封裝,即通過匿名類實現回調,來保證Session的自動資源管理和事務的管理。其中核心方法是:java代碼:HibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
....
}
}回調方法提供了session作為參數,有了session,就可以自由的使用Hibernate API編程了。使用了spring的之後,代碼修改如下:web層代碼:java代碼:DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);
detachedCriteria.createAlias("employees", "e").add(Restrictions.eq("name", "department")).add(Restrictions.gt(("e.age"), new Integer(20)));
departmentManager.findByCriteria(detachedCriteria);構造detachedCriteria,作為參數傳遞給departmentManager業務層代碼使用spring,DepartmentManager的findByCriteria如下:java代碼:public List findByCriteria(final DetachedCriteria detachedCriteria) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
});
}實際上也就是:java代碼:Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list(); 而已但是該程序代碼執行,會拋出強制類型轉換異常!我跟蹤了一下spring和Hibernate源代碼,原因如下:spring的HibernateTemplate的execute方法提供的回調介面具有Session作為參數,但是實際上,默認情況下,HibernateTemplate傳遞給回調介面的session並不是org.hibernate.impl.SessionImpl類,而是SessionImpl類的一個Proxy類。之所以替換成為一個Proxy類,HibernateTemplate的注釋說明,Proxy提供了一些額外的功能,包括自動設置Cachable,Transaction的超時時間,Session資源的更積極的關閉等等。java代碼:private boolean exposeNativeSession = false;
... execute方法內部:Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session));但是遺憾的是,Hibernate的DetachedCriteria的setExecutableCriteria方法卻要求將session參數強制轉為SessionImpl,但是spring傳過來的卻是一個Proxy類,因此就報錯了。java代碼:public Criteria getExecutableCriteria(Session session) {
impl.setSession( (SessionImpl) session ); // 要求SessionImpl,Spring傳遞的是Proxy
return impl;
}解決方法,禁止Spring的HibernateTemplate傳遞Proxy類,強制要求它傳遞真實的SessionImpl類,即給exexute方法增加一個參數,提供參數為true,如下:java代碼:public List findByCriteria(final DetachedCriteria detachedCriteria) {
return (List) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
return criteria.list();
}
}, true);
}
㈡ oracle怎麼創建動態sql(急)
通過」execute immediate sql「命令來實現。
第一步:創建可執行字元串「var sql:='select * form tablename' 」。
第二步:執行sql「execute immediate sql」。意思就是馬上執行sql語句。
㈢ ASP網頁如何動態生成SQLSever數據表,謝謝!
頁面上的按鈕sqlselect=request.form("select")獲取頁面查詢內容select*from表where欄位like'%&sqlselect&%'模糊查詢數據如果不是模糊查詢改成欄位='"&sqlselect&"'大概步驟是這樣,小的語法錯誤再看看吧,可能少了引號
㈣ asp.net sql語句 動態生成 如何實現
SQL語句,變數是從一個文本框輸入的。最簡單的例子是,搜索功能。先有一個文件框(keyword),這里輸入關鍵字。
在後右我們接收這個變數。比如ASP,resquest.form("keyword"),這個就是變數,然後後台我們處理的是
sql="select
*
from
abc
where
title
like
'%"&resquest.form("keyword"),&"%'"
這樣就查詢也,標題中含有變數的,所有記錄了。
參考
www.nogua.com
㈤ 在網站的框架中,有些提供了在頁面進行資料庫表的列添加功能,那程序是如何完成相應的SQL語句的動態生成
這個似乎不難
添加表的sql語句:alter table 表名 add 列名 數據類型
列名使用參數如@col即可動態生成,至於數據類型可以設置成固定的,如果需要動態生成也可以設置成參數,在頁面用下拉列表形式選擇為參數賦值
㈥ 真正的Mybatis動態sql —MyBatis Dynamic SQL
這個庫是一個用於生成動態SQL語句的框架。可以將它看作是一個類型安全的sQL模板庫,它提供了對MyBatis3和Spring JDBC模板的額外支持。該庫將生成供MyBatis或Spring使用的格式化的fuL LETE INET、SELECT和UPDATE語句。最常見的用例是生成可以直接由MyBatis使用的語句和一組數學參數。該庫還將生成與Spring JDBC模板兼容的語句和參數對象。該庫通過實現一個類似SQL的DSL來工作,該DSL創建一個對象,該對象包含完整的SQL語句和該語句所需的任何參數。
https://github.com/mybatis/mybatis-dynamic-sql
https://mybatis.org/mybatis-dynamic-sql/docs/introction.html
org.mybatis.dynamic.sql.SqlTable 表定義包括表的實際名稱(包括適當的模式)。如果需要,可以在選擇語句中應用表別名。你的Table應該繼承SqlTable 類。
org. mybatiss .dynamic.sql. sqlcolumn 用於定義在庫中使用的列。應該使用SqlTable中的構建器方法創建SqlColumns。列定義包括:
我們建議使用以下使用模式以提供最大的靈活性。這個模式允許您以「限定」或「非限定」的方式使用表和列名,這看起來像自然的SQL。例如,在下面的列中,一個列可以被稱為 firstName 或 user.firstName 。
該庫將創建用作 MyBatis mapper 輸入的類。這些類包括生成的SQL,以及與生成的SQL匹配的參數集。這兩者都是MyBatis所要求的。這些對象應該是 MyBatis mapper 方法的唯一參數。
(注意: MyBatis Dynamic SQL 不需要XML文件就能工作的很好,但並不意味著不支持XML,畢竟 **MyBatis **最初被設計為是一個 XML 驅動的框架。當你使用關聯查詢,需要復雜的映射,那麼使用XML 與 MyBatis Dynamic SQL 結合起來或者是更好選擇,你的XML或許只需要包含一些)