MyBatis前身是iBatis,是Clinton Begin在2001年发起的一个开源项目。最初侧重于码软件开发,后续发展成为一款基于java的持久层框架。Mybatis是一款优秀的持久层框架支持自定义SQL查询、存储过程和高级映射,消除了几乎所有的JDBC代码和参数的手动设置以及结果集的检索。MyBatis可以使用简单的XML或者注解进行映射和配置,通过将参数映射到配置的SQL最终解析为执行的SQL语句,查询后将SQl结果集映射成java对象返回。MyBatis提供的持久层框架包括SQL Maps(Mapper)和Data Access Objects(DAO),相对于Hibernate而言它提供的是一种把自动化的ORM实现。MyBatis中一级缓存会默认启用(本地缓存)且不受控制,一般说缓存时指的是MyBatis的二级缓存
1.主要使用的标签有:
1)、对应注解@lSelect
2)、
3)、
4)、
5)、
6)、
7)、
8)、
9)、
10)、
1)MyBatis封装了JBDC底层访问数据库的细节,使我们程序猿不需要与JDBC API打交道,就可以访问数据库。
2)MyBatis简单易学,程序猿直接编写SQL语句,适合于对SQL语句性能要求比较高的项目。
3)SQL语句封装在配置文件中,便于统一管理与维护,降低了程序的耦合度。
4)SQL代码从程序代码中彻底分离出来,可重用。
5)提供了动态SQL标签,支持编写动态SQL。
6)提供映射标签,支持对象与数据库的ORM字段关系映射。
1)过于依赖数据库SQL语句,导致数据库移植性差,更换数据库,如果SQL语句有差异,SQL语句工作量大。
2)由于xml里标签id必须唯一,导致DAO中方法不支持方法重载。
3)字段映射标签和对象关系映射标签仅仅是对映射关系的描述,具体实现仍然依赖于sql。(比如配置了一对多Collection标签,如果sql里没有join子表或查询子表的话,查询后返回的对象是不具备对象关系的,即Collection的对象为null)
4)DAO层过于简单,对象组装的工作量较大。
5)不支持级联更新、级联删除。
6)编写动态sql时,不方便调试,尤其逻辑复杂时。
7)提供的写动态sql的xml标签功能简单(连struts都比不上),编写动态sql仍然受限,且可读性低。
8)使用不当,容易导致N+1的sql性能问题。
9)使用不当,关联查询时容易产生分页bug。
10)若不查询主键字段,容易造成查询出的对象有“覆盖”现象。
11)参数的数据类型支持不完善。(如参数为Date类型时,容易报没有get、set方法,需在参数上加@param)
12)多参数时,使用不方便,功能不够强大。(目前支持的方法有map、对象、注解@param以及默认采用012索引位的方式)
13)缓存使用不当,容易产生脏数据。
MyBatis-plus是一款MyBatis的增强工具,在MyBatis 的基础上只做增强不做改变。其是国内团队苞米豆在MyBatis基础上开发的增强框架,扩展了一些功能,以提高效率。引入 Mybatis-Plus 不会对现有的 Mybatis 构架产生任何影响,而且 MyBatis-plus 支持所有 Mybatis 原生的特性
1)依赖少:仅仅依赖 Mybatis 以及 Mybatis-Spring 。
2)损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 。
3)预防Sql注入:内置 Sql 注入剥离器,有效预防Sql注入攻击 。
4)通用CRUD操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 。
5)多种主键策略:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题 。
6)支持热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
7)支持ActiveRecord:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD 操作
8)支持代码生成:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码(生成自定义文件,避免开发重复代码),支持模板引擎、有超多自定义配置等。
9)支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )。
10)支持关键词自动转义:支持数据库关键词(order、key…)自动转义,还可自定义关键词 。
11)内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
12)内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询 。
13)内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,预防误操作。
14)默认将实体类的类名查找数据库中的表,使用@TableName(value="table1")注解指定表名,@TableId指定表主键,若字段与表中字段名保持一致可不加注解。
1)所有SQL语句全部自己写
2)手动解析实体关系映射转换为MyBatis内部对象注入容器
3)不支持Lambda形式调用
1)强大的条件构造器,满足各类使用需求
2)内置的Mapper,通用的Service,少量配置即可实现单表大部分CRUD操作
3)支持Lambda形式调用
4)提供了基本的CRUD功能,连SQL语句都不需要编写
5)自动解析实体关系映射转换为MyBatis内部对象注入容器
Mybatis Plus的宗旨是简化开发,但是它在提供方便的同时却容易造成代码层次混乱,我们可能会把大量数据逻辑写到service层甚至contoller层中,使代码难以阅读。凡事过犹不及,在使用Mybatis Plus时一定要做分析,不要将所有数据操作都交给Mybatis Plus去实现。毕竟Mybatis Plus只是Mybatis的增强工具,它并没有侵入Mybatis的原生功能,在使用Mybatis Plus的增强功能的同时,原生Mybatis的功能依然是可以正常使用的。