Mybatis各语句高级用法

Posted 左耳东白水泉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis各语句高级用法相关的知识,希望对你有一定的参考价值。

更多的语法请参考官网

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

大于等于

>=

小于等于

&lt;=

以上是关于Mybatis各语句高级用法的主要内容,如果未能解决你的问题,请参考以下文章

SQL Select 语句的用法

MyBatis动态SQL标签用法

每天玩转3分钟 MyBatis-Plus - 6. select 用法

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段

mybatis源码阅读-高级用法

mybatis学习日志二