動態SQL
什么是動態SQL:就是指根據不同條件生成不同的SQL陳述句

使用動態 SQL 并非一件易事,但借助可用于任何 SQL 映射陳述句中的強大的動態 SQL 語言,MyBatis 顯著地提升了這一特性的易用性,
如果你之前用過 JSTL 或任何基于類 XML 語言的文本處理器,你對動態 SQL 元素可能會感覺似曾相識,在 MyBatis 之前的版本中,需要花時間了解大量的元素,借助功能強大的基于 OGNL 的運算式,MyBatis 3 替換了之前的大部分元素,大大精簡了元素種類,現在要學習的元素種類比原來的一半還要少,
if
choose (when, otherwise)
trim (where, set)
foreach
搭建環境
CREATE TABLE `blog`(
`id` VARCHAR(50) NOT NULL COMMENT '博客id',
`title` VARCHAR(100) NOT NULL COMMENT '博客標題',
`author` VARCHAR(30) NOT NULL COMMENT '博客作者',
`create_time` DATETIME NOT NULL COMMENT '創建時間',
`views` INT(30) NOT NULL COMMENT '瀏覽量'
)ENGINE=INNODB DEFAULT CHARSET=utf8;
創建一個基礎工程
1.導包
2.撰寫組態檔
? 這里注意核心組態檔的一個設定:

像資料庫中是下劃線命名的,而物體類是標準駝峰命名的這種經典的,就沒必要使用resultMap做映射了,只需要在核心組態檔加上下面的配置就行:
<settings>
<!--標準的日志工廠實作-->
<setting name="logImpl" value="https://www.cnblogs.com/laiyw/p/STDOUT_LOGGING"/>
<!--是否開啟駝峰命名自動映射-->
<setting name="mapUnderscoreToCamelCase" value="https://www.cnblogs.com/laiyw/p/true"/>
</settings>

3.撰寫物體類
@Data
public class Blog {
private String id;
private String title;
private String author;
private Date createTime;
private int views;
}
4.撰寫物體類對應Mapper介面和Mapper.xml檔案,并通過介面插入資料
@Test
public void addBlogTest() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Blog blog = new Blog();
blog.setId(IDUtils.getId());
blog.setTitle("Mybatis如此簡單");
blog.setAuthor("狂神說");
blog.setCreateTime(new Date());
blog.setViews(9999);
mapper.addBlog(blog);
blog.setId(IDUtils.getId());
blog.setTitle("Java如此簡單");
mapper.addBlog(blog);
blog.setId(IDUtils.getId());
blog.setTitle("Spring如此簡單");
mapper.addBlog(blog);
blog.setId(IDUtils.getId());
blog.setTitle("微服務如此簡單");
mapper.addBlog(blog);
sqlSession.close();
}

IF
注意: IF標簽能包含多個條件,但是choose標簽只能匹配一個條件!
<select id="queryBlogIF" parameterType="map" resultType="Blog">
select * from blog where 1=1
<if test="title != null">
and title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</select>
choose (when, otherwise)
choose(when,otherwise):相當于java里面的switch陳述句,只選擇匹配的一個條件來執行,而且第一個when匹配上了就直接回傳sql子陳述句,根java里面的switch陳述句一個原理!
<select id="queryBlogChoose" parameterType="map" resultType="Blog">
select * from blog
<where>
<choose>
<when test="title != null">
title = #{title}
</when>
<when test="author != null">
and author = #{author}
</when>
<otherwise>
and views = #{views}
</otherwise>
</choose>
</where>
</select>
trim (where, set)
where標簽:平常我們寫sql要動態拼接得話,要保證sql不拼接錯,會使用where 1=1來保證,但是Mybatis中還可以用where標簽,它會檢測它標簽中回傳的子陳述句的若以and或or開頭,where標簽會將它們去掉,保證sql拼接無誤,若沒有則直接拼上!
而且where標簽內沒有sql子陳述句回傳,則where關鍵詞都不會拼上!
select * from blog
<where>
<if test="title != null">
title = #{title}
</if>
<if test="author != null">
and author = #{author}
</if>
</where>
set標簽: 它會將set標簽里面的sql子陳述句拼接到主sql中,如果sql子陳述句的最后有逗號的情況下,它會將子sql陳述句最后的逗號給自動去除,保證sql的正確拼接!
<update id="updateBlog" parameterType="map">
update blog
<set>
<if test="title != null">
title = #{title},
</if>
<if test="author != null">
author = #{author}
</if>
</set>
where id= #{id}
</update>
trim標簽:其實where和set標簽都是屬于trim標簽,trim標簽可以自定義像where標簽和set標簽一樣的功能,
<trim prefix="" prefixOverrides="" suffix="" suffixOverrides="">
</trim>
比如:
下面這條trim標簽的意思:
? 這個相當于where標簽,prefix是為trim標簽里面的sql子陳述句加上前綴where,prefixOverrides表示如果子陳述句以and或者or開始,則用where覆寫掉!
prefix:前綴
prefixOverrides :前綴覆寫
<trim prefix="WHERE" prefixOverrides="AND |OR ">
...
</trim>
這條trim意思:相當于set標簽,prefix是為trim標簽里面的sql子陳述句加上前綴where,suffixOverrides表示如果子陳述句以逗號結尾,由于沒有指定suffix,好像的意思就是用suffix=""把逗號給覆寫掉,也即去除結尾的逗號!
<trim prefix="SET" suffixOverrides=",">
...
</trim>
所謂的動態SQL,本質還是SQL陳述句,只是我們可以在SQL層面去執行邏輯代碼!
這篇文章的原始碼在Mybatis-study工程的mybatis-08模塊下!,后面會給出碼云地址,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/282515.html
標籤:Java
上一篇:類
