日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

多表查询和动态SQL

發(fā)布時(shí)間:2023/12/18 数据库 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多表查询和动态SQL 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 多表查詢
    • 結(jié)果集映射
    • resultmap構(gòu)成元素
    • 先在Mapper文件中,配置基本的sql語(yǔ)句
    • 配置resultMap標(biāo)簽,映射不同的字段和屬性名
  • 動(dòng)態(tài)SQL
    • if標(biāo)簽
    • choose\when\otherwise標(biāo)簽
    • 標(biāo)簽
    • 標(biāo)簽
    • 標(biāo)簽
  • 動(dòng)態(tài)SQL支持標(biāo)簽

多表查詢

結(jié)果集映射

resultmap是mybatis中最復(fù)雜的元素之一,它描述如何從結(jié)果集中加載對(duì)象,主要作用是定義映射規(guī)則、級(jí)聯(lián)的更新、定制類型轉(zhuǎn)化器。

resultmap構(gòu)成元素

元素子元素作用
constructoridArg 、arg用于配置構(gòu)造器方法
id將結(jié)果集標(biāo)記為id,以方便全局調(diào)用
result配置POJO到數(shù)據(jù)庫(kù)列名映射關(guān)系
association級(jí)聯(lián)使用代表一對(duì)一關(guān)系
collection級(jí)聯(lián)使用代表一對(duì)多關(guān)系
discriminator級(jí)聯(lián)使用鑒別器 根據(jù)實(shí)際選擇實(shí)例,可以通過(guò)特定條件確定結(jié)果集

association 和 collection 完成一對(duì)一和一對(duì)多以及多對(duì)多的高級(jí)映射

先在Mapper文件中,配置基本的sql語(yǔ)句

<!-- 查詢所有的數(shù)據(jù) --><!-- resultMap:填入配置的resultMap標(biāo)簽的id值 --><select id="queryBooks" resultMap="book">select b.*,bt.*, b.id bid, bt.id bt_id from book b, booktype bt where b.btype = bt.id;</select>

配置resultMap標(biāo)簽,映射不同的字段和屬性名

<!-- id:設(shè)置ResultMap的id --><resultMap id="book" type="com.lanou3g.mybatis.bean.Book"><!-- 定義主鍵 ,非常重要。如果是多個(gè)字段,則定義多個(gè)id --><!-- property:主鍵在pojo中的屬性名 --><!-- column:主鍵在數(shù)據(jù)庫(kù)中的列名 --><id column="bid" property="id" /><!-- resultMap最終還是要將結(jié)果映射到pojo上,type就是指定映射到哪一個(gè)pojo --><result column="bname" property="bname" /><result column="author" property="author" /><result column="author_gender" property="authorGender" /><result column="price" property="price" /><result column="description" property="description" /><association property="bookType" javaType="com.lanou3g.mybatis.bean.BookType"><id column="bt_id" property="id" /><result column="tname" property="tname" /></association></resultMap>

動(dòng)態(tài)SQL

if標(biāo)簽

使用if實(shí)現(xiàn)簡(jiǎn)單的條件判斷。

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG WHERE state = ‘ACTIVE’<if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if> </select>

如果我們的state字段也是動(dòng)態(tài)拼接的,那這里就有問(wèn)題了,比如我三個(gè)條件都沒(méi)有時(shí),拼出來(lái)的sql語(yǔ)句就是SELECT * FROM BLOG WHERE顯然是無(wú)法執(zhí)行的,這就要用到我們的where標(biāo)簽
choose 元素

choose\when\otherwise標(biāo)簽

有時(shí)我們不想應(yīng)用到所有的條件語(yǔ)句,而只想從中擇其一項(xiàng)。針對(duì)這種情況,MyBatis 提供了 choose 元素,它有點(diǎn)像 Java 中的 switch 語(yǔ)句。

使用示例:

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

標(biāo)簽

當(dāng)我們拼接動(dòng)態(tài)SQL時(shí),如果一個(gè)查詢條件都沒(méi)有,那我們就不需要where子句,而如果有至少一個(gè)條件我們就需要where子句。這樣,我們就需要做個(gè)判斷,而mybatis里的標(biāo)簽就省去了我們自己做這個(gè)判斷。 使用示例:

<select id="findActiveBlogLike"resultType="Blog">SELECT * FROM BLOG<where><if test="state != null">state = #{state}</if><if test="title != null">AND title like #{title}</if><if test="author != null and author.name != null">AND author_name like #{author.name}</if></where> </select>

當(dāng)一個(gè)查詢條件都沒(méi)有拼接時(shí), mybatis會(huì)自動(dòng)將where關(guān)鍵字和拼接多個(gè)條件之間的諸如AND、OR這些多余的關(guān)鍵字去掉

標(biāo)簽

set 元素會(huì)動(dòng)態(tài)前置 SET 關(guān)鍵字,同時(shí)也會(huì)刪掉無(wú)關(guān)的逗號(hào)(如:語(yǔ)句最后的逗號(hào))
使用示例:

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

標(biāo)簽

trim標(biāo)簽可以
常用屬性有:

prefix: 添加指定前綴
prefixOverrides: 刪除指定前綴
suffixOverrides: 刪除指定后綴
示例一:用標(biāo)簽實(shí)現(xiàn)標(biāo)簽功能

<trim prefix="WHERE" prefixOverrides="AND |OR ">... </trim>

prefixOverrides的作用是移除字符串開(kāi)頭的內(nèi)容中所有指定在 prefixOverrides 屬性中的內(nèi)容,并且插入 prefix 屬性中指定的內(nèi)容。

示例二: 用標(biāo)簽實(shí)現(xiàn)標(biāo)簽功能

<trim prefix="SET" suffixOverrides=",">... </trim>

注意這里我們刪去的是后綴值,同時(shí)添加了前綴值。

動(dòng)態(tài)SQL支持標(biāo)簽

元素作用備注
if判斷語(yǔ)句單條件分支
choose(when、otherwise)相當(dāng)于 Java 中的 if else多條件分支
trim(where、set)輔助元素用于處理 SQL 拼接問(wèn)題
foreach循環(huán)語(yǔ)句批量插入, 更新, 查詢時(shí)經(jīng)常用到
bind創(chuàng)建一個(gè)變量, 并綁定到上下文中用于兼容不同的數(shù)據(jù)庫(kù), 防止 SQL 注入等

總結(jié)

以上是生活随笔為你收集整理的多表查询和动态SQL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。