更多的语法请参考官网

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各语句高级用法(未完待续)的更多相关文章

  1. 我的SQL总结---未完待续

    我的SQL总结---未完待续 版权声明:本文为博主原创文章,未经博主允许不得转载. 总结: 主要的SQL 语句: 数据操作(select, insert, delete, update) 访问控制(g ...

  2. 一篇文章让Oracle程序猿学会MySql【未完待续】

    一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方 ...

  3. Go web编程学习笔记——未完待续

    1. 1).GOPATH设置 先设置自己的GOPATH,可以在本机中运行$PATH进行查看: userdeMacBook-Pro:~ user$ $GOPATH -bash: /Users/user/ ...

  4. Hibernate二级缓存(未完待续)

    1.Hibernate的cache介绍: Hibernate实现了良好的Cache机制,可以借助Hibernate内部的Cache迅速提高系统的数据读取性能.Hibernate中的Cache可分为两层 ...

  5. MVC丶 (未完待续······)

         希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                     ...

  6. 2017-2-17,c#基础,输入输出,定义变量,变量赋值,int.Parse的基础理解,在本的初学者也能看懂(未完待续)

    计算机是死板的固定的,人是活跃的开放的,初学c#第一天给我的感觉就是:用人活跃开放式的思维去与呆萌的计算机沟通,摸清脾气,有利于双方深入合作,这也是今晚的教训,细心,仔细,大胆 c#基础 1.Hell ...

  7. AutoMapper介绍(未完待续、部分没实现)

    实体间转换工具.其实也可以用Json来实现同名属性.异名属性(用JsonProperty指明)的自动转换 最新版本6.11 需要使用vs2013以上.vs2012下载新版 nuget会遇到问题.只能旧 ...

  8. java泛型基础、子类泛型不能转换成父类泛型--未完待续

    参考http://how2j.cn/k/generic/generic-generic/373.html 1.使用泛型的好处:泛型的用法是在容器后面添加<Type>Type可以是类,抽象类 ...

  9. [document.cookie]为什么cookie不在window下的呢.奇怪了[未完待续]

    什么是cookie,怎么就叫cookis,它能干嘛 我猜吧,就是登录页面的时候传值,二次登录的时候可以给你说句'hello xxx'; 下面这堆比较啰嗦,随意看吧 //cookie 用户储存在用户本地 ...

随机推荐

  1. [站点推荐]001.学习新技能的37个最佳网站(The 37 Best Websites To Learn Something New)

    忘了过于褒奖的学校.整天呆在拥挤的教室而效果却差得可怜.这些网站和应用涵盖了科学.艺术和技术的无数话题.它们可以教会你实践练习任何技能,从制作豆 沙到用 node.js 开发 app,而且它们都是免费 ...

  2. 跟着阿里学JavaDay01——Java编程环境搭建

    一.下载并完成JDK的安装 我们要学习Java就需要下载JDK.因为JDK是Java的开发工具. JDK的获取可以通过官方网站下载:JDK下载地址(这里我们下载Java SE10的版本) JDK下载完 ...

  3. PHP常量和数据类型

    引言 先用一个题来作为开端:PHP字符串的三种定义方式是什么?有什么区别? 它们分别是单引号'',双引号"",newdoc和heredoc. 区别是:单引号不能解析变量,不能解析转 ...

  4. JDBC化繁为简

    众所周知,jdbc可谓是java连接数据库最基本的方法,通过DriverManager拿到connection,再从connection拿到statement,再从statement中进一步操作得到结 ...

  5. Java实现 LeetCode 744 寻找比目标字母大的最小字母(二分法)

    744. 寻找比目标字母大的最小字母 给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母. 在比较时,数组里字母的是循环有序的.举个例 ...

  6. Java实现 LeetCode 380 常数时间插入、删除和获取随机元素

    380. 常数时间插入.删除和获取随机元素 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构. insert(val):当元素 val 不存在时,向集合中插入该项. remove( ...

  7. Java实现 LeetCode 287 寻找重复数

    287. 寻找重复数 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 ...

  8. IDEA突然无法运行

    可能是你类的main方法被idea的智能提示改了 PS: 小编经常用智能提示,它给我把main方法的static关键字删掉了好几次,当时怎么也没想到是把main方法改了 ~难受

  9. Java实现台阶问题

    1 问题描述 一个台阶总共有n级,如果一次可以跳1级,也可以跳2级,求总共有多少种跳法. 2 解决方案 2.1 递归法 如果整个台阶只有1级,则显然只有一种跳法.如果台阶有2级,则有两种跳法:一种是分 ...

  10. java实现算年龄

    英国数学家德摩根出生于19世纪初叶(即18xx年). 他年少时便很有才华.一次有人问他的年龄,他回答说: "到了x的平方那年,我刚好是x岁". 请你计算一下,德摩根到底出生在哪一年 ...