目錄
前言
有了前面自動配置資料來源、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>介面
同理對於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 {
}
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") 批量掃描就行