MyBatis在注解上使用動(dòng)態(tài)SQL方式(@select使用if)
MyBatis在注解上使用動(dòng)態(tài)SQL
1、用script標(biāo)簽包圍
然后像xml語(yǔ)法一樣書(shū)寫(xiě)
@Select({"<script>", ? ? ? ? ? ? ? ? "SELECT * FROM tbl_order", ? ? ? ? ? ? ? ? "WHERE 1=1", ? ? ? ? ? ? ? ? "<when test='title!=null'>", ? ? ? ? ? ? ? ? "AND mydate = #{mydate}", ? ? ? ? ? ? ? ? "</when>", ? ? ? ? ? ? ? ? "</script>"})
2、用Provider去實(shí)現(xiàn)SQL拼接
例如:
public class OrderProvider { ? ? private final String TBL_ORDER = "tbl_order";? ? ? public String queryOrderByParam(OrderPara param) { ? ? ? ? SQL sql = new SQL().SELECT("*").FROM(TBL_ORDER); ? ? ? ? String room = param.getRoom(); ? ? ? ? if (StringUtils.hasText(room)) { ? ? ? ? ? ? sql.WHERE("room LIKE #{room}"); ? ? ? ? } ? ? ? ? Date myDate = param.getMyDate(); ? ? ? ? if (myDate != null) { ? ? ? ? ? ? sql.WHERE("mydate LIKE #{mydate}"); ? ? ? ? } ? ? ? ? return sql.toString(); ? ? } } ? public interface OrderDAO {? ?? ? ? @SelectProvider(type = OrderProvider.class, method = "queryOrderByParam") ? ? List<Order> queryOrderByParam(OrderParam param);? }
注意:方式1有個(gè)隱患就是當(dāng)傳入?yún)?shù)為空的時(shí)候,可能會(huì)造成全表查詢(xún)。
復(fù)雜SQL用方式2會(huì)比較靈活(當(dāng)然,并不建議寫(xiě)復(fù)雜SQL),而且可以抽象成通用的基類(lèi),使每個(gè)DAO都可以通過(guò)這個(gè)基類(lèi)實(shí)現(xiàn)基本的通用查詢(xún),原理類(lèi)似Spring JDBC Template。
3、說(shuō)明
如果XML元素嵌入在<script>XML元素中,則可以在注釋值中為動(dòng)態(tài)SQL使用XML元素:
@Select("<script>SELECT ...</script>")
但是使用<include>元素會(huì)觸發(fā)SQL Mapper配置解析異常,由以下原因引起:
org.apache.ibatis.builder.BuilderException: Unknown element in SQL statement. at org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.parseDynamicTags
如果nodeHandlers在課堂中檢查方法org.apache.ibatis.builder.BuilderException,將注意到支持的元素有:
trim
where
set
foreach
if
choose
when
otherwise
bind
然而,包括基于注釋的查詢(xún)中的片段是不可能的。
MyBatis xml注釋SQL的注意事項(xiàng)
說(shuō)明:在mybatis 的sql里不是不能寫(xiě)注釋?zhuān)亲⑨尣荒苡?{},mybatis仍舊會(huì)把#{}算成一個(gè)帶注入的參數(shù)
如代碼段2所示,mysql數(shù)據(jù)庫(kù)更換為oracle數(shù)據(jù)庫(kù)時(shí),#{date}需要明確jdbcType,而該代碼段中僅將適用于mysql的sql注釋?zhuān)琅f會(huì)報(bào)同樣的錯(cuò),最好是將注釋的sql刪除。
?<select id="slectSlagsteelRatioByDate" resultType="java.lang.Double"> ? -- ? ? ? ? select slagsteel_ratio FROM process_history WHERE r furnace_num = #{furnaceNum} -- ? ? ? ? ORDER BY real_time DESC limit 0,1 ? select slagsteel_ratio FROM( ?select slagsteel_ratio FROM process_history WHERE real_time <= #{date,jdbcType=TIMESTAMP} ?ORDER BY real_time DESC ) WHERE ROWNUM = 1 </select>
注意事項(xiàng)
1、where語(yǔ)句等用到大于小于等符號(hào)時(shí)候,需要使用 <![CDATA[ > ]]>或者 <![CDATA[ < ]]>進(jìn)行識(shí)別。
2、如果sql文中有動(dòng)態(tài)sql文標(biāo)簽,比如sql文,此時(shí)wwww為傳遞的參數(shù),不需用#{wwww }取值,直接使用即可。
3、如果超過(guò)一個(gè)參數(shù),需要在接口方法的每個(gè)參數(shù)定義時(shí)候使用@Param注解。
4、order by語(yǔ)句可以使用動(dòng)態(tài)sql
ORDER BY eeee ORDER BY rrrrrr
5、SELECT
? ? ? ? ? ?CASE ? ? ? ? ? ?WHEN ?條件1 THEN 字段1
WHEN 條件2 THEN 字段2
? ? ? ? ? ?ELSE ? ?字段3 ? ? ? ? ? ?END ? FROM.....
只要滿(mǎn)足一個(gè)WHEN,后面的WHEN就不會(huì)執(zhí)行了,跳出CASE WHEN 語(yǔ)句
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Mybatis?Plus使用XML編寫(xiě)動(dòng)態(tài)sql的超簡(jiǎn)易方法
- mybatis的動(dòng)態(tài)sql之if test的使用說(shuō)明
- Spring Boot整合mybatis使用注解實(shí)現(xiàn)動(dòng)態(tài)Sql、參數(shù)傳遞等常用操作(實(shí)現(xiàn)方法)
- Mybatis之動(dòng)態(tài)sql標(biāo)簽的使用
- Mybatis中動(dòng)態(tài)SQL,if,where,foreach的使用教程詳解
- Mybatis之動(dòng)態(tài)SQL使用小結(jié)(全網(wǎng)最新)
相關(guān)文章
詳解APP微信支付(java后臺(tái)_統(tǒng)一下單和回調(diào))
這篇文章主要介紹了APP微信支付(java后臺(tái)_統(tǒng)一下單和回調(diào)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)
XMLType是Oracle支持的一種基于XML格式存儲(chǔ)的數(shù)據(jù)類(lèi)型,這里我們共同來(lái)探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType數(shù)據(jù)的方法:2016-07-07Java實(shí)現(xiàn)根據(jù)前端所要格式返回樹(shù)形3級(jí)層級(jí)數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)根據(jù)前端所要格式返回樹(shù)形3級(jí)層級(jí)數(shù)據(jù),文中的示例代碼講解詳細(xì),有需要的小伙伴可以了解下2024-02-02Presto支持Elasticsearch數(shù)據(jù)源配置詳解
這篇文章主要為大家介紹了Presto支持Elasticsearch數(shù)據(jù)源配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Java語(yǔ)言中finally是否一定會(huì)執(zhí)行你知道嗎
這篇文章主要為大家詳細(xì)介紹了Java finally是否一定會(huì)執(zhí)行,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02淺談Java的兩種多線(xiàn)程實(shí)現(xiàn)方式
本篇文章主要介紹了淺談Java的兩種多線(xiàn)程實(shí)現(xiàn)方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08