一、优点:

  • 相对于hibernate,mybatis在sql的自由度上显得更加灵活,无论是在sql优化还是返回对象方面(hibernate貌似也有直接执行sql的方法,不是很清楚。。。)
  • 相对于jdbc,mybatis做了一件最繁琐的事- - -生成映射对象
  • 抽插性比较好(解耦性很高),不会对应用程序或者数据库的现有设计产生任何影响,sql写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。(个人理解:如果说dao层是业务层和数据库的解耦的话,那么mybatis就是dao层和数据库的解耦,他可以说是一种面向sql的编程)
  • PageHelper的出现使得mybatis实现了物理上的分页(之前一直听说mybatis分页很弱,而且实现的是逻辑分页,非常影响性能,而且大大增加了OOM的可能)

二、缺点:

  • 我不听我不听,mybatis没有缺点。。。
  • 开个玩笑,比如:mybatis的xml 配置繁多。还得映射model,还得一一对应字段,xml也没有继承机制,这让人觉得很繁琐
  • 与数据库中间的耦合性比较强,即如果数据库换了,比如说从mysql换成了oracle,那么肯定会有很大一部分sql将要重新写,而这一点hibernate就做的很好,具有方言这一概念

三、mybatis工作流程图(个人版本):

java mybatis 冷热数据分离_mybatis


个人理解:

1、sqlsession: sqlsession是一次与数据库的会话。在你每次访问数据库时都需要创建它(当然并不是说在sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。sqlsession只能由SqlsessionFactory的openSession方法来完成创建

java mybatis 冷热数据分离_sql_02

java mybatis 冷热数据分离_数据库_03

java mybatis 冷热数据分离_java mybatis 冷热数据分离_04

2、executor: 通过源码我们可以看到:executor其实只是DefaultSqlSession的一个属性,而executor的每个操作都需要一个对象,那就是MappedStatement

java mybatis 冷热数据分离_sql_05

3、MappedStatement: 这个东西个人看来就是用来封装sql和返回结果的,我们很熟悉的可以看到id(个人猜想可能是mapper.xml中的那个id,即具体执行的是哪个sql)、parameterMap(应该就是mapper.xml中的那个parameterMap,即sql中变量的类型)、
resultMaps(大概就是你需要的返回对象类型)

java mybatis 冷热数据分离_java mybatis 冷热数据分离_06

四、mybatis的分页:

1、PageHelper:

1、据说在PageHelper之前的mybatis都是逻辑上的分页(这里也是据说,因为没有经历过这个年代。。。刚培训出来就接触的是PageHelper);PageHelper出来之后彻底实现了mybatis的物理分页

2、实现原理: 就是在StatementHandler之前进行拦截,对MappedStatement进行一系列的操作(大致就是拼上分页sql)

3、StatementHandler:StatementHandler的默认实现类是RoutingStatementHandler,因此拦截的实际对象是它。RoutingStatementHandler的主要功能是分发,这个类只是根据MappedStatement的配置,生成一个对应的StatementHandler(delegate),然后所有的实现都由delegate完成。(这一段是网上参考的)

4、PageHelper: PageHelper这个类之前是一个拦截器,但是我们可以看到在现在使用的版本中它并未实现Interceptor,不知道是那个版本之后,拦截的任务就交给了PageInterceptor这个类,PageHelper应该只是PageInterceptor的一个属性Dialect,而且Dialect的默认值就是PageHelper

java mybatis 冷热数据分离_分页_07

java mybatis 冷热数据分离_数据库_08

2、代码中的使用:

//只要写了这一行就能就能将最近的一个list查询进行分页
 PageHelper.startPage(起始页码, 一页要显示多少条数据);
 List<ProductWithMonthBuy> list =  productDao.select_ProductWithMonthBuytD(条件);
 PageInfo pageInfo = new PageInfo<>(list);
 //获取满足条件的总记录数
 pageInfo.getTotal();
 //获取总页数--总共应该被分为多少页
 int i = pageInfo.getPages();
 //获取返回记录数
 list.size();