背景
在《mybatis的本质和原理》中,我简单介绍了怎么写出一个简化版的mybatis。这个简化版的mybatis已经可以将传统的手动拼接sql的调用数据库方式转化成面向对象的方式。面向对象友好是mybatis长盛不衰的最本质设计优势。此外,还有4个优秀的设计也很值得学习。
mybatis的4个“增值“设计
动态sql
简化版的mybatis虽然面向对象友好,但是有一定的局限性。如果一个sql在不同的条件下会有变化,那就需要写几个sql。而手动拼接的sql却可以使用java的语法,引入if、foreach来减少SQL数,增加可维护性。
为了解决sql的复用和可维护性问题,mybatis引入动态sql。比如<where>标签可以解决手写where语句+if语句时不好判断是否要加and的问题。记得有人这么在mybatis配置文件里写sql:
select * from XX where 1=1 <if a!=null>and a=XXX</if>
实际上可以
select * from XX <where> <if a!=null>and a=XXX</if></where>
这样不仅看起来更简洁,在低版本的mysql中,也可以充分使用最左前缀等索引提高效率(在mysql5.7以后,索引都已经在服务端进行优化了,实际效率差别不大)。
动态sql的设计更好的体现了面向对象的设计原则。
内置缓存
mysql内置一级缓存和二级缓存。一级缓存是sqlsession级别的缓存,二级缓存是namespace级别的缓存。两层缓存都是默认开启的。能达到的效果是在一个客户端,如果多次执行一个完全相同的查询sql,会优先使用缓存的数据,以提高效率。
但是mybatis内置的缓存非常简单,就是一个hashmap。作为一个优秀的软件,它懂得它山之石可以攻玉,所以它可以适配第三方缓存,比如ehcache。但是一定要注意,对一版的工具来说,第三方软件的整合一般都不是必需的。
上周有个同事跟踪源码发现spring-web里使用了jackson。得出结论说使用@ResponseBody必须使用jackson。而jackson低版本有代码漏洞需要升级。我就建议他把jackson的包排除掉试试,作为一款流行的框架,这种最基本功能并不需要使用第三方软件。当然其实是可以使用@JsonView标签显示的使用jackson来处理,但应该不是默认。
当然,默认不使用第三方软件并不是评价软件是否优秀的标准,比如springboot就默认使用第三方tomcat作为应用服务器。但是想想看为什么springboot使用tomcat不用jetty呢?因为tomcat是apache的呀。能不用第三方软件做默认就不用,要用还是优先apache。其他公司的产品哪天收费了多麻烦。
分页插件
mysql有pagehelper可以灵活的满足各种前端分页的需求,不管是
还是
pagehelper都能满足,还是物理分页。物理分页和逻辑分页的区别就是物理分页是用到哪些数据去数据库里取哪些数据。逻辑分页是把所有数据都取出来,在内存里对数据做封装。如果逻辑分页,20W+的数据就太慢了。
逆向工程
mybatis-generator相信很多朋友都用过。它可以称为一个小工具,可以自动的生成常用的增删改查的mapper及接口、pojo等,进一步简化了开发。
这里要提一个概念:ActiveRecord
ActiveRecord 也属于 ORM 层,由 Rails 最早提出,遵循标准的 ORM 模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。
ActiveRecord 的主要思想是:
1. 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的 Field ;
2. ActiveRecord 同时负责把自己持久化,在 ActiveRecord 中封装了对数据库的访问,即 CURD;
3. ActiveRecord 是一种领域模型 (Domain Model) ,封装了部分业务逻辑;
ActiveRecord 比较适用于:
1. 业务逻辑比较简单,当你的类基本上和数据库中的表一一对应时 , ActiveRecord 是非常方便的,即你的业务逻辑大多数是对单表操作;
2. 当发生跨表的操作时 , 往往会配合使用事务脚本 (Transaction Script) ,把跨表事务提升到事务脚本中;
3. ActiveRecord 最大优点是简单 , 直观。一个类就包括了数据访问和业务逻辑 . 如果配合代码生成器使用就更方便了;
mybatis的4个“增值“设计总结
本文中的增值是指增值服务,即超出常规服务范畴的服务。mybatis的4个“增值“设计,就是在简化版的mybatis基础上添加的服务。mybatis的设计里还包含了与spring集成等增值设计。不一一细说。mybatis核心功能就是面向设计的来做数据库操作,而完成了这一点之后,它主要做的都是在其外围做事情来提高用户体验。这也是平时设计开发比较推荐的思路:保持核心的稳定,版本的演进主要是功能增强。
增强工具包
mybatis-plus在 Mybatis 的基础上进行扩展,只做增强不做改变,简化CRUD
操作。以下是官方介绍
mybatis虽然很致力于用户体验,但是越来越多的人开始使用mybatis-plus,因为mybatis-plus吸收了近来流行的优秀设计思想,比如:内置性能分析插件、更友好的日志打印。
推荐阅读