MyBatis-实用扩展
Mybatis-实用扩展
mapper包扫描
在配置mapper.xml时,我们需要在mybatis-config文件夹下使用mappers -> mapper标签配置每一条mapper.xml
<mappers>
<!-- Mapper注册:指定Mybatis映射文件的具体位置 -->
<!-- mapper标签:配置一个具体的Mapper映射文件 -->
<!-- resource属性:指定Mapper映射文件的实际存储位置,这里需要使用一个以类路径根目录为基准的相对路径 -->
<!-- 对Maven工程的目录结构来说,resources目录下的内容会直接放入类路径,所以这里我们可以以resources目录为基准 -->
<mapper resource="mapper/EmployeeMapper.xml"/>
</mappers>
我们可以通过包扫描的方式,批量添加mapper.xml文件,但这样做有几个要求:
- 要求mapper.xml和mapper接口的名字必须相同
- 要求编译后的mapper.xml和mapper接口在同一个文件夹下
- 解决这个问题的最好方案就是在resources文件夹下建立相同的文件结构
想要一次性创建多层目录结构,使用分隔符不再是 . 而是 /
<mappers>
<package name="com.xiaobai.mapper"/>
</mappers>
PageHelper插件
MyBatis 的插件机制包括以下三个组件:
-
Interceptor
(拦截器):定义一个拦截方法intercept
,该方法在执行 SQL 语句、执行查询、查询结果的映射时会被调用 -
Invocation
(调用):实际上是对被拦截的方法的封装,封装了Object target
、Method method
和Object[] args
这三个字段 -
InterceptorChain
(拦截器链):对所有的拦截器进行管理,包括将所有的 Interceptor 链接成一条链,并在执行 SQL 语句时按顺序调用
我们使用的pagehelper插件在Interceptor之中,拦截sql语句并拼接代码
当时我们前端工程化的微头条项目中用servlet手搓了分页:笔记 -> 前端工程化 -> 微头条项目开发 -> 分页
Mybatis提供了很多Sql追加插件,其中最著名的就是PageHelper插件
pagehelper/Mybatis-PageHelper: Mybatis通用分页插件 (github.com)
分页的limit大概为:
通过pageNum(当前页码数)和pageSize(每页显示数量)来计算limit所需要的参数:
(PageNum() - 1) * PageSize();// limit参数1:从第几条参数(用页码*每页数据量)
PageSize();// limit参数2:返回多少条数据
而PageHelper会接手这个过程,只需要提供pageNum和pageSize,PageHelper会自动生成limit语句并拼接在原有的sql之后
配置环境
在maven中添加pagehelper依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>${pagehelper.version}</version>
</dependency>
在mybatis配置文件(mybatis-config.xml)中添加插件
在配置文件的dtd中,我们可以看到各个标签的先后顺序,plugin标签在environment标签之前
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--分页插件的拼接方式为mysql-->
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
使用方法
mapper中的sql语句正常书写
注:不要加limit关键字,并且不能以分号结尾
<select id="queryAll" resultType="Employee">
select *
from t_emp
</select>
使用时,调用PageHelper.startPage方法将pageNum和pageSize参数传入
注:在startPage和PageInfo中只能有一条查询语句,不能将两条查询sql装载到同一个分页插件中去
查询后,将查询数据封装到PageInfo实体类中
在之前的学习中,我们使用vo对象来接受分页五大件的所有信息,现在我们使用PageInfo实体类来接收
@Test
public void test(){
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
// 配置pageNum和pageSize
PageHelper.startPage(1,2);
List<Employee> employees = mapper.queryAll();
// 使用PageInfo实体类封装分页五大件
PageInfo<Employee> pageInfo = new PageInfo<>(employees);
}
PageHelper的开发者是国人,所以我们直接在idea中下载PageInfo类的源码即可查看其中获取数据的方法和中文注释!!! 😊
逆向工程和MybatisX插件
ORM思维我们在JDBC的学习中曾经提到过,是对象到关系数据库的映射思想
Mybatis就是一个ORM思维的持久性框架,使用面向对象思维进行数据库操作
半自动和全自动
hibernate就是典型的全自动ORM框架,程序员做ORM的配置文件映射,由框架生成sql语句
mybatis就是半自动ORM框架,虽然提供了crud的方法,但需要程序员手写sql语句
时代发展如今,人们期望半自动ORM框架也能实现单表的crud自动生成,这个工程就是逆向工程
在后面回学习mybatis-plus,其中就包含单表crud的mapper
注:无论是mybatis-plus还是逆向工程,都是针对单表的crud
MyBatisX插件
-
这个插件在idea中安装,且idea默认不带这个插件
-
安装后用idea连接数据库
-
选择表右键使用MyBatisX插件逆向工程生成文件
至此,单表的增删改查和实体类全部被生成