一. MyBatisPlus 的简介
MyBatisPlus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
官网地址是: https://baomidou.com/
官网文档地址是: https://baomidou.com/guide/
本文章是在老蝴蝶写的系列文章 SpringBoot整合MyBatis(七) 进行改进的.
二. SpringBoot 整合 MyBatisPlus
使用 MyBatisPlus 最常见的用法有四种:
- 简单的 CRUD 处理
- 创建时间和修改时间的自动插入和修改
- 逻辑删除的处理
- 分页处理
接下来,老蝴蝶和大家一起学习一下 SpringBoot 整合 MyBatisPlus 的用法。
项目的目录结构:
二.一 pom.xml 添加依赖
<!--引入MySql的驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--引入springboot与mybatis-plus整合的依赖。 去掉mybatis的依赖--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.6</version> </dependency>
我们使用的是 3.3.2 的版本。(MybatisPlus的版本不同,处理方式有些地方会有所不同)
引入 mybatis-plus-boot-starter 依赖时,要注意,去掉 MyBatis 的依赖信息。
<!--去掉 springboot与mybatis整合的依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!-- 去掉 pagehelper分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.5</version> </dependency>
二.二 application.yml 配置信息配置
# 引入 数据库的相关配置 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springboot?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowMultiQueries=true username: root password: abc123 type: com.alibaba.druid.pool.DruidDataSource #整合mybatis时使用的。 去掉整合 MyBatis的配置信息 mybatis-plus: # 配置 mapper文件的位置 mapper-locations: classpath:mybatis/mapper/**/*.xml # 配置日志 configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl map-underscore-to-camel-case: true # 配置数据库表的列别名设置 global-config: db-config: table-underline: true # 驼峰方式转换
二.三 数据库准备信息
目前 springboot数据库下有一张表 user
-- 创建员工 user 表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(15) DEFAULT NULL, `sex` varchar(20) DEFAULT NULL, `age` int(6) DEFAULT NULL, `description` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
二.四 其他主要代码信息
二.四.一 User.java
@Data @NoArgsConstructor @AllArgsConstructor public class User implements Serializable { /** * @param id id编号 * @param name 姓名 * @param sex 性别 * @param age 年龄 * @param description 描述 */ private Integer id; private String name; private String sex; private Integer age; private String description; }
三. 基础的 CRUD 配置
三.一 配置实体 User.java 中添加相关的配置信息
@Data @NoArgsConstructor @AllArgsConstructor @TableName("user") public class User implements Serializable { /** * @param id id编号 * @param name 姓名 * @param sex 性别 * @param age 年龄 * @param description 描述 */ @TableId(value="id",type = IdType.AUTO) private Integer id; @TableField(value="name") private String name; @TableField(value="sex") private String sex; @TableField(value="age") private Integer age; @TableField(value="description") private String description; }
通过注解,将实体类与数据库表产生关联。
在类名上添加 @TableName 注解,指定表名。
在Id 主键属性上添加 @TableId 注解, 指定该列主键列, type 指定主键生成策略. AUTO 表示自动生成.
在其他属性上添加 @TableField 注解,指定对应的是数据表的哪个列信息。
三.二 UserMapper 接口
Mapper 需要继承 MyBatisPlus 提供的 BaseMapper 接口(里面定义了好多接口), 类似于 Jpa里面的 JpaRepository 接口一样.
** * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能 * <p>这个 Mapper 支持 id 泛型</p> * * @author hubin * @since 2016-01-23 */ public interface BaseMapper<T> extends Mapper<T> { /** * 插入一条记录 * * @param entity 实体对象 */ int insert(T entity); /** * 根据 ID 删除 * * @param id 主键ID */ int deleteById(Serializable id); /** * 根据 columnMap 条件,删除记录 * * @param columnMap 表字段 map 对象 */ int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根据 entity 条件,删除记录 * * @param wrapper 实体对象封装操作类(可以为 null) */ int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper); /** * 删除(根据ID 批量删除) * * @param idList 主键ID列表(不能为 null 以及 empty) */ int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 根据 ID 修改 * * @param entity 实体对象 */ int updateById(@Param(Constants.ENTITY) T entity); /** * 根据 whereEntity 条件,更新记录 * * @param entity 实体对象 (set 条件值,可以为 null) * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) */ int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper); /** * 根据 ID 查询 * * @param id 主键ID */ T selectById(Serializable id); /** * 查询(根据ID 批量查询) * * @param idList 主键ID列表(不能为 null 以及 empty) */ List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList); /** * 查询(根据 columnMap 条件) * * @param columnMap 表字段 map 对象 */ List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根据 entity 条件,查询一条记录 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询总记录数 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 entity 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询全部记录 * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询全部记录 * <p>注意: 只返回第一个字段的值</p> * * @param queryWrapper 实体对象封装操作类(可以为 null) */ List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 entity 条件,查询全部记录(并翻页) * * @param page 分页查询条件(可以为 RowBounds.DEFAULT) * @param queryWrapper 实体对象封装操作类(可以为 null) */ <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); /** * 根据 Wrapper 条件,查询全部记录(并翻页) * * @param page 分页查询条件 * @param queryWrapper 实体对象封装操作类 */ <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper); }
编写 UserMapper 文件
public interface UserMapper extends BaseMapper<User> { // 没有的方法, 在这里面进行自定义添加即可。 void batchAdd(@Param("userList") List<User> userList); void batchUpdate(@Param("userList") List<User> userList); void batchDeleteByIds(@Param("ids") List<Integer> ids); }