色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

MyBatis動態sql是什么?MyBatis動態SQL最全教程

jf_ro2CN3Fa ? 來源:CSDN ? 2023-08-10 10:18 ? 次閱讀

一、MyBatis動態 sql 是什么

動態 SQL 是 MyBatis 的強大特性之一。在 JDBC 或其它類似的框架中,開發人員通常需要手動拼接 SQL 語句。根據不同的條件拼接 SQL 語句是一件極其痛苦的工作。例如,拼接時要確保添加了必要的空格,還要注意去掉列表最后一個列名的逗號。而動態 SQL 恰好解決了這一問題,可以根據場景動態的構建查詢。

動態SQL(code that is executed dynamically),它一般是根據用戶輸入或外部條件動態組合的SQL語句塊。 動態SQL能靈活的發揮SQL強大的功能、方便的解決一些其它方法難以解決的問題。 相信使用過動態SQL的人都能體會到它帶來的便利,然而動態SQL有時候在執行性能 (效率)上面不如靜態SQL,而且使用不恰當,往往會在安全方面存在隱患 (SQL 注入式攻擊)。

1.Mybatis 動態 sql 是做什么的?

Mybatis 動態 sql 可以讓我們在 Xml 映射文件內,以標簽的形式編寫動態 sql,完成邏輯判斷和動態拼接 sql 的功能。

2.Mybatis 的 9 種 動 態 sql 標 簽有哪些?

元素 作用 備注
if 判斷語句 單條件分支判斷
choose(when、otherwise) 相當于 Java 中的 switch case 語句 多條件分支判斷
trim,where 輔助元素 用于處理一些SQL拼裝問題
foreach 循環語句 在in語句等列舉條件常用
bind 輔助元素 拼接參數

3.動態 sql 的執行原理?

原理為:使用 OGNL 從 sql 參數對象中計算表達式的值,根據表達式的值動態拼接 sql,以此來完成動態 sql 的功能。

二、MyBatis標簽

1.if標簽:條件判斷

MyBatis if 類似于 Java 中的 if 語句,是 MyBatis 中最常用的判斷語句。使用 if 標簽可以節省許多拼接 SQL 的工作,把精力集中在 XML 的維護上。

1)不使用動態sql


 
select*fromuserwhereusername=#{username}andsex=#{sex}

if 語句使用方法簡單,常常與 test 屬性聯合使用。語法如下:

SQL語句

2)使用動態sql

上面的查詢語句,我們可以發現,如果 #{username} 為空,那么查詢結果也是空,如何解決這個問題呢?使用 if 來判斷,可多個 if 語句同時使用。

以下語句表示為可以按照網站名稱(name)或者網址(url)進行模糊查詢。如果您不輸入名稱或網址,則返回所有的網站記錄。但是,如果你傳遞了任意一個參數,它就會返回與給定參數相匹配的記錄。


selectid,name,urlfromwebsite
where1=1

ANDnamelike#{name}


ANDurllike#{url}


2.where+if標簽

where、if同時使用可以進行查詢、模糊查詢

注意,失敗后, 關鍵字只會去掉庫表字段賦值前面的and,不會去掉語句后面的and關鍵字,即注意, 只會去掉 語句中的最開始的and關鍵字。所以下面的形式是不可取的





sacclikeconcat('%'#{sacc}'%')


ANDsnamelikeconcat('%'#{sname}'%')


ANDsex=#{sex}


ANDphone=#{phone}



這個“where”標簽會知道如果它包含的標簽中有返回值的話,它就插入一個‘where’。此外,如果標簽返回的內容是以AND 或OR 開頭的,則它會剔除掉。

3.set標簽

set可以用來修改


updatestudent

sname=#{sname},
spwd=#{spwd},
sex=#{sex},
phone=#{phone}
sid=#{sid}

wheresid=#{sid}

4.choose(when,otherwise) 語句

有時候,我們不想用到所有的查詢條件,只想選擇其中的一個,查詢條件有一個滿足即可,使用 choose 標簽可以解決此類問題,類似于 Java 的 switch 語句


select*fromuser



id=#{id}


andusername=#{username}


andsex=#{sex}




也就是說,這里我們有三個條件,id、username、sex,只能選擇一個作為查詢條件

如果 id 不為空,那么查詢語句為:select * from user where id=?

如果 id 為空,那么看username 是否為空,如果不為空,那么語句為 select * from user where username=?;

如果 username 為空,那么查詢語句為 select * from user where sex=?

5.trim

trim標記是一個格式化的標記,可以完成set或者是where標記的功能

①、用 trim 改寫上面第二點的 if+where 語句


select*fromuser
 


andusername=#{username}


andsex=#{sex}



prefix:前綴

prefixoverride:去掉第一個and或者是or

②、用 trim 改寫上面第三點的 if+set 語句

 

updateuseru
 


u.username=#{username},


u.sex=#{sex},



whereid=#{id}

suffix:后綴

suffixoverride:去掉最后一個逗號(也可以是其他的標記,就像是上面前綴中的and一樣)

③、trim+if同時使用可以添加


insertintostudent

sname,
spwd,
sex,
phone,



#{sname},
#{spwd},
#{sex},
#{phone}



6.MyBatis foreach標簽

foreach是用來對集合的遍歷,這個和Java中的功能很類似。通常處理SQL中的in語句。

foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及集合項迭代之間的分隔符。這個元素也不會錯誤地添加多余的分隔符

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

//批量查詢

WHEREsidin

#{ids}


//批量刪除

deletefromstudentwheresidin

#{ids}


整合案例

xml





select*fromstudent








WHERE1=1

ANDsidlike#{sid}







sacclikeconcat('%'#{sacc}'%')


ANDsnamelikeconcat('%'#{sname}'%')


ANDsex=#{sex}


ANDphone=#{phone}





updatestudent

sname=#{sname},
spwd=#{spwd},
sex=#{sex},
phone=#{phone}
sid=#{sid}

wheresid=#{sid}



insertintostudent

sname,
spwd,
sex,
phone,



#{sname},
#{spwd},
#{sex},
#{phone}




WHEREsidin

#{ids}




deletefromstudentwheresidin

#{ids}






測試類:

packagecom.yzx.test;

importcom.yzx.entity.Student;
importcom.yzx.mapper.StuMapper;
importorg.apache.ibatis.io.Resources;
importorg.apache.ibatis.session.SqlSession;
importorg.apache.ibatis.session.SqlSessionFactory;
importorg.apache.ibatis.session.SqlSessionFactoryBuilder;
importorg.junit.After;
importorg.junit.Before;
importorg.junit.Test;

importjava.io.IOException;
importjava.io.InputStream;
importjava.util.List;

publicclassStuTest{
SqlSessionsqlSession=null;
InputStreamis=null;

@Before
publicvoidbefore()throwsIOException{
//1.讀取核心配置文件
is=Resources.getResourceAsStream("sqlMapperConfig.xml");
//2.拿到工廠構建類
SqlSessionFactoryBuildersqlSessionFactoryBuilder=newSqlSessionFactoryBuilder();
//3.拿到具體工廠
SqlSessionFactorybuild=sqlSessionFactoryBuilder.build(is);
//4.拿到session
sqlSession=build.openSession();
}

@After
publicvoidafter(){
//7,提交事務
sqlSession.commit();
//8.關閉資源
sqlSession.close();
if(is!=null){
try{
is.close();
}catch(IOExceptione){
e.printStackTrace();
}
};
}

//查詢所有
@Test
publicvoidfind(){
//5.獲取具體的mapper接口
StuMappermapper=sqlSession.getMapper(StuMapper.class);
//6.調用執行
Listlist=mapper.find();
list.forEach(a->System.out.println(a));
}
//查詢單個
@Test
publicvoidfindbyid(){

StuMappermapper=sqlSession.getMapper(StuMapper.class);
Listlist=mapper.findbyid(2);
list.forEach(a->System.out.println(a));
}
//模糊查詢
@Test
publicvoidfindQuery(){

StuMappermapper=sqlSession.getMapper(StuMapper.class);

Studentstu=newStudent();
stu.setSname("小");
stu.setSex("男");
Listlist=mapper.findQuery(stu);
list.forEach(a->System.out.println(a));
}
//修改
@Test
publicvoidupd(){

StuMappermapper=sqlSession.getMapper(StuMapper.class);

Studentstu=newStudent();
stu.setSid(3);
stu.setSname("小若");
stu.setSex("人妖");
inti=mapper.upd(stu);
System.out.println("修改了"+i+"條數據"+""+stu.toString());

}
//添加
@Test
publicvoidadd(){

StuMappermapper=sqlSession.getMapper(StuMapper.class);

Studentstu=newStudent();
stu.setSname("小賀");
stu.setSex("男");
stu.setPhone("99999999");
inti=mapper.add(stu);
System.out.println("添加了"+i+"條數據"+""+stu.toString());

}

//批量操作
@Test
publicvoidfindAll(){

StuMappermapper=sqlSession.getMapper(StuMapper.class);
Integer[]i={1,2,3,4};
Listlist=mapper.findAll(i);
list.forEach(a->System.out.println(a));
}
//批量操作

//批量刪除
@Test
publicvoiddel(){
StuMappermapper=sqlSession.getMapper(StuMapper.class);
Integer[]i={1,2,3,4};
inti1=mapper.del(i);
System.out.println("刪除了"+i1+"條數據");
}
}

7.sql

在實際開發中會遇到許多相同的SQL,比如根據某個條件篩選,這個篩選很多地方都能用到,我們可以將其抽取出來成為一個公用的部分,這樣修改也方便,一旦出現了錯誤,只需要改這一處便能處處生效了,此時就用到了這個標簽了。

當多種類型的查詢語句的查詢字段或者查詢條件相同時,可以將其定義為常量,方便調用。為求

9.如何引用其他XML中的SQL片段

比如你在com.xxx.dao.xxMapper這個Mapper的XML中定義了一個SQL片段如下:

ID,MAJOR,BIRTHDAY,AGE,NAME,HOBBY

此時我在com.xxx.dao.PatinetMapper中的XML文件中需要引用,如下:

三、MyBatis關聯查詢

1.MyBatis一對多關聯查詢

 












 

select*fromstudent1sleftjointeachertons.sid=t.sid

2.MyBatis多對一關聯查詢

 













 

select*fromteachertrightjoinstudent1sont.sid=s.sid

3.MyBatis多對多關聯查詢

 

select*fromstudent1sleftjoinrelevancerons.sid=r.sidleftjointeachertonr.tid=t.tid





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • SQL
    SQL
    +關注

    關注

    1

    文章

    773

    瀏覽量

    44219
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20141
  • XML技術
    +關注

    關注

    0

    文章

    15

    瀏覽量

    6027
  • UTF-8
    +關注

    關注

    0

    文章

    13

    瀏覽量

    7866
  • mybatis
    +關注

    關注

    0

    文章

    62

    瀏覽量

    6734

原文標題:MyBatis 動態 SQL 最全教程,這樣寫 SQL 太爽了!

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Mybatis的特點和核心配置文件

    Mybatis—01基礎&動態SQL
    發表于 08-07 14:20

    為什么要動態sql語句?

    為什么要動態sql語句?因為動態sql語句能夠提供一些比較友好的機制1、可以使得一些在編譯過程中無法獲得完整的sql語句,在程序執行階段
    發表于 12-20 06:00

    jdbc與mybatis的區別

    MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。JDBC是一種用于執行SQL
    發表于 02-02 17:43 ?1.1w次閱讀
    jdbc與<b class='flag-5'>mybatis</b>的區別

    mybatis是什么_MyBatis的優缺點詳解_mybatis框架入門詳解

    Mybatis框架是別人開發的一種半成品軟件,可以用來通過定制輔助快速開發是工具。MyBatis應用程序根據XML配置文件創建SqlSessionFactory,SqlSessionFactory在
    發表于 02-24 09:16 ?2w次閱讀

    mybatis動態sql詳解

    本文詳細介紹了mybatis執行動態sql語句的方法。
    發表于 02-24 11:37 ?3856次閱讀

    mybatis中#和$的區別

    ${ } 變量的替換階段是在動態 SQL 解析階段,而 #{ }變量的替換是在 DBMS 中。這是 #{} 和 ${} 我們能看到的主要的區別,除此之外,還有以下區別:#方式能夠很大程度防止sql
    發表于 02-24 13:35 ?2291次閱讀

    在使用MyBatisSQL語句優化總結

    MyBatis 作為一款優秀的持久層框架,它支持自定義SQL、存儲過程以及高級映射。它免除了幾乎所有的 JDBC 代碼以及設置參數和獲取結果集的工作。還可以通過簡單的 XML 或注解來配置和映射原始
    的頭像 發表于 02-04 15:20 ?2822次閱讀

    Fluent Mybatis、原生MybatisMybatis Plus對比

    使用fluent mybatis可以不用寫具體的xml文件,通過java api可以構造出比較復雜的業務sql語句,做到代碼邏輯和sql邏輯的合一。不再需要在Dao中組裝查詢或更新操作,在xml或
    的頭像 發表于 09-15 15:41 ?1467次閱讀

    MybatisSQL注入審計的基本方法

    SQL注入漏洞作為WEB安全的最常見的漏洞之一,在java中隨著預編譯與各種ORM框架的使用,注入問題也越來越少。新手代碼審計者往往對Java Web應用的多個框架組合而心生畏懼,不知如何下手,希望通過Mybatis框架使用不當導致的S
    的頭像 發表于 10-17 11:16 ?1345次閱讀

    一文掌握MyBatis動態SQL使用與原理

    摘要:使用動態 SQL 并非一件易事,但借助可用于任何 SQL 映射語句中的強大的動態 SQL 語言,M
    的頭像 發表于 01-06 11:27 ?1024次閱讀

    動態Sql介紹

    動態Sql介紹 動態 SQLMyBatis 的強大特性之一。如果你使用過 JDBC 或其它類似的框架,你應該能理解根據不同條件拼接
    的頭像 發表于 05-31 09:34 ?1419次閱讀
    <b class='flag-5'>動態</b><b class='flag-5'>Sql</b>介紹

    什么是SQL注入?Java項目防止SQL注入方式

    Java項目防止SQL注入方式 這里總結4種: PreparedStatement防止SQL注入 mybatis中#{}防止SQL注入 對請求參數的敏感詞匯進行過濾 ngin
    發表于 10-16 14:26 ?628次閱讀

    mybatis接口動態代理原理

    MyBatis是一款輕量級的Java持久化框架,它通過XML或注解配置的方式,將數據庫操作與SQL語句解耦,提供了一種簡單、靈活的數據訪問方式。在MyBatis中,使用動態代理技術來實
    的頭像 發表于 12-03 11:52 ?979次閱讀

    mybatis和mybatisplus的區別

    個輕量級的持久層框架,它提供了一個靈活的SQL映射機制,使得開發者可以編寫原生SQL語句來操作數據庫。MyBatis的設計目標是將原生SQL和對象關系映射(ORM)相結合,以便開發者可
    的頭像 發表于 12-03 11:53 ?2621次閱讀

    mybatis中$和井號區別

    MyBatis是一個開源的Java持久層框架,它提供了許多強大的功能用于簡化數據庫操作。在MyBatis中,我們可以使用兩種方式來動態生成SQL語句:$和#。 和#都可以用來替換
    的頭像 發表于 12-03 14:53 ?1025次閱讀
    主站蜘蛛池模板: 美女屁股软件 | 大桥未久与黑人中出视频 | 色哦色哦哦色天天综合 | 伊人网伊人网 | 轻轻挺进女教师的身体 | 麻豆AV无码精品一区二区 | 国产亚洲精品久久久无码狼牙套 | 嘟嘟嘟影院免费观看视频 | 女教师苍井空体肉女教师S242 | 久久婷婷色香五月综合激情 | 极品少妇高潮啪啪AV无码吴梦梦 | 麻豆精品传媒2021网站入口 | 菠萝菠萝蜜免费播放高清 | 91在线一区二区 | 国产福利视频在线观看福利 | 女性私密五月天 | 精品国内自产拍在线观看视频 | 亚洲AVAV天堂AV在线网爱情 | 亚洲欧美一区二区三区九九九 | 无限资源在线观看完整版免费下载 | 伊人狠狠丁香婷婷综合尤物 | 综合人妻久久一区二区精品 | 日本韩国欧美一区 | 精品国产自在自线官方 | 俄罗斯bbbbbbbbb大片 | 嫩草影院未满十八岁禁止入内 | 精品熟女少妇AV久久免费A片 | 日本久久频这里精品99 | 成人亚洲乱码在线 | 日日摸天天添天天添无码蜜臀 | 国产精品久久久久久免费字体 | 亚洲欧美精品一中文字幕 | 国产精品久久久久久久人热 | 两性午夜刺激爽爽视频 | 与嫂子同居的日子在线观看 | 久久综合中文字幕无码 | 免费人妻AV无码专区五月 | SM双性精跪趴灌憋尿调教H | 亚洲精品无码葡京AV天堂 | 久久精品国产免费播放 | 国产色婷婷精品人妻蜜桃成熟 |