zoukankan      html  css  js  c++  java
  • 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;=
    
  • 相关阅读:
    Jira 8.5.1 安装教程
    Postgres 10.11安装教程
    SonarQube 7.7 安装教程
    Apollo基于K8S的部署以及接入
    Nexus 安装教程
    Drone 安装教程
    Harbor 安装教程
    Gitlab 11.9.1 高可用教程
    Gitlab 11.9.1 安装教程
    大明的FAQ
  • 原文地址:https://www.cnblogs.com/chenjingquan/p/8973507.html
Copyright © 2011-2022 走看看