簡介
MyBatis-Plus (opens new window)(簡稱 MP)是一個 MyBatis (opens new window)的增強(qiáng)工具,在 MyBatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡化開發(fā)、提高效率而生。
特性
無侵入:只做增強(qiáng)不做改變,引入它不會對現(xiàn)有工程產(chǎn)生影響,如絲般順滑
損耗小:啟動即會自動注入基本 CURD,性能基本無損耗,直接面向?qū)ο蟛僮?/p>
強(qiáng)大的 CRUD 操作:內(nèi)置通用 Mapper、通用 Service,僅僅通過少量配置即可實現(xiàn)單表大部分 CRUD 操作,更有強(qiáng)大的條件構(gòu)造器,滿足各類使用需求
支持 Lambda 形式調(diào)用:通過 Lambda 表達(dá)式,方便的編寫各類查詢條件,無需再擔(dān)心字段寫錯
支持主鍵自動生成:支持多達(dá) 4 種主鍵策略(內(nèi)含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解決主鍵問題
支持 ActiveRecord 模式:支持 ActiveRecord 形式調(diào)用,實體類只需繼承 Model 類即可進(jìn)行強(qiáng)大的 CRUD 操作
支持自定義全局通用操作:支持全局通用方法注入( Write once, use anywhere )
內(nèi)置代碼生成器:采用代碼或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 層代碼,支持模板引擎,更有超多自定義配置等您來使用
內(nèi)置分頁插件:基于 MyBatis 物理分頁,開發(fā)者無需關(guān)心具體操作,配置好插件之后,寫分頁等同于普通 List 查詢
分頁插件支持多種數(shù)據(jù)庫:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多種數(shù)據(jù)庫
內(nèi)置性能分析插件:可輸出 SQL 語句以及其執(zhí)行時間,建議開發(fā)測試時啟用該功能,能快速揪出慢查詢
內(nèi)置全局?jǐn)r截插件:提供全表 delete 、 update 操作智能分析阻斷,也可自定義攔截規(guī)則,預(yù)防誤操作
支持?jǐn)?shù)據(jù)庫
任何能使用 MyBatis 進(jìn)行 CRUD, 并且支持標(biāo)準(zhǔn) SQL 的數(shù)據(jù)庫,具體支持情況如下,如果不在下列表查看分頁部分教程 PR 您的支持。
MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,F(xiàn)irebird,Cubrid,Goldilocks,csiidb,informix,TDengine,redshift
達(dá)夢數(shù)據(jù)庫,虛谷數(shù)據(jù)庫,人大金倉數(shù)據(jù)庫,南大通用(華庫)數(shù)據(jù)庫,南大通用數(shù)據(jù)庫,神通數(shù)據(jù)庫,瀚高數(shù)據(jù)庫,優(yōu)炫數(shù)據(jù)庫
快速開始
添加依賴
全新的 MyBatis-Plus 3.0 版本基于 JDK8,提供了 lambda 形式的調(diào)用,所以安裝集成 MP3.0 要求如下:
JDK 8+
Maven or Gradle
Spring Boot項目
maven:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>最新版本</version>
</dependency>
Spring 項目
maven:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>最新版本</version>
</dependency>
配置
在 application.yml 配置文件中添加 H2 數(shù)據(jù)庫的相關(guān)配置:
# DataSource Config
spring:
datasource:
driver-class-name: org.h2.Driver
schema: classpath:db/schema-h2.sql
username: root
password: test
sql:
init:
schema-locations: classpath:db/schema-h2.sql
data-locations: classpath:db/data-h2.sql
在 Spring Boot 啟動類中添加 @MapperScan 注解,掃描 Mapper 文件夾:
@SpringBootApplication
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Page分頁
方式一:
使用mybatis-plus 的 Service page 接口
@GetMapping("/pageList")
@ApiOperation(value = "分頁列表", notes = "query和user")
public R<IPage<User>> pageList(@ApiIgnore User user, Query query) {
//無條件分頁
IPage<User> pages = userService.page(Condition.getPage(query));
//有條件分頁
IPage<User> pages = userService.page(Condition.getPage(query), Wrappers.lambdaQuery(user));
return R.data(pages);
}
方式二:
自定義sql分頁
controller層代碼:
@GetMapping("/pageList")
@ApiOperation(value = "分頁列表", notes = "query和user")
public R<IPage<User>> pageList(@ApiIgnore User user, Query query) {
IPage<User> pages = userService.selectUserPage(Condition.getPage(query), user);
return R.data(pages);
}
service 里調(diào)用自定義分頁sql mapper方法
@Override
public IPage<User> selectUserPage(IPage<User> page, User user) {
return page.setRecords(baseMapper.selectUserPage(page, user));
}
定義mapper分頁接口:
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.gis.spacedata.bladex.domain.entity.system.User;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.List;
public interface UserMapper extends BaseMapper<User> {
List<User> selectUserPage(IPage<User> page, @Param("user") User user);
}
mybatis xml:
<select id="selectUserPage" resultMap="userResultMap">
select * from blade_user where is_deleted = 0
<if test="user.tenantId!=null and user.tenantId != ''">
and tenant_id = #{user.tenantId}
</if>
<if test="user.account!=null and user.account != ''">
and account like CONCAT('%',#{user.account},'%')
</if>
<if test="user.realName!=null and user.realName != ''">
and real_name like CONCAT('%',#{user.realName},'%')
</if>
<if test="user.roleId!=null and user.roleId != ''">
and CAST(#{user.roleId} AS VARCHAR)= ANY(STRING_TO_ARRAY(role_id, ','))
</if>
ORDER BY id
</select>
Condition 工具類:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.launch.constant.TokenConstant;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import java.util.Map;
/**
* 分頁工具
*
* @author Chill
*/
public class Condition {
/**
* 轉(zhuǎn)化成mybatis plus中的Page
*
* @param query 查詢條件
* @return IPage
*/
public static <T> IPage<T> getPage(Query query) {
Page<T> page = new Page<>(Func.toInt(query.getCurrent(), 1), Func.toInt(query.getSize(), 10));
page.setAsc(Func.toStrArray(SqlKeyword.filter(query.getAscs())));
page.setDesc(Func.toStrArray(SqlKeyword.filter(query.getDescs())));
return page;
}
/**
* 獲取mybatis plus中的QueryWrapper
*
* @param entity 實體
* @param <T> 類型
* @return QueryWrapper
*/
public static <T> QueryWrapper<T> getQueryWrapper(T entity) {
return new QueryWrapper<>(entity);
}
/**
* 獲取mybatis plus中的QueryWrapper
*
* @param query 查詢條件
* @param clazz 實體類
* @param <T> 類型
* @return QueryWrapper
*/
public static <T> QueryWrapper<T> getQueryWrapper(Map<String, Object> query, Class<T> clazz) {
Kv exclude = Kv.create().set(TokenConstant.HEADER, TokenConstant.HEADER)
.set("current", "current").set("size", "size").set("ascs", "ascs").set("descs", "descs");
return getQueryWrapper(query, exclude, clazz);
}
/**
* 獲取mybatis plus中的QueryWrapper
*
* @param query 查詢條件
* @param exclude 排除的查詢條件
* @param clazz 實體類
* @param <T> 類型
* @return QueryWrapper
*/
public static <T> QueryWrapper<T> getQueryWrapper(Map<String, Object> query, Map<String, Object> exclude, Class<T> clazz) {
exclude.forEach((k, v) -> query.remove(k));
QueryWrapper<T> qw = new QueryWrapper<>();
qw.setEntity(BeanUtil.newInstance(clazz));
SqlKeyword.buildCondition(query, qw);
return qw;
}
}
方式三:
使用mybatis-plus的Db類
說明:
使用靜態(tài)調(diào)用的方式,執(zhí)行CRUD方法,避免Spring環(huán)境下Service循環(huán)注入、簡潔代碼,提升效率
需要項目中已注入對應(yīng)實體的BaseMapper
完整使用方式見: 測試用例(opens new window)
對于參數(shù)為Wrapper的,需要在Wrapper中傳入Entity或者EntityClass供尋找對應(yīng)的Mapper
不建議在循環(huán)中調(diào)用,如果是批量保存,建議將數(shù)據(jù)構(gòu)造好后使用 Db.saveBatch(數(shù)據(jù)) 保存
@Test
void testPage() {
IPage<Entity> page = Db.page(new Page<>(1, 1), Entity.class);
Assertions.assertEquals(2, page.getTotal());
page = Db.page(new Page<>(1, 1), Wrappers.lambdaQuery(Entity.class));
Assertions.assertEquals(1, page.getRecords().size());
}
Page分頁插件
奇怪的是,它查詢出來的數(shù)據(jù)還是所有數(shù)據(jù),并沒有起到我們的分頁效果
我們都知道分頁的原理是where limit ?,?
那是不是只要在這條查詢語句后加上where條件就好了,我們可以把這條語句攔截下來,為它添加我們的where條件,這也是AOP思想的提現(xiàn)(在原有代碼上只進(jìn)行增強(qiáng),不做修改)
插件主體MybatisPlusInterceptor
該插件是核心插件,目前代理了 Executor#query 和 Executor#update 和 StatementHandler#prepare 方法
InnerInterceptor
我們提供的插件都將基于此接口來實現(xiàn)功能
目前已有的功能:
自動分頁: PaginationInnerInterceptor
多租戶: TenantLineInnerInterceptor
動態(tài)表名: DynamicTableNameInnerInterceptor
樂觀鎖: OptimisticLockerInnerInterceptor
sql 性能規(guī)范: IllegalSQLInnerInterceptor
防止全表更新與刪除: BlockAttackInnerInterceptor
分頁插件配置
Spring事務(wù)、MybatisPlus分頁插件、Mybatis包掃描等配置文章來源:http://www.zghlxwxcb.cn/news/detail-807967.html
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* spring事務(wù)、MybatisPlus分頁插件、mybatis包掃描等配置
*
* @author tarzan liu
* @since JDK1.8
* @date 2021年5月11日
*/
@EnableTransactionManagement
@Configuration
@MapperScan(basePackages = "com.tarzan.**.mapper")
public class MybatisPlusConfig {
/**
* 分頁插件
*/
@Bean
public MybatisPlusInterceptor paginationInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
paginationInnerInterceptor.setMaxLimit(-1L);
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
return mybatisPlusInterceptor;
}
}
代碼中paginationInnerInterceptor.setMaxLimit(-1L);意思是不做最大分頁數(shù)量限制,默認(rèn)的話,最大限制是,一頁500條數(shù)據(jù)。文章來源地址http://www.zghlxwxcb.cn/news/detail-807967.html
到了這里,關(guān)于MyBatis-Plus 實現(xiàn)分頁的幾種寫法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!