Mybatisplus教学
Mybatisplus官网:简介 | MyBatis-Plus (baomidou.com)
MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
使用步骤
1. 导入依赖
<!-- mybatisplus依赖 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.1.1</version></dependency><!-- 数据库驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency>
2. 必备配置
2.1 扫描Mapper包
// 替换为您的 Mapper 接口包路径 // 通常加在启动类 @MapperScan("com.itheima.mp.mapper")
2.2 配置数据源
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghaidriver-class-name: com.mysql.cj.jdbc.Driverusername: rootpassword: root
2.3 常见配置
mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志global-config:db-config:id-type: auto # 主键类型
2.4 分页拦截器
package com.itheima.mp.config;import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;/*** MyBatis Plus 配置类* * 该配置类用于配置 MyBatis Plus 的各种插件,包括分页拦截器。*/ @Configuration public class MyBatisPlusConfig {/*** 创建 MyBatis Plus 拦截器 Bean* * @return MybatisPlusInterceptor 实例*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {// 创建 MyBatis Plus 拦截器实例MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();// 添加分页拦截器// 分页拦截器用于处理 MyBatis Plus 的分页查询逻辑interceptor.addInnerInterceptor(new PaginationInnerInterceptor());// 返回配置好的拦截器实例return interceptor;} }
3. 自定义Mapper接口需要继承BaseMapper
public interface UserMapper extends BaseMapper<User>
BaseMapper提供的方法:
- 新增
1. int insert(T entity):插入一条记录。- 删除
1. int deleteById(Serializable id):根据 ID 删除记录。
2. int deleteByMap(@Param("cm") Map<String, Object> columnMap):根据列名和值进行删除。
3. int delete(@Param("ew") Wrapper<T> wrapper):根据条件构造器进行删除。
4. int deleteByIds(@Param("coll") Collection<? extends Serializable> idList):根据 ID 列表批量删除。- 更新
1. int updateById(@Param("et") T entity):根据 ID 更新记录。
2. int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper):根据条件构造器进行更新。- 查找
1. T selectById(Serializable id):根据 ID 查询单条记录。
2. List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList):根据 ID 列表批量查询。
3. List<T> selectByMap(@Param("cm") Map<String, Object> columnMap):根据列名和值进行查询。
4. T selectOne(@Param("ew") Wrapper<T> queryWrapper):根据条件构造器查询单条记录。
5. Integer selectCount(@Param("ew") Wrapper<T> queryWrapper):根据条件构造器查询记录数。
6. List<T> selectList(@Param("ew") Wrapper<T> queryWrapper):根据条件构造器查询列表。
7. List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper):根据条件构造器查询列表,返回 Map 集合。
8. List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper):根据条件构造器查询列表,返回单列数据集合。- 分页查询
1. IPage<T> selectPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper):分页查询。
2. IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param("ew") Wrapper<T> queryWrapper):分页查询,返回 Map 集合。4. 定义Service接口和实现类
public interface UserService extends IService<User> public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService
- ServiceImpl 是 MyBatis-Plus 提供的一个基础服务实现类,它继承了 IService 接口并实现了其中的大部分方法。
- ServiceImpl 提供了许多常用的 CRUD 操作方法,这些方法可以直接在你的服务实现类中使用。
ServiceImpl提供的方法:
- 新增
1. boolean save(T entity):保存一个实体,自动填充创建时间和更新时间。
2. boolean saveOrUpdate(T entity):保存或更新一个实体,自动填充创建时间和更新时间。
3. boolean saveBatch(Collection<T> entityList):批量保存实体。
4. boolean saveOrUpdateBatch(Collection<T> entityList):批量保存或更新实体- 删除
1. boolean removeById(Serializable id):根据 ID 删除记录。
2. boolean removeByMap(Map<String, Object> columnMap):根据列名和值进行删除。
3. boolean remove(Wrapper<T> queryWrapper):根据条件构造器进行删除。
4. boolean removeByIds(Collection<? extends Serializable> idList):根据 ID 列表批量删除。- 修改
1. boolean updateById(T entity):根据 ID 更新记录。
2. boolean update(T entity, Wrapper<T> updateWrapper):根据条件构造器进行更新。
3. boolean updateBatchById(Collection<T> entityList):批量更新记录。
4. boolean updateBatchById(Collection<T> entityList, int batchSize):批量更新记录,指定每次更新的记录数。- 查找
1. T getById(Serializable id):根据 ID 查询实体对象。
2. List<T> listByIds(Collection<? extends Serializable> idList):根据多个 ID 查询实体对象。
3. List<T> listByMap(Map<String, Object> columnMap):根据 Map 条件查询实体对象。
4. T getOne(Wrapper<T> queryWrapper, boolean throwEx):根据条件查询单个实体对象。
5. List<T> list(Wrapper<T> queryWrapper):根据条件查询实体对象列表。
6. long count(Wrapper<T> queryWrapper):根据条件查询记录总数。- 分页
1. IPage<T> page(IPage<T> page, Wrapper<T> queryWrapper):分页查询实体对象列表。
5. 常用注解
- Mapper接口
@Mapper: 标识这是一个 MyBatis 的 Mapper 接口。
extends BaseMapper<User>: 继承 BaseMapper,提供了基本的 CRUD 操作方法。
@Select: 定义查询方法。
@Insert: 定义插入方法。
@Update: 定义更新方法。
@Delete: 定义删除方法。
@Options: 指定插入操作的选项,如主键生成策略- 实体类
@TableName("user"): 指定实体类对应的数据库表名为 user。
@TableId(type = IdType.AUTO): 指定 id 字段为主键,并且使用自增策略。
@TableField("user_name"): 指定 name 字段对应数据库中的 user_name 列。
@TableField("user_email"): 指定 email 字段对应数据库中的 user_email 列。6. 总结