MyBatis構建sql時動態傳入表名以及欄位名

2021-06-21 12:49:01 字數 1440 閱讀 7675

o.statecode as statuscode,count(*) as statusnum

from

where

o.doctorcode = # and

to_date(#,'yyyy/mm/dd')) and

(to_date(#,'yyyy/mm/dd')

1=1group by o.statecode

這是個很簡單的查詢,其中parametertype為對應的引數實體類,這些類中的字段將會替換sql語句中的類似#{}的語句,使之成為完整的sql 語句。同樣的,resulttype同樣對應的是返回值的實體類。這裡可以細說一下,其實在mybatis中,無論你指定還是不指定返回型別,mybatis都會預設的先將查詢回的值放入乙個hashmap中(如果返回的值不止一條就是乙個包含hashmap的list)。這其中的區別在於,如果你指定了返回型別,mybatis將會根據返回型別的實體類來從hashmap中獲取值並set到這個實體類中。如果不指定就預設返回乙個hashmap(list>)。

okay~大概講解到此,說說這次的問題。以前都是指定了實體類,然後寫好sql語句直接套用就可以了。但是現在有個問題,萬一你的物理模型不確定,也即是你的表結構不確定,甚至連表名字都不確定該怎麼辦呢?我這次遇到了這個問題。我們有個需求,事先定義好了很多資料集的資訊模型,針對這些資訊模型生成物理模型。而我們需要針對這些物理模型進行操作。而這些資料集一旦更新,資訊模型以及物理模型都要變動,所以事先不可能完全確定物理表結構等等資訊。此時應該怎麼在mybatis中進行處理呢?

這裡在說一下mybatis中乙個屬性:statementtype。這個屬性的作用是告訴mybatis我們寫的這個sql到底是預編譯(prestatement)還是非預編譯(statement)的。有什麼區別呢?如果是預編譯的,那麼系統在初始化時就會讀取這段sql**,將指定的實體類中的字段替換了類似#{}這樣的語句,就是形成了類似這樣的語句:

"select * from tablename where code=?" 這個時候你在系統執行時再想向這句sql中替換tablename或者code,結果可想而知。如果是非預編譯呢,結果剛好相反,他會在系統執行時才會去生成這樣類似的語句。此時就可以去替換這些動態的字段或者表名之類。這樣在結合之前所講的返回型別的設定,我們的問題就解決了

。我們可以不用設定引數和返回型別的實體類,只需要形成乙個動態的表名和欄位名的列表類。就可以動態對那些未知的物理模型進行操作.如下**可作參考:

select * from $ t where

$ between

to_date('$','yyyy-mm-dd

hh24:mi:ss')

to_date('$','yyyy-mm-dd

hh24:mi:ss')

$ = '$'

$ = '$'

對了,漏了一句,如果是非預編譯的話,最好使用${}而不是#{}

mybatis 動態sql詳解

內容 轉到原網頁insert into t blog title,content,owner values select from t blog where id update t blog set title content owner where id select from t blog se...

mybatis入門 動態sql

mybatis核心就是對sql語句進行靈活操作,通過表示式進行判斷,對sql進行靈活拼接 組裝。現有需求如下 需要查詢使用者,輸入的是使用者類,如果使用者的性別類不為空,則將性別作為查詢條件之一,如果使用者的姓名不為空,則將使用者姓名作為查詢條件之一。如果使用者兩個屬性都為空,則查詢所有使用者。將上...

MyBatis動態sql查詢

什麼是動態sql mybatis核心 對sql語句進行靈活操作,通過表示式進行判斷,對sql進行靈活拼接 組裝。需求public class userpo if test userpo.id null and id if if where select id findusercount parame...