mybatis之工作流程及分页原理

一、优点:

  • 相对于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工作流程图(个人版本):
这里写图片描述
个人理解:    基本都是本人的猜想,很有可能不对,所以看看开心就好0.0

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();

微信公众号关注: 965净化者

在这里插入图片描述

MyBatis 是一个持久层框架,它提供了一种简单且灵活的方式来执行数据库操作。在 MyBatis 中,分页查询可以通过两种方式实现:基于数据库的分页和基于应用程序的分页。 1. 基于数据库的分页: 基于数据库的分页是通过 SQL 语句的 LIMIT 子句来实现的。LIMIT 子句用于指定返回结果的偏移量和限制数量。在 MyBatis 中,我们可以使用 `<select>` 元素的 `offset` 和 `limit` 属性来指定分页查询的偏移量和限制数量。 例如,假设我们要查询第 11-20 条记录,可以这样编写 SQL 语句: ```sql SELECT * FROM table_name LIMIT 10, 10; ``` 在 MyBatis 中,对应的 XML 配置可以这样写: ```xml <select id="selectPage" resultType="com.example.User"> SELECT * FROM table_name LIMIT #{offset}, #{limit} </select> ``` 2. 基于应用程序的分页: 基于应用程序的分页是通过在代码中手动处理结果集来实现的。在 MyBatis 中,我们可以使用 `<select>` 元素的 `resultMap` 属性来处理结果集。 例如,假设我们要查询第 11-20 条记录,可以通过查询所有记录,然后在代码中截取指定范围的记录来实现分页。 在 MyBatis 中,对应的 XML 配置可以这样写: ```xml <select id="selectPage" resultMap="userResultMap"> SELECT * FROM table_name </select> ``` 在代码中,可以通过获取查询结果列表后,使用 `subList` 方法截取指定范围的记录: ```java List<User> userList = sqlSession.selectList("selectPage"); List<User> pageList = userList.subList(offset, offset + limit); ``` 以上是 MyBatis 分页查询的原理。根据实际情况和需求,可以选择使用基于数据库的分页或基于应用程序的分页
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值