SpringBoot | 3.3 整合MyBatis-Plus
2021-08-14 本文已影响0人
多氯环己烷
前言
有了前面自动配置数据源、JDBC与MyBatis的基础后,自动配置MyBatis就很简单了。
注:在说明注解时,第一点加粗为注解中文含义,第二点为一般加在哪身上,缩进或代码块为示例,如:
@注解
- 中文含义
- 加在哪
- 其他……
语句示例
//代码示例
1. 什么是MyBatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
它提供两大接口BaseMapper<T>
和IService<T>
,方便我们操作数据库与业务。
1.1 BaseMapper<T>接口
可以令XXXMapper接口继承基类BaseMapper<T>,BaseMapper里实现了一些方法方便我们操作数据库:
- XXXMapper继承该接口后,无需编写mapper.xml文件,即可进行crud操作;
1.2 IService<T>接口
IService接口同理对于service有顶层接口IService<T>
2. 整合MyBatis-Plus以及CRUD功能
直接导入场景依赖即可。
2.1 导入场景依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
引入mybatis-plus-boot-starter后,其帮我们引入了mybatis-plus扩展包与核心包(核心包里引入了mybatis核心包、mybatis与spring整合的包)、starter-jdbc。
2.2 CRUD功能
Mybatis里对service层设有顶层接口IService<T>;而对IService<T>有实现类ServiceImpl<操作的基本表,返回类型>
在Bean类里
@TableName("数据库名")
- 数据库表名;
- 标注在bean包下的类里;
- mybatis-plus默认识别数据库表名与类名相同的属性进行绑定,当名字不同时,需要在bean包下的对应类上标注@TableName("数据库名");
- 当名字相同时可以不标注。
在Service层里:
public interface UserService extends IService<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}
IUserServiceImpl里的方法
3. Mabatis-plus实现分页功能
续上面Service层里的配置。
要实现分页功能首先要导入分页插件
- 在config包下,注意版本;
@Configuration
public class MyBatisConfig {
/**
* MybatisPlusInterceptor
* @return
*/
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//这是分页拦截器
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
paginationInnerInterceptor.setOverflow(true);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(500L);
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
}
在controller类里(分页功能)
@Controller
public class TableController {
@Autowired
UserService userService;
//删除用户
@GetMapping("/user/delete/{id}")
public String deleteUser(@PathVariable("id") Long id,
@RequestParam(value = "pn",defaultValue = "1")Integer pn,
RedirectAttributes ra){
userService.removeById(id);
//重定向回到当前页码
ra.addAttribute("pn",pn);
//重定向
return "redirect:/dynamic_table";
}
//请求参数pn表示跳转到的页数,并设置默认值为1
@GetMapping("/dynamic_table")
public String dynamic_table(@RequestParam(value="pn",defaultValue = "1") Integer pn,Model model){
//构造分页参数
Page<User> page = new Page<>(pn, 2);
//调用page进行分页,返回page类型结果
Page<User> userPage = userService.page(page, null);
// userPage.getRecords()
// userPage.getCurrent()
// userPage.getPages()
//将page设置进model属性里
model.addAttribute("users",userPage);
return "table/dynamic_table";
}
@GetMapping("/responsive_table")
public String responsive_table(){
return "table/responsive_table";
}
@GetMapping("/editable_table")
public String editable_table(){
return "table/editable_table";
}
}
在HTML里(分页功能)
- users.current:表示当前页数
- users.pages:总页数
- users.total:总记录数
<div class="adv-table">
<table class="display table table-bordered table-striped" id="dynamic-table">
<thead>
<tr>
<th>#</th>
<th>name</th>
<th>age</th>
<th>email</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr class="gradeX" th:each="user: ${users.records}">
<td th:text="${user.id}"></td>
<td>[[${user.name}]]</td>
<td th:text="${user.age}">Win 95+</td>
<td th:text="${user.email}">4</td>
<td>
<a th:href="@{/user/delete/{id}(id=${user.id},pn=${users.current})}" class="btn btn-danger btn-sm" type="button">删除</a>
</td>
</tr>
</tfoot>
</table>
<div class="row-fluid">
<div class="span6">
<div class="dataTables_info" id="dynamic-table_info">
当前第[[${users.current}]]页 总计 [[${users.pages}]]页 共[[${users.total}]]条记录
</div>
</div>
<div class="span6">
<div class="dataTables_paginate paging_bootstrap pagination">
<ul>
<li class="prev disabled"><a href="#">← 前一页</a></li>
<li th:class="${num == users.current?'active':''}" th:each="num:${#numbers.sequence(1,users.pages)}" >
<a th:href="@{/dynamic_table(pn=${num})}">[[${num}]]</a>
</li>
<li class="next disabled"><a href="#">下一页 → </a></li>
</ul>
</div>
</div>
</div>
</div>
4. *MyBatis-Plus自动配置源码分析
源码分析,跟前面文章类似,这里不做过多解释。
- 引入
mybatis-plus-boot-starter
后,首先找到META-INF
包下的spring.factories
工厂,通过读取EnableAutoConfiguration
获取启动时加载的类 :MybatisPlusAutoConfiguration
配置类;进而找到配置项MybatisPlusProperties
; - 通过自动配置项得知:通过
mybatis-plus:xxx
对mybatis-plus进行定制; - 通过自动配置类得知:给我们自动配置好了哪些组件:
-
SqlSessionFactory
自动配置好:使用配置过的数据源dataSource,配置MyBatis的全局配置文件configLocation; -
mapperLocations
自动配置好:有默认值classpath*:/mapper/**/*.xml
,即:任意包的类路径下的所有mapper文件夹下任意路径下的所有xml都是sql映射文件。 建议以后sql映射文件,放在mapper路径下。 -
SqlSessionTemplate
自动配置好 -
MapperScannerRegistrarNotFoundConfiguration
自动配置好: @Mapper 标注的接口也会被自动扫描;可以直接@MapperScan("com.atguigu.admin.mapper") 批量扫描就行
-