日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Mybatis之動態sql標簽的使用

瀏覽:224日期:2023-10-23 19:34:29

1.Mybatis動態sql

MyBatis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其它類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句的痛苦。例如拼接時要確保不能忘記添加必要的空格,還要注意去掉列表最后一個列名的逗號。利用動態 SQL 這一特性可以徹底擺脫這種痛苦。 雖然在以前使用動態 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射語句中的強大的動態 SQL 語言得以改進這種情形。 動態 SQL 元素和 JSTL 或基于類似 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間了解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基于 OGNL 的表達式來淘汰其它大部分元素。

2.常見的動態sql標簽

2.1 if

在現實的工作場景中,我們通常需要按照不同的維度對數據進行查詢。比如我們 通過員工管理系統要查詢一個name 為”Tom”的人,在大一點的公司可能有幾個name都為”Tom”的同事并且他們有可能分部在不同的部門,而在小點的公司可能只有一個人根本就不用按部門來過濾,這個時候我們可以通過傳參來控制我們的過濾條件如下:

/** * @Description employee的dao層代碼 * @Author xiaoqx <Javxuan@163.com> * @Version V1.0.0 * @Since 2017/11/26 */public interface EmployeeMapper { List<Employee> selectEmployeeList(Employee employee);}<select resultType='com.worldly.config.entity.Employee' databaseId='mysql'> select * from t_emp e where <if test='name!=null and name!=’’'> e.emp_name=#{name,jdbcType=VARCHAR} </if> <if test='dep!=null'> and e.emp_dep=#{dep.id,jdbcType=INTEGER} </if> </select>

配合一個“_databaseId”變量的 databaseIdProvider 可用于動態代碼中,這樣就可以根據不同的數據庫廠商構建特定的語句。比如下面的例子:

<insert id='insert'> <selectKey keyProperty='id' resultType='int' order='BEFORE'> <if test='_databaseId == ’oracle’'> select seq_users.nextval from dual </if> <if test='_databaseId == ’db2’'> select nextval for seq_users from sysibm.sysdummy1' </if> </selectKey> insert into users values (#{id}, #{name})</insert>

2.2 where

我們可以想象一下如果我們只要按部門編號查詢某個部門的同事時,生成的sql 語句會是怎么樣的? 很容易得出結論,最終生成的sql 就會如下:

Mybatis之動態sql標簽的使用

執行后將會報sql語法錯誤。我們可以用另外一個動態標簽來解決這個問題:

<select resultType='com.worldly.config.entity.Employee' databaseId='mysql'> select * from t_emp e <where> <if test='name!=null and name!=’’'> and e.emp_name=#{name,jdbcType=VARCHAR} </if> <if test='dep!=null'> and e.emp_dep=#{dep.id,jdbcType=INTEGER} </if> </where> </select>

只要將sql放入where動態標簽內,至少有一個條件符合的時候,才會插入where語句并且會將條件語句前的 and 去掉。

Mybatis之動態sql標簽的使用

2.3 trim

常用的屬性: prefix=”where”//給第一符合條件的語句 加上前綴where prefixOverrides=”and” //將最后一條語句的 前綴and 覆蓋 suffix=”and” //給第一符合條件的語句 加上后綴 and suffixOverrides=”and”//將最后一條語句的后綴 and 覆蓋 當我們把條件語句重新排版一下如下:

<select resultType='com.worldly.config.entity.Employee' databaseId='mysql'> select * from t_emp e <where> <if test='name!=null and name!=’’'> e.emp_name=#{name,jdbcType=VARCHAR} and </if> <if test='dep!=null'> and e.emp_dep=#{dep.id,jdbcType=INTEGER} and </if> </where> </select>

然后運行,結果如下:發現 動態where 標簽只會去除 條件語句的第一個and ,這時候動態where就解決不了這個問題了,就有了一個新的動態標簽trim

Mybatis之動態sql標簽的使用

動態xml代碼

<select resultType='com.worldly.config.entity.Employee' databaseId='mysql'> select * from t_emp e //表示給第一個符合條件的語句前加 where,把最后一個語句的suffixOverrides='and' 指定的and 覆蓋掉 <trim prefix='where' suffixOverrides='and'> <if test='name!=null and name!=’’'> e.emp_name=#{name,jdbcType=VARCHAR} and </if> <if test='dep!=null'> e.emp_dep=#{dep.id,jdbcType=INTEGER} and </if> </trim> </select>

2.4 set

類似的用于動態更新語句的解決方案叫做 set。set 元素可以用于動態包含需要更新的列,而舍去其它的。比如:

<update id='updateAuthorIfNecessary'> update Author <set> <if test='username != null'>username=#{username},</if> <if test='password != null'>password=#{password},</if> <if test='email != null'>email=#{email},</if> <if test='bio != null'>bio=#{bio}</if> </set> where id=#{id}</update>

這里,set 元素會動態前置 SET 關鍵字,同時也會刪掉無關的逗號,因為用了條件語句之后很可能就會在生成的 SQL 語句的后面留下這些逗號。(譯者注:因為用的是“if”元素,若最后一個“if”沒有匹配上而前面的匹配上,SQL 語句的最后就會有一個逗號遺留)

2.5 choose

有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句。 還是上面的例子,但是這次變為提供了“title”就按“title”查找,提供了“author”就按“author”查找的情形,若兩者都沒有提供,就返回所有符合條件的 BLOG(實際情況可能是由管理員按一定策略選出 BLOG 列表,而不是返回大量無意義的隨機結果)。

<select 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>

2.6 foreach

常用的屬性: collection 要遍歷的集合; item 要遍歷的元素; index 元素在集合中的索引; open 遍歷以什么開頭 比如 open=”and id in (“; seprator 遍歷出來的元素以什么分隔; end 遍歷以什么結束 end=”)” 動態 SQL 的另外一個常用的操作需求是對一個集合進行遍歷,通常是在構建 IN 條件語句的時候。比如:

<select resultType='domain.blog.Post'> SELECT * FROM POST P WHERE ID in <foreach item='item' index='index' collection='list' open='(' separator=',' close=')'> #{item} </foreach></select>

你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數組對象傳遞給 foreach 作為集合參數。當使用可迭代對象或者數組時,index 是當前迭代的次數,item 的值是本次迭代獲取的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。

2.7 bind

bind 元素可以從 OGNL 表達式中創建一個變量并將其綁定到上下文。這個動態標簽可以完美解決#{}在某些時候不適用,而用美元{}又有sql注入的風險的情況(${}與#{}的區別)比如:

<select resultType='Blog'> <bind name='pattern' value='’%’ + _parameter.getTitle() + ’%’' /> SELECT * FROM BLOG WHERE title LIKE #{pattern}</select>

2.8 insert

批量插入mysql 與oracle的區別:

2.8.1 mysql 批量插入

插入語句

<insert id='insertEmp'> insert into t_emp (id,username) values <foreach collection='userList' item='u' separator=',' open='(' close=')'> #{u.id},#{u.username} </foreach></insert>

預編譯結果

insert into t_emp (id,username) values(?,?),(?,?),(?,?)

你可能會想把整個插入語句進行循環如下: 用;來分隔每一條插入語句

<insert id='insertEmp'> <foreach collection='userList' item='u' separator=';'> insert into t_emp (id,username) values (#{u.id},#{u.username} ) </foreach> </insert>

預編譯結結果

insert into t_emp (id,username) values (?,?);insert into t_emp (id,username) values (?,?);insert into t_emp (id,username) values (?,?);

mysql默認是不支持這種語法,需要在url 后面的連接屬性增加一個 allowMultiQueries=true; 該屬性默認是關閉的。

2.8.2 oracle批量插入

oracle并不支持mysql這種語法

insert into t_emp (id,username) values(?,?),(?,?),(?,?)

他只能通過如下來完成插入

begin insert into t_emp (id,username) values(?,?); insert into t_emp (id,username) values(?,?); insert into t_emp (id,username) values(?,?); end;

2.9 sql

這個元素可以被用來定義可重用的 SQL 代碼段,可以包含在其他語句中。它可以被靜態地(在加載參數) 參數化. 不同的屬性值通過包含的實例變化. 比如:

<sql id='userColumns'> ${alias}.id,${alias}.username,${alias}.password </sql>

<select resultType='map'> select <include refid='userColumns'><property name='alias' value='t1'/></include>, <include refid='userColumns'><property name='alias' value='t2'/></include> from some_table t1 cross join some_table t2</select>

到此這篇關于Mybatis之動態sql標簽的使用的文章就介紹到這了,更多相關Mybatis 動態sql標簽內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Mybatis 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲激情久久| 久久av一区| 国产亚洲观看| 日韩高清在线观看一区二区| 日韩影院免费视频| 男人的天堂亚洲一区| 日本大胆欧美人术艺术动态| 日韩中文字幕不卡| 亚洲精品自拍| 日韩国产欧美视频| 国产探花一区在线观看| 亚州欧美在线| 亚洲久久一区| 欧美日韩亚洲一区| 美女久久久久久| 国产aⅴ精品一区二区三区久久 | 国产日韩一区| 国产精品v亚洲精品v日韩精品| 国产日韩视频在线| 久久一区精品| 日韩国产欧美一区二区| 黑森林国产精品av| 久久天堂成人| 成人久久久久| 亚洲国产一区二区在线观看| 免费成人性网站| 国产精品久久久久毛片大屁完整版| 狂野欧美性猛交xxxx| 久久激情一区| 亚洲三级网址| 国产精品99久久免费观看| 国产aa精品| 亚洲综合丁香| 国产精品任我爽爆在线播放 | 国产精品日韩精品在线播放 | 日韩一区二区免费看| 日韩免费精品| 精品视频久久| 国模 一区 二区 三区| 免费不卡在线观看| 欧美aa在线视频| 99成人在线视频| 亚洲精品护士| 福利一区和二区| 美女精品网站| 美女在线视频一区| 色天使综合视频| 蜜桃一区二区三区在线观看| 国产精品九九| 亚洲国产专区| 欧美啪啪一区| 欧洲av不卡| 天堂俺去俺来也www久久婷婷| 麻豆成人av在线| 欧洲激情综合| 麻豆国产欧美一区二区三区| 免费视频国产一区| 国产日韩亚洲| 亚洲专区一区| 97精品视频在线看| 日韩精品五月天| 黄毛片在线观看| 蜜桃视频一区二区| 色网在线免费观看| 日本va欧美va欧美va精品| 亚洲91视频| 国产精品久久久久久久久久妞妞| 蜜臀久久99精品久久一区二区 | 亚洲精品伊人| 欧美亚洲日本精品| 日韩精品亚洲专区| 色婷婷精品视频| 国产美女亚洲精品7777| 亚洲男女av一区二区| 精品日本视频| 日韩一级精品| 久久男人av资源站| 国产精品一区二区av日韩在线| 欧美日韩国产一区精品一区| 国产成人久久精品一区二区三区| 四虎精品一区二区免费| 久久久久久久久99精品大| 国产精品欧美日韩一区| 男女男精品网站| 日韩精品免费一区二区三区| 欧美aⅴ一区二区三区视频| 综合欧美精品| av成人国产| 91精品国产成人观看| 精品亚洲a∨| 日韩国产欧美三级| 国产一区二区精品| 99久久精品网站| 美女av一区| 国产伦精品一区二区三区视频| 综合国产视频| 亚洲欧美久久久| 亚洲精品国产嫩草在线观看| 精品一区二区三区亚洲| 欧美日韩18| 综合欧美精品| 丝袜美腿亚洲色图| 欧美特黄a级高清免费大片a级| 视频小说一区二区| 国产乱码午夜在线视频| 欧美日本不卡高清| 亚洲精品欧洲| 日韩在线播放一区二区| 国产美女一区| 在线精品视频在线观看高清| 欧美成人精品三级网站| 不卡专区在线| аⅴ资源天堂资源库在线| 国产一区二区三区亚洲| 精品视频91| 精品免费av| 精品美女视频 | 国产精品久久久亚洲一区| 日韩精品中文字幕一区二区| 亚洲伊人精品酒店| 日av在线不卡| 亚洲免费毛片| 日韩美女国产精品| 欧美日韩一区二区三区四区在线观看| 亚洲日韩中文字幕一区| 视频一区中文字幕| 石原莉奈在线亚洲二区| 免费成人av在线播放| 亚洲精品四区| 午夜精品影视国产一区在线麻豆| 亚洲精品美女91| 日韩av电影一区| 国产精品免费99久久久| 国产精品v一区二区三区| 国产成人精品一区二区三区免费| 天堂av在线| 激情五月色综合国产精品| 日韩一区二区久久| 日韩精品视频网站| 国产激情综合| 欧美日韩国产观看视频| 欧美日韩在线观看视频小说| 99国产精品久久久久久久成人热| 亚洲欧美网站| 亚洲视频国产精品| 欧美日韩一区二区三区四区在线观看 | 国产成人精品亚洲线观看| 日韩av在线中文字幕| 在线亚洲人成| 激情婷婷亚洲| 亚洲综合中文| 国产极品久久久久久久久波多结野| 福利精品在线| 日韩视频一区| 青青草精品视频| 精品午夜av| 亚洲激情另类| 欧美在线观看天堂一区二区三区| 国产中文欧美日韩在线| 亚洲精品成人| 青青草伊人久久| 亚洲午夜天堂| 亚洲精选91| 精品中文字幕一区二区三区| 日韩不卡免费高清视频| 热久久久久久久| 精品亚洲二区| 91久久视频| 日韩av不卡一区二区| 蜜臀国产一区| 亚洲男人在线| 日韩一区二区在线免费| 亚洲一二av| 在线亚洲人成| 日韩中文字幕一区二区高清99| 成人亚洲精品| 亚洲精品麻豆| 色一区二区三区四区| 在线综合亚洲| 国产乱子精品一区二区在线观看| 91精品久久久久久久久久不卡| 在线国产日韩| 国产欧美一区二区三区精品酒店| 亚洲一区日韩| 国产aa精品| 亚洲精品自拍| 日本欧美不卡| 国产日韩欧美一区在线| 亚洲二区免费| 国产精品嫩模av在线| re久久精品视频| 麻豆久久久久久| 视频一区中文字幕国产| 欧美少妇精品| 亚洲精品伦理| 激情欧美丁香| 国内不卡的一区二区三区中文字幕| 免费在线成人网| 一区二区三区四区日本视频| 91福利精品在线观看|