多表查询和动态SQL
文章目錄
- 多表查詢
- 結果集映射
- resultmap構成元素
- 先在Mapper文件中,配置基本的sql語句
- 配置resultMap標簽,映射不同的字段和屬性名
- 動態SQL
- if標簽
- choose\when\otherwise標簽
- 標簽
- 標簽
- 標簽
- 動態SQL支持標簽
多表查詢
結果集映射
resultmap是mybatis中最復雜的元素之一,它描述如何從結果集中加載對象,主要作用是定義映射規則、級聯的更新、定制類型轉化器。
resultmap構成元素
| constructor | idArg 、arg | 用于配置構造器方法 |
| id | 將結果集標記為id,以方便全局調用 | |
| result | 配置POJO到數據庫列名映射關系 | |
| association | 級聯使用 | 代表一對一關系 |
| collection | 級聯使用 | 代表一對多關系 |
| discriminator | 級聯使用 | 鑒別器 根據實際選擇實例,可以通過特定條件確定結果集 |
association 和 collection 完成一對一和一對多以及多對多的高級映射
先在Mapper文件中,配置基本的sql語句
<!-- 查詢所有的數據 --><!-- resultMap:填入配置的resultMap標簽的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標簽,映射不同的字段和屬性名
<!-- id:設置ResultMap的id --><resultMap id="book" type="com.lanou3g.mybatis.bean.Book"><!-- 定義主鍵 ,非常重要。如果是多個字段,則定義多個id --><!-- property:主鍵在pojo中的屬性名 --><!-- column:主鍵在數據庫中的列名 --><id column="bid" property="id" /><!-- resultMap最終還是要將結果映射到pojo上,type就是指定映射到哪一個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>動態SQL
if標簽
使用if實現簡單的條件判斷。
<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字段也是動態拼接的,那這里就有問題了,比如我三個條件都沒有時,拼出來的sql語句就是SELECT * FROM BLOG WHERE顯然是無法執行的,這就要用到我們的where標簽
choose 元素
choose\when\otherwise標簽
有時我們不想應用到所有的條件語句,而只想從中擇其一項。針對這種情況,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>標簽
當我們拼接動態SQL時,如果一個查詢條件都沒有,那我們就不需要where子句,而如果有至少一個條件我們就需要where子句。這樣,我們就需要做個判斷,而mybatis里的標簽就省去了我們自己做這個判斷。 使用示例:
<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>當一個查詢條件都沒有拼接時, mybatis會自動將where關鍵字和拼接多個條件之間的諸如AND、OR這些多余的關鍵字去掉
標簽
set 元素會動態前置 SET 關鍵字,同時也會刪掉無關的逗號(如:語句最后的逗號)
使用示例:
標簽
trim標簽可以
常用屬性有:
prefix: 添加指定前綴
prefixOverrides: 刪除指定前綴
suffixOverrides: 刪除指定后綴
示例一:用標簽實現標簽功能
prefixOverrides的作用是移除字符串開頭的內容中所有指定在 prefixOverrides 屬性中的內容,并且插入 prefix 屬性中指定的內容。
示例二: 用標簽實現標簽功能
<trim prefix="SET" suffixOverrides=",">... </trim>注意這里我們刪去的是后綴值,同時添加了前綴值。
動態SQL支持標簽
| if | 判斷語句 | 單條件分支 |
| choose(when、otherwise) | 相當于 Java 中的 if else | 多條件分支 |
| trim(where、set) | 輔助元素 | 用于處理 SQL 拼接問題 |
| foreach | 循環語句 | 批量插入, 更新, 查詢時經常用到 |
| bind | 創建一個變量, 并綁定到上下文中 | 用于兼容不同的數據庫, 防止 SQL 注入等 |
總結
以上是生活随笔為你收集整理的多表查询和动态SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解splay / splay模板 /
- 下一篇: P3369 【模板】普通平衡树(fhq