1. mybatis 根據不同的參數運行不同的sql
<select id="getUserInfo" parameterType="java.util.Map" resultMap="userResult">
SELECT TU.USERID, TU.USERNAME, TU.PASSWORD, TU.GROUPIDEN, TU.ROLEID
, TUI.REALNAME, TUI.GENDER, TUI.BIRTHDAY, TUI.PERSONID, TUI.EMAIL, TUI.MOBILENUMBER
<if test="#{group == 'MANAGER'} || #{group == 'COMPANY'}">
, TUS.JOBNUMBER, TUS.COMPANYID FROM TAB_USER TU,
TAB_USER_INFO TUI, TAB_USER_STAFF TUS
</if>
<if test="#{group == 'CONSUMER'}">
, TUC.ADDRESS, TUC.AREAID FROM TAB_USER TU,
TAB_USER_INFO TUI, TAB_USER_CONSUMER TUC
</if>
WHERE
<if test="#{group == 'MANAGER'} || #{group == 'COMPANY'}">
TU.USERID = TUI.USERID AND TU.USERID = TUS.USERID AND TUI.USERID = TUS.USERID AND TU.USERNAME = #{userName}
</if>
<if test="#{group == 'CONSUMER'}">
TU.USERID = TUI.USERID AND TU.USERID = TUC.USERID AND TUI.USERID = TUC.USERID AND TU.USERNAME = #{userName}
</if>
</select>
這樣試試呢?
2. MyBatis 動態sql
「mybatis是java的後端框架,主要進行資料庫的連接,mybatis通過OGNL進行動態SQL的使用,動態SQL支持if、choose、where、foreach等標簽,可以動態判斷生產SQL語句實現功能。」
3. 真正的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或許只需要包含一些)
4. 如何MyBatis中使用動態SQL查詢與注釋
首先,樓主需了解何為動態sql,何為靜態sql,這是他們的區別:
靜態 SQL:靜態 SQL 語句一般用於嵌入式 SQL 應用中,在程序運行前,SQL 語句必須是確定的,例如 SQL 語句中涉及的列名和表名必須是存在的。靜態 SQL 語句的編譯是在應用程序運行前進行的,編譯的結果會存儲在資料庫內部。而後程序運行時,資料庫將直接執行編譯好的 SQL 語句,降低運行時的開銷。靜態SQL在編譯時已經確定了引用的表和列。 宿主變數不改變表和列信息。 可以使用主變數改變查詢參數值, 但是不能用主變數代替表名或列名。
動態 SQL:動態 SQL 語句是在應用程序運行時被編譯和執行的,不在編譯時確定 SQL 的表和列,而是讓程序在運行時提供,並將SQL 語句文本傳給 DBMS 執行。 靜態 SQL 語句在編譯時已經生成執行計劃。 而動態 SQL 語句,只有在執行時才產生執行計劃。動態 SQL 語句首先執行 PREPARE 語句要求 DBMS 分析、確認和優化語句,並為其生成執行計劃。例如,使用 DB2 的互動式工具 CLP 訪問資料庫時,用戶輸入的 SQL 語句是不確定的,因此 SQL 語句只能被動態地編譯。動態 SQL 的應用較多,常見的 CLI 和 JDBC 應用程序都使用動態 SQL。
下面是一個典型的在MyBatis中使用動態SQL:
<update id="update" parameterType="org.format.dynamicproxy.mybatis.bean.User"> UPDATE users <trim prefix="SET" prefixOverrides=","> <if test="name != null and name != ''"> name = #{name} </if> <if test="age != null and age != ''"> , age = #{age} </if> <if test="birthday != null and birthday != ''"> , birthday = #{birthday} </if> </trim> where id = ${id}</update>
5. 6.mybatis裡面的動態sql是怎麼設定的,常用標簽有那些以及其
1、動態SQL片段
通過SQL片段達到代碼復用
<!-- 動態條件分頁查詢 -->
<sql id="sql_count">
select count(*)
</sql>
<sql id="sql_select">
select *
</sql>
<sql id="sql_where">
from icp
<dynamic prepend="where">
<isNotEmpty prepend="and" property="name">
name like '%$name$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="path">
path like '%path$%'
</isNotEmpty>
<isNotEmpty prepend="and" property="area_id">
area_id = #area_id#
</isNotEmpty>
<isNotEmpty prepend="and" property="hided">
hided = #hided#
</isNotEmpty>
</dynamic>
<dynamic prepend="">
<isNotNull property="_start">
<isNotNull property="_size">
limit #_start#, #_size#
</isNotNull>
</isNotNull>
</dynamic>
</sql>
<select id="findByParamsForCount" parameterClass="map" resultClass="int">
<include refid="sql_count"/>
<include refid="sql_where"/>
</select>
<select id="findByParams" parameterClass="map" resultMap="icp.result_base">
<include refid="sql_select"/>
<include refid="sql_where"/>
</select>
2、數字范圍查詢
所傳參數名稱是捏造所得,非資料庫欄位,比如_img_size_ge、_img_size_lt欄位
<isNotEmpty prepend="and" property="_img_size_ge">
<![CDATA[
img_size >= #_img_size_ge#
]]>
</isNotEmpty>
<isNotEmpty prepend="and" property="_img_size_lt">
<![CDATA[
img_size < #_img_size_lt#
]]>
</isNotEmpty>
多次使用一個參數也是允許的
<isNotEmpty prepend="and" property="_now">
<![CDATA[
execplantime >= #_now#
]]>
</isNotEmpty>
<isNotEmpty prepend="and" property="_now">
<![CDATA[
closeplantime <= #_now#
]]>
</isNotEmpty>
3、時間范圍查詢
<isNotEmpty prepend="" property="_starttime">
<isNotEmpty prepend="and" property="_endtime">
<![CDATA[
createtime >= #_starttime#
and createtime < #_endtime#
]]>
</isNotEmpty>
</isNotEmpty>
6. mybatis中動態sql執行原理
解釋器模式: 初始化過程中構建出抽象語法樹,請求處理時根據參數對象解釋語法樹,生成sql語句。
工廠模式: 為動態標簽的處理方式創建工廠類(SqlTagHandlerFactory),根據標簽名稱獲取對應的處理方式。
策略模式: 將動態標簽處理方式抽象為介面,針對不同標簽有相應的實現類。解釋抽象語法樹時,定義統一的解釋流程,再調用標簽對應的處理方式完成解釋中的各個子環節
7. 如何實現基於註解mybatis動態拼寫sql語句
在spring中配置
<,-- 通過掃描的模式,掃描目錄在com.mrorder.目錄下,所有的mapper都繼承SqlMapper介面的介面 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mrorder."/>
<property name="markerInterface" value="com.mrorder..SqlMapper"/>
</bean>
自己寫層方法的介面
public interface OrderMapper extends SqlMapper{
@Select("select * from tbl_order where room like #{room} and mydate like #{mydate}")
public List<Order> getbyroom(OrderPara op);
}
這樣整個語句是寫死的,必須有2個參數,在這種模式下,如何能實現根據room和mydate是否為空來動態的拼寫sql語句
比如當mydate=""
Select("select * from tbl_order where room like #{room} ")
public List<Order> getbyroom(OrderPara op);
如果用xml來配置語句的話,可以用<when test="title ,= null">
and mydate= #{mydate}
</when>
如果是用@Select 這種 改如何做呢?
利用自定義註解,通過反射,拼出SQL語句。
8. MyBatis高級篇 - 動態SQL
MyBatis提供了一套動態SQL標簽,協助我們完成 SQL 語句的拼接工作。我們在日常工作中經常需要對 SQL 進行拼接:入參循環遍歷, where 條件拼接時的分隔符處理等等。
本文介紹以下幾個較常用的動態SQL標簽:
我們經常會遇到 where 條件中需要根據是否傳入參數來確定是否添加條件。
為了解決上面所遇到的問題,MyBatis 為我們提供了 <where> 標簽。
<foreach> 用於遍歷輸入參數中集合對象。
我們的 Mapper 文件,在 select 或者是 where 經常會出現重復內容,我們可以把重復的內容抽取為一個 <sql> 片段,需要使用的地方,使用 <include> 標簽就可以引入進來。