更多的語法請參考官網
http://www.mybatis.org/mybatis-3/dynamic-sql.html#
環境:MySQL5.6,jdk1.8
建議:所有的參數加上@Param
resultMap的意義:將查詢中得到的結果通過屬性的setter方法注入屬性里。如果未定義resultMap,則雖然數據庫查詢成功了但會返回null
insert
插入自增主鍵
如果設置了自增主鍵,那插入時,主鍵字段的值必須為0,否則不會自增;
插入字段后返回自增主鍵的值
<insert id="insert" parameterType="com.iss.blog.po.Article" useGeneratedKeys="true" keyProperty="article.articleId">
INSERT INTO ub_article
(article_id,......
article_create_time,article_modify_time
)
VALUES (#{article.articleId},#{article.userId},......
#{article.articleCreateTime,jdbcType=TIMESTAMP}, #{article.articleModifyTime,jdbcType=TIMESTAMP})
</insert>
設置useGeneratedKeys="true"並且制定主鍵keyProperty;這樣在插入成功后就會調用keyProperty的setter方法回填主鍵。注意,必須加上@Param,否則會報錯。
插入成功返回成功操作的條目數;失敗返回 0
插入時間字段
三步:
類字段使用java.util.Date,數據庫字段使用DATETIME,在插入的value值使用timestamp,比如#{article.articleCreateTime,jdbcType=TIMESTAMP}
MySQL5.7版本在時間字段上處理不好,如果有問題可以參考 mysql 5.7之后版本datetime默認值設置'0000-00-00'
不存在則插入
insert IGNORE into bd_article_tag_map (article_id,article_tag_id)
values (#{articleTagMap.articleId}, #{articleTagMap.articleTagId})
關鍵是設置數據庫字段為unique,這里設置了聯合2個字段unique;根據unique字段來判斷是否插入,插入成功返回操作成功的條目數,失敗返回 0;
update
如果字段非空,則更新
<update id="updateByArticleId" parameterType="com.iss.blog.po.Article">
UPDATE ub_article
<set>
<if test="articleTitle!=null">
article_title =#{articleTitle},
</if>
<if test="articleSummary!=null">
article_summary=#{articleSummary},
</if>
<if test="articleClick!=-1">
article_click=#{articleClick},
</if>
</set>
WHERE article_id=#{articleId}
</update>
注意:字段后面的逗號,不可省略
delete
foreach的用法
接口方法
public int deleteIfNotExist(@Param("articleId")int articleId,@Param("list") List<Integer> tagIdList);
xml
<delete id="deleteIfNotExist" parameterType="java.util.List">
DELETE FROM bd_article_tag_map
WHERE article_id=#{articleId}
AND article_tag_id NOT IN
<foreach item="item" index="index" collection="list" open="(" separator="," close=")">
#{item}
</foreach>
</delete>
select
left join 聯合查詢
join的意義:把兩個表的屬性加起來
left join 的意義:左表的屬性會全部顯示,右表的屬性缺少則填null
<select id="selectByArticleId" resultMap="TagResultMap" parameterType="int">
SELECT * FROM bd_article_tag t1
LEFT JOIN bd_article_tag_map t2 ON t1.article_tag_id = t2.article_tag_id
WHERE t2.article_Id = #{articleId}
</select>
下面的article_id字段在兩個表中都存在,必須加上表前綴;這里表前綴需要寫成表的別名,否則會報錯找不到此字段。
<select id="selectArticleListByArticleTagId" resultMap="ArticleResultMap" parameterType="int">
SELECT t1.article_id,user_id,article_archive_id,
article_title,
article_summary,article_click,article_status,
article_type,article_publish,article_original,
article_create_time,article_modify_time
FROM ub_article t1
LEFT JOIN bd_article_tag_map t2 ON t1.article_id = t2.article_id
WHERE t2.article_tag_id = #{articleTagId}
</select>
判斷語句
判斷是否為空
<if test="maxEprTestValueId != null">
</if>
注意,不能寫成NULL,否則報錯org.apache.ibatis.binding.BindingException: Parameter 'NULL' not found
大於等於
>=
小於等於
<=
