(Mybatis)动态SQL
文章目錄
- 動態SQL
- 1.環境搭建
- 2.IF
- 3.choose (when, otherwise)
- 4.trim (where,set)
- 5.SQL片段
- 6.Foreach
動態SQL
動態SQL就是指根據不同的條件生成不同的SQL語句。
動態 SQL 元素和 JSTL 或基于類似 XML 的文本處理器相似。在 MyBatis 之前的版本中,有很多元素需要花時間了解。MyBatis 3 大大精簡了元素種類,現在只需學習原來一半的元素便可。MyBatis 采用功能強大的基于 OGNL 的表達式來淘汰其它大部分元素。
if
choose (when, otherwise)
trim (where, set)
foreach
1.環境搭建
創建表
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實體類
import lombok.Data;import java.util.Date; @Data public class Blog {private String id;private String title;private String author;private Date createTime;private int views;}編寫實體類對應Mapper接口 和 Mapper.XML文件
獲取隨機ID方法
//獲取隨機ID public class IdUtils {public static String getId(){return UUID.randomUUID().toString().replaceAll("-","");} }2.IF
1.編寫接口
List<Blog> queryBlogIF(Map<String,String> map);2.配置mapper
<select id="queryBlogIF" parameterType="map" resultType="Blog">select * from mybatis.blog <where><if test="title != null">and title = #{title}</if><if test="author != null">and author = #{author}</if></where></select>3.測試
@Testpublic void test1(){SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);Map<String,String> map = new HashMap<String, String>(); // map.put("author","我真的很不錯");map.put("title","Mybatis");List<Blog> blogs = mapper.queryBlogIF(map);for (Blog blog : blogs) {System.out.println(blog);}sqlSession.close();}查詢時,title不為空,author為空
查詢時,title為空,author不為空
3.choose (when, otherwise)
從多個條件中選擇一個使用,類似于java中的switch語句。
<select id="queryBlogChoose" parameterType="map" resultType="Blog">select * from mybatis.blog<where><choose><when test="title != null">title = #{title}</when><when test="author != null">author = #{author}</when><otherwise>views = #{views}</otherwise></choose></where></select>4.trim (where,set)
where 元素只會在子元素返回任何內容的情況下才插入 “WHERE” 子句。而且,若子句的開頭為 “AND” 或 “OR”,where 元素也會將它們去除。
<select id="queryBlogIF" parameterType="map" resultType="Blog">select * from mybatis.blog <where><if test="title != null">and title = #{title}</if><if test="author != null">and author = #{author}</if></where></select>set 元素會動態地在行首插入 SET 關鍵字,并會刪掉額外的逗號(這些逗號是在使用條件語句給列賦值時引入的)。
<update id="updateBlog" parameterType="map">update mybatis.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 prefix="WHERE" prefixOverrides="AND |OR ">... </trim> <trim prefix="SET" suffixOverrides=",">... </trim>prefixOverrides 屬性會忽略通過管道符分隔的文本序列(注意此例中的空格是必要的)。
5.SQL片段
將一些功能的部分抽取出來,方便復用
1.使用SQL標簽抽取公共的部分
2.在需要使用的地方使用Include標簽引用
<select id="queryBlogIF" parameterType="map" resultType="Blog">select * from mybatis.blog<where><include refid="if-title-author"></include></where></select>6.Foreach
foreach 元素的功能非常強大,它允許你指定一個集合,聲明可以在元素體內使用的集合項(item)和索引(index)變量。它也允許你指定開頭與結尾的字符串以及集合項迭代之間的分隔符。這個元素也不會錯誤地添加多余的分隔符,看它多智能!
提示 你可以將任何可迭代對象(如 List、Set 等)、Map 對象或者數組對象作為集合參數傳遞給 foreach。當使用可迭代對象或者數組時,index 是當前迭代的序號,item 的值是本次迭代獲取到的元素。當使用 Map 對象(或者 Map.Entry 對象的集合)時,index 是鍵,item 是值。
<select id="queryBlogForeach" parameterType="map" resultType="Blog">select * from mybatis.blogwhere id in<foreach collection="ids" item="id" open="("separator="," close=")">#{id}</foreach></select>測試
@Testpublic void test4(){SqlSession sqlSession = MybatisUtils.getSqlSession();BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);Map map = new HashMap();List<Integer> ids = new ArrayList<Integer>();ids.add(1);ids.add(2);map.put("ids",ids);List<Blog> blogs = mapper.queryBlogForeach(map);for (Blog blog : blogs) {System.out.println(blog);}sqlSession.close();}總結
以上是生活随笔為你收集整理的(Mybatis)动态SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Mybatis)复杂查询
- 下一篇: python连接mysql_Python