一、前言

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

二、简单的增删改查

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

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

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

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

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

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

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

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

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

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

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

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

三、动态SQL

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

1、<if>与<where>

  1. //public List<Blog> findActiveBlogLike(Blog blog)
  2. <select id="findActiveBlogLike" parameterType="Blog" resultType="Blog">
  3. SELECT * FROM BLOG
  4. <WHERE>
  5. <if test="state != null">
  6. state = #{state}
  7. </if>
  8. <if test="title != null">
  9. AND title like #{title}
  10. </if>
  11. <if test="author != null and author.name != null">
  12. AND author_name like #{author.name}
  13. </if>
  14. </WHERE>
  15. </select>

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

2、<foreach>

  1. //public List<Post> selectPostIn(List<String> list)
  2. <select id="selectPostIn" resultType="domain.blog.Post">
  3. SELECT *
  4. FROM POST P
  5. WHERE ID in
  6. <foreach item="item" index="index" collection="list"
  7. open="(" separator="," close=")">
  8. #{item}
  9. </foreach>
  10. </select>

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

3、<set>

  1. <update id="updateAuthorIfNecessary"
  2. parameterType="domain.blog.Author">
  3. update Author
  4. <set>
  5. <if test="username != null">username=#{username},</if>
  6. <if test="password != null">password=#{password},</if>
  7. <if test="email != null">email=#{email},</if>
  8. <if test="bio != null">bio=#{bio},</if>
  9. </set>
  10. where id=#{id}
  11. </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. Beyond Compare 4 30天评估期结束的解决办法

    修改注册表 regedit注册表中删除项目:HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare 4\CacheId 删除dll 重命名 ...

  2. JavaScript 之 RegExp 对象

    RegExp 正则表达式对象 一.正则表达式 正则表达式:定义字符串的组成规则. 1.单个字符:[ ] 如:[a].[ab].[a-zA-Z0-9] 特殊符号代表特殊含义的单个字符: \d:单个数字字 ...

  3. 请实现一个js脚本,要求做到将数字转化为千分位表示如:1234567转化为1,234,567

    //法一 function parseNum(num){ var list = new String(num).split('').reverse(); for(var i = 0; i < l ...

  4. Js编程实践

    js编程实践思维导向图 ---欢迎收藏 ^ - ^

  5. es倒排索引原理解析

    倒排索引原理 普通的存储方式是给每个文档编一个序号 然后让这个序号对应单个文档的所有内容  如果用这样的方式查找   当需要查找某个单词的时候需要遍历所有的文档集合 查找文档的效率会非常的慢 2.基本 ...

  6. Java集合学习(6):LinkedHashSet

    一.概述 首先我们需要知道的是它是一个Set的实现,所以它其中存的肯定不是键值对,而是值.此实现与HashSet的不同之处在于,LinkedHashSet维护着一个运行于所有条目的双重链接列表.此链接 ...

  7. Nginx 反向代理与负载均衡的配置

    已经很久没有写博了,因为最近学车加上各种问题一直没时间, 今天刚好想起有好多的东西还没来得及记录.回到正题: Nginx是一个非常强大的web轻量级服务器,许多大厂也用Nginx进行负载均衡和反向代理 ...

  8. windows+jenkins+springboot自动构建并后台执行jar

    本文只讲述如何在windows环境下,搭建jenkins并使用,至于概念的东西请自行百度. 好了,直入主题,本人使用 jenkins.war 包进行部署,我们需要准备如下几个: openjdk8    ...

  9. HTML通用模板

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. Spring cloud架构中利用zuul网关实现灰度发布功能

    蓝绿发布.金丝雀发布(灰度发布).AB测试 首先,了解下这几种发布方式的基础概念. 目前常见的发布策略有蓝绿发布.金丝雀发布(灰度发布).AB测试这几种,在国内的开发者中,对这几个概念有独立的理解.蓝 ...