MyBatis-Plus 框架

MyBatis-Plus(简称 MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。

简化开发、提高效率,这是MyBatis-Plus核心思想。一种集MyBatis与Hibernate的优点一起的框架。它提供了Hibernate的单表CRUD操作的方便同时,又保留了MyBatis的特性。

特性官网提供

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作,BaseMapper
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求,简单的CRUD操作不用自己编写
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用(自动生成代码)
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

开发环境搭建

软件 版本
HGDB 安全版V4、企业版v5及以上版本
JDK 1.6、1.7、1.8
Java IDE Eclipse、IntelliJ IDEA
MyBatis-Plus 3.5.1

示例项目

结构图如下:

image-20220420120354048

主要文件介绍:

pom.xml:导入依赖的jar包

<dependencies> 
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!-- lombok 简化set get toString -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<!--highgo jdbc-->
<dependency>
<groupId>com.highgo</groupId>
<artifactId>HgdbJdbc</artifactId>
<version>6.2.2</version>
</dependency>
</dependencies>

注意

使用mybatis-plus可以节省大量代码,不要同时导入mybatis和mybatis-plus,可能存在版本冲突。

User.java:编写实体类,Lombok简化代码

@Data
@TableName(value = "test_user")
public class User {
private Long id;
private String name;
private Date birthday;

}

注意

mybaitsplus,为mybaits的升级版,不需要写xml配置文件,直接写一个接口,model实体类的多加几个注解即可实现。

不管是mybaits,还是mybaitsplus,数据库里的字段必须和实体类对接上,一模一样,不然就会报错。

此时需要使用 @TableName 表名注解指定当前实体类对应的表名,比如上文中的 User 实体类对应表名为 test_user,此外还可以用使用@TableId 注解(标注在主键上)和 @TableField 注解(标注在其他成员属性上)来指定对应的字段名。

UserMapper.java:创建一个User对象的持久层接口,只需要继承BaseMapper并且把User对象传进去即可

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.highgo.entity.User;
public interface UserMapper extends BaseMapper<User> {

}

DemoApplication.java:启动类加上扫描mapper的注解

@SpringBootApplication
@MapperScan("com.highgo.mapper")
public class DemoApplication {

public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}

}

application.yml:全局配置文件,采用yml格式

# DataSource Config
spring:
datasource:
driver-class-name: com.highgo.jdbc.Driver
url: jdbc:highgo://192.168.2.5:5866/test
username: test
password: test

DemoApplicationTests.java: 测试类

@SpringBootTest
class DemoApplicationTests {

@Resource
private UserMapper userMapper;

@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
for (User user : userList) {
System.out.println(user);
}
}

}

结果

image-20220420140907341

注意事项

1、使用PaginationInterceptor分页插件

MyBatis-Plus自带了一个分页插件Interceptor,帮我们封装好了分页的功能,节省大量的开发时间。

针对MyBatis-Plus版本不同,PaginationInterceptor引用的包有所不同。

MyBatis-Plus2.x引用的包:com.baomidou.mybatisplus.plugins.PaginationInterceptor;

MyBatis-Plus3.x引用的包:com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor

采用@Bean注入的方式进行配置数据库方言

paginationInterceptor.setDialectType("postgresql")

见下方代码:

@Bean 
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setDialectType("postgresql");
return paginationInterceptor;
}

2、Mybatis-plus3.4.0使用MybatisPlusInterceptor拦截

3.4.0版本对此部分有更新,如果是旧版本升级,会出现分页失效问题,同时会提示PaginationInterceptor过时,新版本改用了MybatisPlusInterceptor

在这里插入图片描述

代码示例:

image-20220511090109720