多表查询和动态SQL
文章目錄
- 多表查詢
- 結(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)成元素
| constructor | idArg 、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))
使用示例:
標(biāo)簽
trim標(biāo)簽可以
常用屬性有:
prefix: 添加指定前綴
prefixOverrides: 刪除指定前綴
suffixOverrides: 刪除指定后綴
示例一:用標(biāo)簽實(shí)現(xiàn)標(biāo)簽功能
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)題。
- 上一篇: 图解splay / splay模板 /
- 下一篇: mysql 查连接数,查看MySQL的连