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;=
    
  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/chenjingquan/p/8973507.html
Copyright © 2011-2022 走看看