一、优点:
- 相对于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工作流程图(个人版本):
个人理解:
1、sqlsession: sqlsession是一次与数据库的会话。在你每次访问数据库时都需要创建它(当然并不是说在sqlsession里只能执行一次sql,你可以执行多次,当一旦关闭了Sqlsession就需要重新创建它)。sqlsession只能由SqlsessionFactory的openSession方法来完成创建
2、executor: 通过源码我们可以看到:executor其实只是DefaultSqlSession的一个属性,而executor的每个操作都需要一个对象,那就是MappedStatement
3、MappedStatement: 这个东西个人看来就是用来封装sql和返回结果的,我们很熟悉的可以看到id(个人猜想可能是mapper.xml中的那个id,即具体执行的是哪个sql)、parameterMap(应该就是mapper.xml中的那个parameterMap,即sql中变量的类型)、
resultMaps(大概就是你需要的返回对象类型)
四、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
2、代码中的使用:
//只要写了这一行就能就能将最近的一个list查询进行分页
PageHelper.startPage(起始页码, 一页要显示多少条数据);
List<ProductWithMonthBuy> list = productDao.select_ProductWithMonthBuytD(条件);
PageInfo pageInfo = new PageInfo<>(list);
//获取满足条件的总记录数
pageInfo.getTotal();
//获取总页数--总共应该被分为多少页
int i = pageInfo.getPages();
//获取返回记录数
list.size();