前言:最后学习MyBatis,MyBatis持久层框架是对JDBC的封装,它让数据库底层操作变的透明,属于半自动ORM(对象关系映射)框架。对那些更喜欢使用对象/关系映射框架而不是直接使用JDBC的开发者,Spring提供了ORM(对象关系映射)模块,可以采用融合的方式将Mybatis框架集成进来。MyBatis可以自定义高效的SQL语句提升数据库访问的效率;而且MyBatis容易掌握,而Hibernate门槛较高。所以我们用Mybatis取代了传统的Hibernate成为Java服务端中首选的持久层框架。
一、Mybatis框架的简介
1、Mybatis的概念
MyBatis 本是apache的一个开源项目iBatis,iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO), 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis ,2013年11月迁移到Github。
MyBatis 是一款优秀的Java持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 消除了几乎所有的JDBC代码和PreparedStatement语句参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML配置文件或注解,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。Mybatis是半自动ORM映射工具,可以自定义高效的SQL语句提升数据库访问的效率。Mybatis是半自动的原因是因为我们要在Mapper文件中手写SQL语句,全自动的ORM(如Hibernate)是不需要手写SQL的。
总结:MyBatis可以进行更为细致的SQL优化,可以减少查询字段;而且MyBatis容易掌握,而Hibernate门槛较高。所以我们用Mybatis代替传统的Hibernate。
2、Mybatis和Hibernate区别
Hibernate是一个开放源的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架,程序员可以不用精通SQL,只要懂得操作POJO就能够操作对应数据库的表;而Mybatis是一个半自动化的持久层框架,需要手动编写sql语句。也就是说Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射略显麻烦,不过Mybatis可以进行更为细致的SQL优化以减少不必要的查询,提高系统性能。
2.1 开发方面
在项目开发过程当中,就速度而言:
Hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发;
Mybatis 属于半自动化,sql需要手工完成,稍微繁琐;
但是,凡事都不是绝对的,如果对于庞大复杂的系统项目来说,查询语句较多,选择hibernate 就不是一个好方案。
2.2 sql优化方面
Hibernate 自动生成sql,有些语句较为繁琐,会多消耗一些性能;
Mybatis 手动编写sql,可以避免不需要的查询,提高系统性能;
在管理系统时代,首先是实现业务逻辑,然后才是性能,所以Hibernate在当时是主流。
在移动互联网时代,MyBatis是首选,不屏蔽SQL,程序员可以自己制定SQL规则,能更加精确定义SQL,从而优化性能。更符合移动互联网高并发,大数据,高性能,高响应的要求。
参考链接:
《javaEE互联网轻量级框架整合开发》描述的Hibernate和MyBatis的区别
3、Mybatis有二级缓存,为什么还要用Redis?
mybatis的缓存:分为一级缓存和二级缓存。一级缓存的作用范围为session,所以当session commit或close后,缓存就会被清空 ;二级缓存的作用范围为sqlsessionfactory,映射语句文件中的所有select语句都会被缓存,所有CRUD的操作都会刷新缓存,缓存会存储1024个对象,缓存容易造成读脏数据,影响真实数据的准确性,实际开发业务中会放弃二级缓存。
参考链接:mybatis二级缓存缺陷
redis的缓存:可控制的后端缓存服务,通常用来缓存后端数据,当程序第二次访问数据库的时候,命中redis,大大减少数据库的负担,减少访问数据库的链接时间,实际开发过程中都会采用这种缓存方式,达到访问速度和效率的解决方案。
Mybatis二级缓存存在缺陷容易造成读脏数据, 秒杀系统绝对不适合二级缓存。
还有mybatis只是本地内存缓存,受到单机内存限制没法扩展;而redis是集中式集群缓存,Redis可以搭建在其他服务器上,缓存容量可以无限扩展。Redis可以灵活的使用在需要缓存的数据上,比如一些热点数据。
二、Mybatis的使用教程
就二篇,不是很难,注意一下Mapper动态代理,可以减少开发Dao层代码的时间。
Mapper动态代理:
Mapper映射文件中的namespace直接绑定Dao接口,就可以只编写Dao接口和对应的Mapper映射文件, 具体的交互方法实现由 MyBatis来完成,即在代码中可以直接使用DAO接口而不需要再编写实现类,面向接口编程,这样大大节省了开发DAO层的时间。也就是说,当你的namespace绑定接口后,你可以不用写Dao接口实现类,只要在applicationContext.xml配置文件中配置mapper批量扫描器类,就会从dao包中扫描出dao接口,自动创建Dao接口实现类代理对象并且在 Spring 容器中注入。这样就可以在代码中直接通过@Resource注解自动装配bean来使用UserDao,mybatis会通过该绑定自动帮你找到Dao接口方法对应要执行的SQL语句 。
另外还可以通过Mybatis3.4.0后引入的@mapper注解定义一个Mapper(Dao)接口,然后在上面的方法上使用@Select、@Insert等注解方式来实现对应的持久化操作(MyBatis提供了简单的Java注解,使得我们可以不配置XML格式的Mapper文件,也能方便的编写简单的数据库操作代码)。这样既不用写Dao层的实现类也不用编写烦人的mapper映射文件。最后就可以在代码中直接通过@Resource或@AutoWired注解自动装配bean来使用Mapper接口。
三、MyBatis 与 Spring 整合
目前大部分的 Java 互联网项目,都是用 Spring MVC + Spring + MyBatis 搭建平台的。
使用 Spring IoC 可以有效的管理各类的 Java 资源,达到即插即拔的功能;通过Spring AOP框架,数据库事务可以委托给 Spring 管理,消除很大一部分的事务代码,配合 MyBatis 的高灵活、可配置、可优化 SQL 等特性,完全可以构建高性能的大型网站。
毫无疑问,MyBatis 和 Spring 两大框架已经成了 Java 互联网技术主流框架组合,它们经受住了大数据量和大批量请求的考验,在互联网系统中得到了广泛的应用。使用 MyBatis-Spring 使得业务层和模型层得到了更好的分离,与此同时,在 Spring 环境中使用 MyBatis 也更加简单,节省了不少代码,甚至可以不用 SqlSessionFactory、 SqlSession 等对象,因为 MyBatis-Spring 为我们封装了它们。————摘自《Java EE 互联网轻量级框架整合开发》
直接看此篇博客:MyBatis 与 Spring 整合