1、if
<if>動態標簽:判斷引數時滿足test指定的條件,如果滿足,就執行if(增加if標簽中的SQL陳述句);
注意:test里面使用的引數,可以是mybatis的默認引數,也可以是物體屬性名,但是不能是沒有指定別名的引數名(尤其是單個引數,也必須起別名,否則例外);
1.1 SQL
單獨使用if,如果不滿足條件會SQL拼接出問題,一般我門都跟where一起使用;
<!-- List<Anime> selectAnimesByConditionUserIf(@Param("cid") Integer cid,@Param("author") String author); -->
<select id="selectAnimesByConditionUserIf" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
where `create_date` < now()
<if test="cid != null and cid != 0 ">
cid = #{cid}
</if>
<if test="author != null">
and author like concat('%',#{author},'%')
</if>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` where `create_date` < now() and author like concat('%',?,'%')
1.2 測驗
@Test
public void testMybatisMapperDynamicSQlUserIf() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
//執行動態SQL,查詢動漫串列
List<Anime> animeList = animeMapper.selectAnimesByConditionUserIf(0, "土豆");
animeList.forEach(System.out::println);
}
2、where + if
-
<where><if> 動態標簽組合:當where標簽中,有if條件成立時,自動增加where關鍵字,如果所有的if都不成立,也不會多增加where關鍵字;
-
當where標簽中,if成立,增加的SQL陳述句,前面多出現一個and或者 or關鍵字,會被自動過濾(剔除),但是末尾出現的,不會被剔除;
-
where標簽中,也可以增加固定條件,再實際開發程序中,建議where標簽中,必須寫固定條件,不能全部寫if判斷;
2.1 SQL
<!-- List<Anime> selectAnimesByConditionUserIfWhere(@Param("cid") Integer cid,@Param("author") String author); -->
<select id="selectAnimesByConditionUserIfWhere" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<where>
<if test="cid != null and cid != 0 ">
and cid = #{cid}
</if>
<if test="author != null">
and author like concat('%',#{author},'%')
</if>
</where>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE author like concat('%',?,'%')
2.2 測驗
@Test
public void testMybatisMapperDynamicSQlUserIfWhere() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
//執行動態SQL,查詢動漫串列
List<Anime> animeList = animeMapper.selectAnimesByConditionUserIfWhere(0, "土豆");
animeList.forEach(System.out::println);
}
3、trim + if
- <trim> +<if> :可以實作動態SQL的定制操作,比如:where標簽無法屏蔽末尾多出來的and或者or關鍵字,前綴 和后綴增加的內容,只有標簽中的if標簽成立,(需要增加條件,才拼接where);
- prefix:增加前綴固定字串;
- prefixOverrides:前綴覆寫(自動剔除指定的關鍵字);
- suffix:增加后綴固定字串;
- suffixOverrides:后綴覆寫(自動剔除指定的關鍵字);
3.1 SQL
- "and |or" 中間一般都會添加一個空格;
<!-- List<Anime> selectAnimesByConditionUserIfTrim(@Param("cid") Integer cid,@Param("author") String author); -->
<select id="selectAnimesByConditionUserIfTrim" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<trim prefix=" where " prefixOverrides="and |or" suffixOverrides="and |or" suffix=";">
<if test="cid != null and cid != 0 ">
cid = #{cid} and
</if>
<if test="author != null">
author like concat('%',#{author},'%') and
</if>
</trim>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` where author like concat('%',?,'%') ;
3.2 測驗
@Test
public void testMybatisMapperDynamicSQlUserIfTerm() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
//執行動態SQL,查詢動漫串列
List<Anime> animeList = animeMapper.selectAnimesByConditionUserIfTrim(0, "土豆");
animeList.forEach(System.out::println);
}
4、set + if update
4.1SQL
<!-- int updateAnimeByConditionUserIfSet(Anime animeFOrm); -->
<update id="updateAnimeByConditionUserIfSet">
update `animes`
<set>
<if test="cid != null"> `cid` = #{cid},</if>
<if test="name != null"> `name` = #{name},</if>
<if test="author != null"> `author` = #{author},</if>
<if test="actor != null"> `actor` = #{actor},</if>
<if test="produce != null"> `produce` = #{produce},</if>
<if test="createDate != null"> `create_date` = #{createDate},</if>
</set>
where `id` = #{id}
</update>
執行SQL:
Preparing: update `animes` SET `name` = ?, `author` = ? where `id` = ?
4.2 測驗
@Test
public void testMybatisMapperDynamicSQlIfSetUpd() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
//模擬前端提供更新引數,實作動態更新,給說明值,就更新什么指端
Anime animeForm = new Anime();
animeForm.setId(637);
animeForm.setName("武動乾坤KGC");
animeForm.setAuthor("土豆KGC");
int row = animeMapper.updateAnimeByConditionUserIfSet(animeForm);
System.out.println(row);
}
5、trim + if update
5.1 SQL
<!-- int updateAnimeByConditionUserIfTrim(Anime animeFOrm); -->
<update id="updateAnimeByConditionUserIfTrim">
<trim prefix="update `animes` set " prefixOverrides="," suffixOverrides=",">
<if test="cid != null"> `cid` = #{cid},</if>
<if test="name != null"> `name` = #{name},</if>
<if test="author != null"> `author` = #{author},</if>
<if test="actor != null"> `actor` = #{actor},</if>
<if test="produce != null"> `produce` = #{produce},</if>
<if test="createDate != null"> `create_date` = #{createDate},</if>
</trim>
where `id` = #{id}
</update>
執行SQL:
Preparing: update `animes` set `name` = ?, `author` = ? where `id` = ?
5.2 測驗
@Test
public void testMybatisMapperDynamicSQlIfTrimUpd() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
//模擬前端提供更新引數,實作動態更新,給說明值,就更新什么指端
Anime animeForm = new Anime();
animeForm.setId(637);
animeForm.setName("武動乾坤22KGC");
animeForm.setAuthor("土豆22KGC");
int row = animeMapper.updateAnimeByConditionUserIfTrim(animeForm);
System.out.println(row);
}
6、where + choose + when (判斷條件測驗)
這個場景主要在傳過來的引數,與放進SQL中的引數不一致的時候使用;
比如,前端傳過來男/女,但是資料庫中查詢的時候需要使用1/2;(當然引數也可以在前端或者業務層處理好再放進SQL)
6.1 單引號與雙引號的區別
6.1.1 test='cid != null and cid == "1"'
test整體用單引號,里面的判斷條件雙引號;
<!--List<Anime> selectAnimesByConditionUserChooseWhenOtherwise(@Param("cid") String cid); -->
<select id="selectAnimesByConditionUserChooseWhenOtherwise" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<where>
<choose>
<!-- test整體使用單引號,判斷條件使用雙引號 -->
<when test='cid != null and cid == "1"'>
and cid = 1
</when>
<when test='cid != null and cid == "2"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
</where>
</select>
6.1.1 測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.1.2 test="cid != null and cid == '1'"
test整體用雙引號,里面的判斷條件單引號;
...
<choose>
<!-- test整體使用雙引號,判斷條件使用單引號 -->
<when test="cid != null and cid == '1'">
and cid = 1
</when>
<when test="cid != null and cid == '2'">
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
6.1.2 測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("2");
執行SQL:
-- SQL沒有報錯,但是 cid == 2 的條件沒有成立,而是走了默認引數 cid = 3
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 3
-- 可以查到資料,但是資料不正確,是cid=3的資料
Anime(id=301, cid=3, name=完美世界, author=辰東, actor=石昊, produce=玄機科技, createDate=Tue Apr 05 00:00:00 CST 2022)
6.1.3 單引號和雙引號總結
總結:test整體用單引號,里面的判斷條件雙引號;
6.2 == 和 eq 的區別
6.2.1 ==
...
<choose>
<when test='cid != null and cid == "1"'>
and cid = 1
</when>
<when test='cid != null and cid == "2"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
6.2.1 測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.2.2 eq
...
<choose>
<when test='cid != null and cid eq "1"'>
and cid = 1
</when>
<when test='cid != null and cid eq "2"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
6.2.2 測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.3 "str" 和 "str".toString() 的區別
6.3.1 "2" 和 "2"toString()
"2"
...
<choose>
<when test='cid != null and cid eq "1"'>
and cid = 1
</when>
<when test='cid != null and cid eq "2"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
"2".toString()
...
<choose>
<when test='cid != null and cid eq "1".toString()'>
and cid = 1
</when>
<when test='cid != null and cid eq "2".toString()'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.3.2 "B" 和 "B".toString() 的區別
"B"
...
<choose>
<when test='cid != null and cid eq "A"'>
and cid = 1
</when>
<when test='cid != null and cid eq "B"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("B");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
"B".toString()
...
<choose>
<when test='cid != null and cid eq "A".toString()'>
and cid = 1
</when>
<when test='cid != null and cid eq "B".toString()'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("B");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.3.3 "22" 和 "22".toString()
"22"
<choose>
<when test='cid != null and cid eq "11"'>
and cid = 1
</when>
<when test='cid != null and cid eq "22"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("22");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
"22".toString()
...
<choose>
<when test='cid != null and cid eq "11"toString()'>
and cid = 1
</when>
<when test='cid != null and cid eq "22"toString()'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("22");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.3.4 "BB" 和 "BB".toString()
"BB"
...
<choose>
<when test='cid != null and cid eq "AA"'>
and cid = 1
</when>
<when test='cid != null and cid eq "BB"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("BB");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
"BB".toString()
...
<choose>
<when test='cid != null and cid eq "AA".toString()'>
and cid = 1
</when>
<when test='cid != null and cid eq "BB".toString()'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("BB");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.3.5 "任意字符2" 和 "任意字符2".toString()
"任意字符2"
...
<choose>
<when test='cid != null and cid eq "任意字符1"'>
and cid = 1
</when>
<when test='cid != null and cid eq "任意字符2"'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("任意字符2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
"任意字符2".toString()
...
<choose>
<when test='cid != null and cid eq "任意字符1".toString()'>
and cid = 1
</when>
<when test='cid != null and cid eq "任意字符2".toString()'>
and cid = 2
</when>
<otherwise>
and cid = 3
</otherwise>
</choose>
...
測驗
List<Anime> animeList = animeMapper.selectAnimesByConditionUserChooseWhenOtherwise("任意字符2");
執行SQL:
-- SQL正常
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE cid = 2
-- 可以查到正確資料
Anime(id=201, cid=2, name=海賊王, author=尾田, actor=路飛, produce=騰訊動漫, createDate=Tue Apr 05 00:00:00 CST 2022)
Anime(id=627, cid=2, name=魁拔3, author=青春樹, actor=蠻吉, produce=青春樹, createDate=Tue Jan 07 00:00:00 CST 2003)
6.4 總結
只需要將test整體用單引號,里面的判斷條件雙引號,就可以,加不加.toString(),并不影響;
7、foreach
根據id集合查詢動漫集合;
7.1 SQL
7.1.1 起別名 where + foreach (in)
使用 in;
<!--List<Anime> selectAnimesByConditionUserForeach(@Param("ids") List<Integer> ids);-->
<select id="selectAnimesByConditionUserForeach" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<where>
<foreach collection="ids" item="id" open="id in(" close=" )" separator=", ">
#{id}
</foreach>
</where>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE id in( ? , ? , ? )
7.1.2 不起別名 where + foreach (in)
使用 in;
<!-- List<Anime> selectAnimesByConditionUserForeach( List<Integer> ids); -->
<select id="selectAnimesByConditionUserForeach" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<where>
<foreach collection="list" item="id" open="id in(" close=" )" separator=", ">
#{id}
</foreach>
</where>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` WHERE id in( ? , ? , ? )
7.1.3 起別名 foreach (in)
不用where標簽;
使用 in;
<!--List<Anime> selectAnimesByConditionUserForeach(@Param("ids") List<Integer> ids);-->
<select id="selectAnimesByConditionUserForeach" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<foreach collection="ids" item="id" open=" where id in(" close=" )" separator=", ">
#{id}
</foreach>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` where id in( ? , ? , ? )
7.1.4 起別名 trim + foreach (in)
不用where標簽;
使用 in;
通過7.1.3和7.1.4 可以總結,trim 和 foreach 都有前綴,后綴和分隔符,可以根據情況進項選擇使用;
<!--List<Anime> selectAnimesByConditionUserForeach(@Param("ids") List<Integer> ids);-->
<select id="selectAnimesByConditionUserForeach" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<trim prefix=" where id in ">
<foreach collection="ids" item="id" open=" (" close=" )" separator=", ">
#{id}
</foreach>
</trim>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` where id in ( ? , ? , ? )
7.1.5 起別名 foreach (or)
不用where標簽;
使用 or;
<!--List<Anime> selectAnimesByConditionUserForeach(@Param("ids") List<Integer> ids);-->
<select id="selectAnimesByConditionUserForeach" resultType="com.kgc.mybatis.bean.Anime">
select `id`,
`cid`,
`name`,
`author`,
`actor`,
`produce`,
`create_date`
from `animes`
<foreach collection="ids" item="id" open=" where " close=" " separator=" or ">
id = #{id}
</foreach>
</select>
執行SQL:
Preparing: select `id`, `cid`, `name`, `author`, `actor`, `produce`, `create_date` from `animes` where id = ? or id = ? or id = ?
7.2 測驗
@Test
public void testMybatisMapperDynamicSQlUserForeach() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
//執行動態SQL,查詢動漫串列
List<Anime> animeList = animeMapper.selectAnimesByConditionUserForeach(Arrays.asList(101,102,103));
animeList.forEach(System.out::println);
}
8、trim + if insert
8.1 SQL
<!-- int insertAnimeByConditionIfTrim(Anime animeForm); -->
<insert id="insertAnimeByConditionIfTrim">
<trim prefix="insert into `animes` ( " suffix=")" suffixOverrides=",">
<if test="cid != null"> `cid`,</if>
<if test="name != null"> `name`,</if>
<if test="author != null"> `author`,</if>
<if test="actor != null"> `actor`,</if>
<if test="produce != null"> `produce`,</if>
<if test="createDate != null"> `create_date`,</if>
</trim>
<trim prefix="values ( " suffix=")" suffixOverrides=",">
<if test="cid != null"> #{cid},</if>
<if test="name != null"> #{name},</if>
<if test="author != null"> #{author},</if>
<if test="actor != null"> #{actor},</if>
<if test="produce != null"> #{produce},</if>
<if test="createDate != null"> #{createDate},</if>
</trim>
</insert>
執行SQL:
insert into `animes` ( `cid`, `name`, `author`, `actor`, `produce` ) values ( ?, ?, ?, ?, ? )
8.2 測驗
@Test
public void testMybatisMapperDynamicSQlIfTrimInsert() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
Anime animeForm = new Anime();
animeForm.setCid(1);
animeForm.setName("知否知否");
animeForm.setAuthor("關心則亂");
animeForm.setActor("明蘭");
animeForm.setProduce("優酷");
//指定if+ trim 冬天SQL,新增動漫
int row = animeMapper.insertAnimeByConditionIfTrim(animeForm);
System.out.println(row);
}
9、@ Select
使用注釋添加動漫;
9.1 SQL
@Select("select `id`,`cid`,`name`,`author`,`actor`,`produce`,`create_date` from `animes` where id = #{id} ")
Anime selectAnimesByConditionUserAnnotationSelect(Integer id);
執行SQL:
Preparing: select `id`,`cid`,`name`,`author`,`actor`,`produce`,`create_date` from `animes` where id = ?
9.2 測驗
@Test
public void testAnimesByConditionUserAnnotationSelect() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
Anime anime = animeMapper.selectAnimesByConditionUserAnnotationSelect(653);
System.out.println(anime);
}
10、@Delete 批量洗掉
10.1 SQL
@Delete({"<script>",
"delete from `animes`",
"<foreach collection='ids' item='id' open=' where id in ( ' close= ' ) ' separator= ' , '> " ,
" #{id} ",
"</foreach>" ,
"</script>"})
int deleteAnimesByConditionUserAnnotationDelete(@Param("ids") List<Integer> ids);
執行SQL:
Preparing: delete from `animes` where id in ( ? , ? , ? )
10.2 測驗
@Test
public void testDeleteAnimesByConditionUserAnnotationDelete() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
int row = animeMapper.deleteAnimesByConditionUserAnnotationDelete(Arrays.asList(649, 651, 652));
System.out.println(row);
}
11、批量加入動漫分類
11.1 SQL
<!-- int insertCategoryBatchUserFoeEach(List<Category> categoryList) -->
<!-- int insertCategoryBatchUserFoeEach(@Param("categoryList") List<Category> categoryList); -->
<insert id="insertCategoryBatchUserFoeEach" >
insert into `category` (`name`) values
<!--
默認引數:collection(不自定義引數名的時候可以使用Available parameters are [collection, list])
自定義引數:categoryList
-->
<foreach collection="collection" item="category" separator=", ">
(#{category.name})
</foreach>
</insert>
執行SQL:
Preparing: insert into `category` (`name`) values (?) , (?) , (?)
11.2 測驗
@Test
public void testInsertCategoryBatchUserFoeEach() throws IOException {
SqlSession defaultSqlSession = getSqlSessionFactory().openSession(true);
//獲取mapper介面的代理實作類物件
AnimeMapper animeMapper = defaultSqlSession.getMapper(AnimeMapper.class);
Category category1 = new Category();
Category category2 = new Category();
Category category3 = new Category();
category1.setName("aaa");
category2.setName("bbb");
category3.setName("ccc");
List<Category> categoryList = new ArrayList<>();
categoryList.add(category1);
categoryList.add(category2);
categoryList.add(category3);
int row = animeMapper.insertCategoryBatchUserFoeEach(categoryList);
System.out.println(row);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/502619.html
標籤:其他
上一篇:你是怎么學習Python的?花了多長時間?來說說你的學習方法。
下一篇:創建執行緒有幾種方式?
