<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我們在使用JDBC或者其他類似的框架開發進行資料庫開發時,通常要根據需求動手組裝SQL,不用想都覺得是件很痛苦的事情了,而Mybatis框架提供的對SQL語句動態組裝的功能,能很好地解決這個麻煩。
動態SQL是MyBatis框架的一個強大特性,MyBatis3可採用功能強大的基於OGNL的表示式來完成動態SQL,它刪除了之前版本中需要了解的大多數元素,只使用不到原來一半的元素就能完成所需的工作。
SQL元素 | 說明 |
---|---|
<if> | 判斷語句,用於單條件分支判斷 |
<choose> (<when>,<otherwise>) | 相當於Java中的switch...case...default語句,用於多條件分支判斷 |
<where> | 簡化SQL語句中的where的條件判斷 |
<trim> | 可以靈活地去除多餘的關鍵字 |
<set> | 解決動態更新語句 |
<foreach> | 迴圈語句,常用於in語句等列舉條件中 |
<bind> | 從OGNL表示式中建立一個變數,並將其繫結到上下文,常用於模糊查詢的SQL中 |
使用動態 SQL 最常見情景是根據條件包含 where 子句的一部分
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.mapper.BookMapper"> <resultMap id="BookType" type="org.example.po.Book"> <id property="id" column="id"></id> <result property="bookName" column="bookName"></result> <result property="price" column="price"></result> <result property="publisher" column="publisher"></result> </resultMap> <select id="bookSelectById" parameterType="int" resultMap="BookType"> select * from t_book <where> <if test="id!=null and id!=''"> id=#{id} </if> </where> </select> <select id="bookSelectByname" parameterType="string" resultMap="BookType"> select * from t_book <where> <if test="bookNmae!=null and bookName!=''"> bookName LIKE concat('%',#{bookName},'%') </if> </where> </select> </mapper>
有時候,我們不想使用所有的條件,而只是想從多個條件中選擇一個使用。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。
因為自己寫的是單查詢,參照官網程式碼。
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG WHERE state = ‘ACTIVE' <choose> <when test="title != null"> AND title like #{title} </when> <when test="author != null and author.name != null"> AND author_name like #{author.name} </when> <otherwise> AND featured = 1 </otherwise> </choose> </select>
<where>標籤相當於 where 1=1 ,主要用來簡化SQL語句中的where條件判斷,並能智慧地處理and和or不必擔心多餘關鍵字導致的語法錯誤。程式碼參考<if>標籤程式碼。
這個標籤我覺得是最靈活的,trim元素也會自動識別其標籤內是否有返回值,若有的話,則會在已包含的內容前加上某些字首或者字尾(先判斷是否有語句包含),用到的屬性是
1、prefix(字首),suffix(字尾)
還可以把包含內容的首內容或尾內容的符號去掉,用到的屬性是
2、prefixOverride(字首覆蓋),suffixOverride(字尾覆蓋)
可以說功能很強大,可以利用它來替代where元素,並實現與where元素相同的效果。
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.mapper.BookMapper"> <resultMap id="BookType" type="org.example.po.Book"> <id property="id" column="id"></id> <result property="bookName" column="bookName"></result> <result property="price" column="price"></result> <result property="publisher" column="publisher"></result> </resultMap> <update id="bookUpdate" parameterType="book"> UPDATE t_book <trim prefix="set" suffixOverrides=","> <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if> <if test="price!=null and price!=''">price=#{price},</if> <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if> WHERE id=#{id} </trim> </update> </mapper>
set元素主要用於更新操作,它的主要功能和where元素差不多,主要是包含的語句前輸入一個set,若包含的語句以逗號結束,則會自動把括號忽略掉,再配合if元素就可以動態地更新需要修改的欄位;若不需要更改欄位,則可以不再被更新。
把上面的程式碼修改一下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="org.example.mapper.BookMapper"> <resultMap id="BookType" type="org.example.po.Book"> <id property="id" column="id"></id> <result property="bookName" column="bookName"></result> <result property="price" column="price"></result> <result property="publisher" column="publisher"></result> </resultMap> <update id="bookUpdate" parameterType="book"> UPDATE t_book <!-- <trim prefix="set" suffixOverrides=",">--> <!-- <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if>--> <!-- <if test="price!=null and price!=''">price=#{price},</if>--> <!-- <if test="publisher!=null and publisher!=''">publisher=#{publisher}</if>--> <!-- WHERE id=#{id}--> <!-- </trim>--> <set> <if test="bookName!=null and bookName!=''">bookName=#{bookName},</if> <if test="price!=null and price!=''">price=#{price},</if> <if test="publisher!=null and publisher!=''">publisher=#{publisher},</if> </set> WHERE id=#{id} </update> </mapper>
foreach元素通常在構建in條件語句時使用,其使用方式如下。
(1). item: 表示每個元素迭代時的別名。
(2). index: 指定一個名稱,用於表示在迭代過程中每次迭代的位置
(3). open: 表示該語句以什麼開始(in語句以“( ”開始)
(4). separator: 表示每次進行迭代時以上面符號作為分隔符(in語句以“ ,”作為分隔符)
(5). close: 表示該語句以什麼結束(in語句以“ )”結束)
(注意: 這個open,separator,close基本上就是固定格式了)
(6). collection: 表示最關鍵且最容易出錯的屬性,需格外注意。該屬性必須指定,不同情況下該屬性的值是不一樣的,主要有三種情況:
1). 若入參為單引數且引數型別是一個list時,collection屬性值為list
2). 若入參為單引數且引數型別是一個陣列時,collection屬性值為array
3). 若入參為多引數,需要將其封裝為一個Map進行處理
格式:
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P <where> <foreach item="item" index="id" collection="list" open="ID in (" separator="," close=")" nullable="true"> #{item} </foreach> </where> </select>
bind元素通常用於需要模糊查詢的語句中,使用bind元素定義了一個name為pattern_username的變數,value的屬性值就是拼接的查詢字串,其中_parameter.getTitle()表示傳遞進來的引數(也可以直接寫成對應的引數變數名,如username)。
<select id="selectBlogsLike" resultType="Blog"> <bind name="pattern_username" value="'%' + _parameter.getTitle() + '%'" /> SELECT * FROM BLOG WHERE title LIKE #{pattern} </select>
到此這篇關於MyBatis 超詳細講解動態SQL的實現的文章就介紹到這了,更多相關MyBatis 動態SQL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45