一、入门案例
- MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
- 官网:https://mybatis.plus/
- 开发方式:
- 基于MyBatis使用MyBatisPlus
- 基于Spring使用MyBatisPlus
- 基于SpringBoot使用MyBatisPlus
1.1 创建新模块,选择Spring初始化,并配置模块相关基础信息
1.2 选择当前模块需要使用的技术集(仅保留JDBC)
1.3 手动添加mp起步依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.1</version> </dependency>
- 由于mp并未被收录到idea的系统内置配置,无法直接选择加入
1.4 设置Jdbc参数(application.yml)
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/mybatis?serTimezone=UTC username: root password: 123456
- 如果使用Druid数据源,需要导入对应的坐标
1.5 制作实体类与表结构(类名与表名对应,属性名与字段名对应)
sql字段:
java属性:
1.6 定义数据接口,继承BaseMapper
@Mapper public interface UserDao extends BaseMapper<User> { }
1.7 测试类中注入dao接口,测试功能
@SpringBootTest class MybatisplusApplicationTests { @Autowired private UserDao userDao; @Test void testGetAll() { List<User> users = userDao.selectList(null); System.out.println(users); } }
1.8 运行结果
二、MyBatisPlus概述
MyBatisPlus特性:
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
三、标准数据层开发
3.1 标准数据层CRUD功能
功能 | 自定义接口 | MP接口 |
新增 | boolean save(T t) |
int insert(T t) |
删除 | boolean delete(int id) |
int deleteById(Serializable id) |
修改 | boolean update(T t) |
int updateById(T t) |
根据id查询 | T getById(int id) |
T selectById(Serializable id) |
查询全部 | List<T> getAll() |
List<T> selectList() |
分页查询 | PageInfo<T> getAll(int page,int size) |
IPage<T> selectPage(IPage<T> page) |
按条件查询 | List<T> getAll(Condition condition) |
IPage<T> selectPage(Wrapper<T> queryWrapper) |
3.2 新增
@Test void testSave() { User user = new User(); user.setId(5); user.setUsername("小夏"); user.setPassword("123"); user.setGender("女"); user.setAddr("北京"); userDao.insert(user); }
3.3 删除
@Test void testDelete() { userDao.deleteById(5); }
3.4 修改
@Test void testUpdate() { User user = new User(); user.setId(1); user.setUsername("张三"); userDao.updateById(user); }
3.5 根据id查询
@Test void testGetById() { User user = userDao.selectById(2); System.out.println(user); }
3.6 lombok工具
Lombok
是一个Java类库,提供了一组注解,简化POJO实体类开发
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency>
- 常用注解:@Data
@Data public class User { private Integer id; private String username; private String password; private String gender; private String addr; }
- 为当前实体类在编译期设置对应的get/test方法,无参/无参构造方法,toString方法,hashCode方法,equals方法等
四、 分页功能
4.1 设置分页拦截器作为Spring管理的bean
@Configuration public class MpConfig { @Bean public MybatisPlusInterceptor mpInterceptor() { //1.定义Mp拦截器 MybatisPlusInterceptor mpInterceptor = new MybatisPlusInterceptor(); //2.添加具体的拦截器 mpInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); return mpInterceptor; } }
4.2 执行分页查询
@Test void testGetByPage() { IPage page = new Page(1,4); userDao.selectPage(page,null); System.out.println("当前页码数:" + page.getCurrent()); System.out.println("每页显示数:" + page.getSize()); System.out.println("一共多少页:" + page.getPages()); System.out.println("一共多少条数据:" + page.getTotal()); System.out.println("数据:" + page.getRecords()); }
4.3 开启日志(观察底层SQL语句)
# 开启mp的日志(输出到控制台) mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl