一、前言

将数据存储到数据库是开发中很重要的一环。曾经有程序员说自己做过最牛逼的事情就是增删改查。确实我们做了很多页面,后太代码写了很多,可是最终都离不开数据库的增删改查。Java有一套自己的JPA标准,而Hibernate很好的实现了这套标准,但为什么会有企业会选择MyBatis进行开发?Hibernate入门的门槛相对较高,而MyBatis上手容易,同时灵活,平常怎么在数据库使用SQL语句,很容易的就可以移植到MyBatis的XML文件里,灵活使得实际开发中更加方便。

二、简单的增删改查

MyBatis中需要将SQL语句封装到XML文件的标签中,无论是简单的增删改查,还是复杂的查询,这种模式都是行之有效的。当然从整体上来看,这种有序地排列SQL语句是一个非常好的结果,在理想的情况下,并没有问题。然而实际上,有的项目会用几十个字段,一个单一业务模块背后的SQL代码可能达到上千行,同时有可能没有注释,这样子想找一条已经存在有合用的SQL语句是非常麻烦的事情,同时也很容易造成重复编写相同、相似SQL语句的情况。

比如,已经有一条SQL语句获取没有被删除的User

<select id="getUser" resultType="User">
SELECT * FORM T_USER WHERE DELETE_FLAG = '0'
</select>

如果代码量太大,同时接口方法的命名信息抽象,又没有写任何注释的情况下,有可能会产生相似的语句

<select id="getCancelUser" resultType="User">
SELECT * FROM T_USER WHERE DELETE_FLAG = '1'
</select>

一个是获取已经登记但没有注销的所有用户,一个是获取所有已经注销了的用户。看上去不可能产生这种情况,在上千行代码的情况下,就有可能会产生,毕竟接口抽象,又没有注释。

因此,对于这种简单SQL语句,可以使用注解的方法,使抽象的接口"形象化“

@Select("SELECT * FROM T_USER WHERE DELETE_FLAG = '0'")
public User getUser();

当你的团队成员在寻找相似语句的时候,就可以很容易地注意到这条SQL语句,而不是这表述含糊的方法名。这个时候,就不需要写一条新的SQL语句,只需要在原来的基础上进行修改就可以了

@Select("SELECT * FROM T_USER WHERE DELETE_FLAG = #{deleteFlag}")
public User getUser(@Param("deleteFlag")String deleteFlag);

这样同一条SQL语句,只要传不同的值就可以了。@Param是参数的注解,一般情况下,是可以不加这个注解的,MyBatis可以自动封装。

类似地,还有@Insert、@Update、@Delete注解,使用基本雷同。

三、动态SQL

在进行数据库操作的时候,我们通常传入对象来进行增删改查,但是如果传入的对象在某些时候没有值,那么我们通过动态标签就可以避免重复编写相似的SQL语句

1、<if>与<where>

//public List<Blog> findActiveBlogLike(Blog blog)
<select id="findActiveBlogLike" parameterType="Blog" resultType="Blog">
SELECT * FROM BLOG
<WHERE>
<if test="state != null">
state = #{state}
</if>
<if test="title != null">
AND title like #{title}
</if>
<if test="author != null and author.name != null">
AND author_name like #{author.name}
</if>
</WHERE>
</select>

我们可以通过<if>标签,判断传入的对象是否存在值,进而动态改变查询的SQL语句。如果所有的条件均为空,那么就会出现SELECT * FROM BLOG WHERE 这样的SQL语句,这个时候会报错,当然可以改为SELECT * FROM BLOG WHERE 1=1。同时也可以引用<where>标签,当所有的条件均不存在的时候,这个where也会被自动去掉

2、<foreach>

//public List<Post> selectPostIn(List<String> list)
<select id="selectPostIn" resultType="domain.blog.Post">
SELECT *
FROM POST P
WHERE ID in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>

当我们需要查询的SQL语句包含in 的时候,我们可以通过<foreach>来遍历实现。

3、<set>

<update id="updateAuthorIfNecessary"
parameterType="domain.blog.Author">
update Author
<set>
<if test="username != null">username=#{username},</if>
<if test="password != null">password=#{password},</if>
<if test="email != null">email=#{email},</if>
<if test="bio != null">bio=#{bio},</if>
</set>
where id=#{id}
</update>

进行更行操作的时候,传入的对象的各个字段不一定都有值,这个时候,可以使用<if>标签来进行动态列举,但这个时候会产生一个问题,那就是条件后面的“,”逗号,为了避免报错,这里可以引入<set>标签,即使最后一个条件后面有逗号,也不会报错

动态标签还有其他的,详细可以参考官方文档[1]。

四、缓存[2]

对于一些常用的查询,不可能每一次都从数据库里头拿,特别是那些相对固定,同时数据量又比较大的查询。这个时候缓存显得比较重要。MyBatis有自己的缓存机制,也可以与Ehcache整合[3],当然最好是使用Redis

五、后言

MyBatis是一个很灵活的持久层框架,本文旨在阐述MyBatis的基本使用,以及日常优化配置。同时本文也是这一系列最后一篇文章。本系列五篇文章旨在指出理论学习与实际应用当中的差异,既非入门教程,也非解决方案。

--2018.10.08增补--

框架具有时代性。在SSM之前,是S2SH的时代,在哪个时代,S2SH是非常优秀的框架,对比起传统的JDBC和Servlet来说。上个世纪50年代,拿着“大哥大”打电话是非常先进的,毕竟当时很少人可以用到。本世纪初,诺基亚的手机相比起“大哥大”要先进许多。到今天2018年,人们都是用着代用指纹识别、可拍照、可上网的智能手机。技术在迭代,时代在改变。

Reference:

[1] 官方中文网,http://www.mybatis.org/mybatis-3/zh/index.html
[2] 小秋蜀黍, mybatis缓存文件的配置, https://blog.csdn.net/sinat_32133675/article/details/76691009
[3] 落叶枫桥, MyBatis笔记——EhCache二级缓存, https://www.cnblogs.com/pwc1996/p/4839133.html

灵活的MyBatis的更多相关文章

  1. MyBatis 入门(一)

    MyBatis mybatis和hibernate都属于orm(对象与关系映射) 框架 mybatis的优点: 1.sql-mapping :操作更自由,可控性高,执行效率更高 2.轻量,学习更容易 ...

  2. MyBatis学习日记(一):拜见小主——MyBatis

    近日学习MyBatis,特将学习过程及一点心得记录于此. MyBatis为何物? MyBatis 是支持定制化SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC ...

  3. Spring Boot集成MyBatis的2种方式

    目录 写在前面 准备工作 配置数据库驱动 配置数据源 原生集成MyBatis 依赖配置 注册MyBatis核心组件 定义并使用映射器 通过MyBatis-Spring-Boot-Starter集成 默 ...

  4. mybatis配置与使用

    一:Mybatis简介 1.名称由来 Mybatis原名叫ibatis.Mybatis一开始属于Apache,2010年从Apache转移到了GoogleCode这个组织中. 2.Mybatis概念 ...

  5. SpringDataJPA与Mybatis的优异性

    首先表达个人观点,JPA必然是首选的. 个人认为仅仅讨论两者使用起来有何区别,何者更加方便,不足以真正的比较这两个框架.要评判出更加优秀的方案,我觉得可以从软件设计的角度来评判.个人对 mybatis ...

  6. MyBatis学习总结(一)——ORM概要与MyBatis快速起步

    程序员应该将核心关注点放在业务上,而不应该将时间过多的浪费在CRUD中,多数的ORM框架都把增加.修改与删除做得非常不错了,然后数据库中查询无疑是使用频次最高.复杂度大.与性能密切相关的操作,我们希望 ...

  7. mybatis入门 配置文件解释 及测试

    这里介绍一下mybatis  根据mybatis的官网说明,mybatis是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置 ...

  8. mybatis入门配置和调试

    欢迎转载http://www.cnblogs.com/jianshuai520/p/8669177.html大家一起努力,如果看的时候有图片半边遮挡起来的话,右键查看图片,就可以观看完整的图片,具体怎 ...

  9. [MyBatis] MyBatis理论入门

    什么是MyBatis iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAOs) 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射. MyB ...

随机推荐

  1. 浏览网页隐藏服务器IP

    host文件修改 notepad %windir%\system32\drivers\etc\hosts 目标IP localhost.autumn.com 可能会导致HTTP Status Code ...

  2. 来自GitHub的优秀开源项目系列

    开发必看: 如何设计大型系统? 架构师技术图谱. 互联网Java工程师进阶扫盲 Java学习指南 Java工程师成神之路 有趣开源项目: 中华古诗词数据库 表情包博物馆

  3. js高频经典面试题总结

    类型转换问题 console.log(null>=0); console.log(null<=0); console.log(null==0); console.log(undefined ...

  4. 编写可维护的JavaScript-随笔(四)

    避免使用全局变量 一.全局变量带来的问题 a)      命名冲突 i.          当全局变量和全局函数越来越多时,发生命名冲突的概率也随之增高 ii.          如果函数中使用了外部 ...

  5. 记录下hbuilder vue项目打包APP 在IOS上点击延迟的问题

    做的项目打包成APP在IOS 上有延迟问题,在安卓下却不会,联想到之前 用IONIC时打包的APP也是 在IOS下有300毫秒延迟问题.所以 只能 认吧. 安装fastclick 插件: npm in ...

  6. HTML 结构标签(div+span)

    一.div 标签 div 就是 division 的缩写 分割, 分区的意思 常见的用途是文档布局. 二.span 标签 span, 跨度,跨距:范围 <span> 元素可用于为部分文本设 ...

  7. spring中WebApplicationContext、DispatcherServlet与web容器的ServletContext关系梳理

    学习源码过程中,对各种context(上下文)表示很懵逼.特地留此一篇. 1.要了解各个上下文之间的关系.首先走一遍spring在web容器(tomcat)中的启动过程 a) ServletConte ...

  8. pandas 之 数据清洗-缺失值

    Abstract During the course fo doing data analysis and modeling, a significant amount of time is spen ...

  9. Golang: 读写之外的其他文件操作

    在上一篇文章中,我们介绍了常用的文件读写操作,今天接着来研究一下,除了读写以外的其他常见文件操作. 一.创建目录: package main import ( "fmt" &quo ...

  10. CC2530 light_switch分析

    一些关键字: CCM  - Counter with CBC-MAC (mode ofoperation) HAL   - HardwareAbstraction Layer      (硬件抽象层) ...