動態SQL的實現方式

2021-08-30 14:25:09 字數 2750 閱讀 1180

在做企業級應用的時候會有很多的系統配置和 sql語句需要編寫。按照平常的做法是寫在**中,以介面或者 final static string的方式來定義變數,每次修改都要改動**。好一點的做法是寫到 properties或者有結構的 xml文件中。但是也是不能動態修改的,這裡給大家介紹一種動態裝載配置的做法。對於那種很多的查詢條件的情況下尤其適用,只要給對應的引數就可以構造出對應的 sql,採用 hibernate的 qbc也可以達到該效果,二者配合使用相得益彰。

主類: configcode。

/** *

獲取相應的配置資訊

*@paramsignature

物件名

*@returnstring */

publicstring getcode (string signature);

/** *

獲取相應的動態配置資訊

*@paramsignature

物件名

*@parammap

物件方法

*@returnstring物件

*/ publicstring getcode(string signature,map

parametermap );

/** *

利用配置檔案來進行初始化工作

*@paramfilename

配置檔案名字

*@return初始化是否成功 */

privatebooleaninit(string filename);

基本思路:

將配置放到特定格式的

xml文件中,在系統啟動的時候載入進入記憶體。在需要修改的時候更改配置檔案,不用重啟伺服器直接生效。其工作方式有兩種,一種是

product

模式,系統不會檢測檔案的變更時間,如果有改動的話需要手動更新,這樣提高了效能。還有

debug

模式,系統實時監控文件的變化,一旦文件發生變化即時過載該檔案內容。使用前先例項化該類。

configcode sqlcode = configcode.getinstance (

"classpath*:dal.cfg.xml");

sqlcode.setdebug(true); //

設定debug模式

xml文件有個總配置文件

dal.cfg.xml

來控制配置文件放在**。其格式如下:

xmlversion

="1.0"

encoding

="utf-8"

?>

<

dataaccesslayer

>

/** *

code

主配置檔案解析類.

1、每一行只有一對大括號{}

2、在

group by user_name

order by count(*) desc

]]>

method

>

此處只是列出其中兩個例子做說明,其餘的看附件。有了這個動態的

sql之後就不用再**中寫那些煩人的

if else

的巢狀了。傳遞乙個

map進來自動匹配對對應的

sql出來,其原理是採用正規表示式來做的,具體業務不同的話可以改造實現。 例如

loginhistorysum

,如果傳進來的

map為空則得出的

sql為:

select user_name,count(*) from t_login_history

where 1=1

如果map

包含username ,則

select user_name,count(*) from t_login_history where 1=1

and user_name = 'username'

//'username'

將會用實際值代替,如果前面有問號

?的則用問號

?代替。

還有一條規則:之後緊跟!表示這個條件即使沒有傳值過來就採用預設值

"",如果帶有

||則將

||之前的作為預設值。

看看client

呼叫的例子:

string sql = configcode .getinstance ().getcode(

"biz.loginhistorysum"

, map);

string countsql = configcode .getinstance ().getcode(

"biz.loginhistorycount"

, map);

如果你修改了

xml檔案不知道是否做了更改,也可以通過介面來**改值的變化,也可以通過介面來重新整理

xml配置的快取。

看看上面的配置項,是從

拷貝而來的。但是由於改頁面需要系統許可權才能看到。這些還算是比較機密的資訊吧,許可權又是另外乙個大話題了。如果有什麼疑問可以加入我們的qq群

96642931

討論,[email protected] newway

。**見附件。

mysql 動態sql實現

需求為 表中有x列 500列 所有的資料都為0 false 和1 true 要求統計出其中有x 200 個true的總行數 資料庫層面實現 說明 不建議用這種,主要是為了記錄動態sql和處理思路.表結構 create table test2 id tinyint 4 default 0,id1 ti...

SQL實現表的動態查詢

一 事例 如果對乙個大學生三年成績的查詢通過學生學號,學生成績按學期存放在不同的表中,成績表如下 cjxx20051 也就是存放學生2005年第一學期的成績 cjxx20052 也就是存放學生2005年第二學期的成績 cjxx20061 也就是存放學生2005年第一學期的成績 cjxx20062 也...

動態SQL語句的拼接實現

平常經常遇到一些語句需要使用動態語句,來實現作業任務的計畫執行。例如動態表名,在分表設計時使用了月份格式 a 201912 在實現此類格式表名的作業任務時,必須採用動態語句,以避免每月更換一次sql語句的尷尬。現將部分實際操作經驗總結如下 一 基本語句格式 定義變數,給變數賦值,使用變數拼接sql,...