Mybatis用法進階

環境:MySQL5.6,jdk1.8java

建議:全部的參數加上@Parammysql

resultMap的意義:將查詢中獲得的結果經過屬性的setter方法注入屬性裏。若是未定義resultMap,則雖然數據庫查詢成功了但會返回nullsql

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,不然會報錯。
插入成功返回 1;失敗返回 0code

插入時間字段

三步:
類字段使用java.util.Date,數據庫字段使用DATETIME,在插入的value值使用timestamp,好比#{article.articleCreateTime,jdbcType=TIMESTAMP}xml

MySQL5.7版本在時間字段上處理很差,若是有問題能夠參考 mysql 5.7以後版本datetime默認值設置'0000-00-00'blog

不存在則插入

insert IGNORE into bd_article_tag_map (article_id,article_tag_id)
        values (#{articleTagMap.articleId}, #{articleTagMap.articleTagId})

關鍵是設置數據庫字段爲unique,這裏設置了聯合2個字段unique;根據unique字段來判斷是否插入,插入成功返回 1,失敗返回 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>

注意:字段後面的逗號,不可省略it

delete

foreach的用法

接口方法io

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>
相關文章
相關標籤/搜索