在做企業級應用的時候會有很多的系統配置和 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,...