Mybatis入門之mapper對映(案例Demo)
阿新 • • 發佈:2020-11-06
動態sql相關
mybatis支援強大的動態生成sql功能,提供了一些標籤實現動態sql拼接, 更加靈活。
mapper.xml的常用標籤(參考:https://www.cnblogs.com/coder-lzh/p/8960928.html):
標籤 | 描述 |
<mapper> |
根標籤,表示mapper需要對映的配置 |
<resultMap> |
指定返回集合的屬性,適合使用返回值是自定義實體類的情況 |
<constructor> |
<resultMap>中的子標籤,表示建構函式式宣告 |
<idArg> |
<constructor>的子標籤,表示實體主鍵 |
<sql> | 可以重用的 SQL 塊,也可以被其他語句引用,與<include>標籤結合使用,id必須唯一 |
<include> | 表示引用一個<sql>語句體,refid屬性指定<sql>標籤的id |
<insert>、<select>、<update>、<delete> | 分別對應C(create)R(read)U(update)D(delete) |
1.if標籤的使用,此種方式需要使用註解傳參(不使用註解的話test表示式裡面引數應該用value表示)
//1.動態sql之if Book queryOneByBookId(@Param("bookId")Integer bookId);
<if test="null!=bookId and ''!=bookId"> and id = #{bookId} </if>
2.trim標籤的使用,包含去除前後綴的操作,可以與if結合使用
<insert id="insertSelective" parameterType="com.star.model.Book" > insert into t_book_vue<!-- prefix:代表字首( suffix:代表字尾) suffixOverrides:去除末尾的字尾, prefixOverrides:去除開頭的字首 --> <trim prefix="(" suffix=")" suffixOverrides=","> <if test="id != null" > id, </if> <if test="bookname != null" > bookname, </if> <if test="price != null" > price, </if> <if test="booktype != null" > booktype, </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides="," > <if test="id != null" > #{id,jdbcType=INTEGER}, </if> <if test="bookname != null" > #{bookname,jdbcType=VARCHAR}, </if> <if test="price != null" > #{price,jdbcType=REAL}, </if> <if test="booktype != null" > #{booktype,jdbcType=VARCHAR}, </if> </trim> </insert>
3.foreach標籤的使用,可以迴圈遍歷標籤體的內容
<!-- foreach用法 --> <select id="queryBookByForeach" resultType="com.star.model.Book"> <include refid="base_query_list"/> and id in <!-- conllection:代表要迴圈的引數 item: 每一項的別名自定義 open:開頭字首 close: 結尾字尾 separator:每項之間插入字元 --> <foreach collection="list" item="id" open="(" close=")" separator=","> #{id} </foreach> <include refid="base_order"/> </select>
4.choose(when,otherwize) ,相當於java 語言中的 switch ,與 jstl 中的choose 很類似
<!-- id:唯一 parameterType:引數型別 resultType:返回型別 --> <select id="dynamicChooseTest" parameterType="com.star.model.Book" resultMap="BaseResultMap"> <include refid="base_query_list"/> <!-- 滿足表示式拼接標籤體sql語句 --> <choose> <when test="bookname != null"> and bookname like concat('%',#{bookname},'%') </when> <when test="booktype != null"> and booktype = #{booktype} </when> <otherwise> and 2 = 2 </otherwise> </choose> <include refid="base_order"/> </select>
5.where(主要是用來簡化sql語句中where條件判斷的,能智慧的處理 and or 條件)
<!-- id唯一 where標籤跟在表名的後面,與if標籤結合使用 --> <select id="dynamicWhereTest" parameterType="com.star.model.Book" resultMap="BaseResultMap"> select * from t_book_vue <where> <if test="bookname != null"> bookname = #{bookname} </if> <if test="booktype != null"> and booktype = #{booktype} </if> </where> </select>
6.set主要是用在更新操作的時候,它的主要功能和where元素其實是差不多的,主要是在包含的語句前輸出一個set,然後如果包含的語句是以逗號結束的話將會把該逗號忽略,如果set包含的內容為空的話則會出錯。有了set元素我們就可以動態的更新那些修改了的欄位
<!-- set標籤與where標籤大同小異 --> <update id="dynamicSetTest" parameterType="com.star.model.Book"> update t_book_vue <set> <if test="bookname != null"> bookname = #{bookname}, </if> <if test="booktype != null"> booktype = #{booktype}, </if> </set> where id = #{id} </update>