-
Mybatis-Plus的条件构造器
-
- 1、测试方法
-
2、条件构造器的常用方法
-
自定义SQL
-
- 1、编写Mapper.xml文件
-
2、在UserMapper接口中添加自定义方法
-
3、在UserService接口中添加自定义方法
-
4、在UserServicelmpl类中重写方法
-
5、测试方法
MyBatis-Plus介绍
官网地址:https://mybatis.plus
1、简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
2、特性-
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
-
损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
-
mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver
-
达梦数据库 、 虚谷数据库 、 人大金仓数据库
表结构设计
1、表结构
设计了一张user用户表,表结构如下。
2、建表执行以下SQL语句建表
DROP TABLE IF EXISTS user;
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘ID’,
name varchar(32) DEFAULT NULL COMMENT ‘姓名’,
age int(11) DEFAULT NULL COMMENT ‘年龄’,
course varchar(32) DEFAULT NULL COMMENT ‘课程’,
fraction int(11) DEFAULT NULL COMMENT ‘分数’,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8mb4;
3、添加初始数据执行以下SQL语句添加初始数据。
INSERT INTO user VALUES (‘1’, ‘张三’, ‘20’, ‘java’, ‘89’);
INSERT INTO user VALUES (‘2’, ‘李四’, ‘19’, ‘C’, ‘64’);
INSERT INTO user VALUES (‘3’, ‘王五’, ‘18’, ‘HTML’, ‘90’);
INSERT INTO user VALUES (‘4’, ‘小熊’, ‘20’, ‘Javascript’, ‘76’);
INSERT INTO user VALUES (‘5’, ‘小马’, ‘17’, ‘C++’, ‘77’);
INSERT INTO user VALUES (‘6’, ‘小李’, ‘18’, ‘JAVA’, ‘59’);
INSERT INTO user VALUES (‘7’, ‘小王’, ‘18’, ‘C’, ‘60’);
INSERT INTO user VALUES (‘8’, ‘小张’, ‘18’, ‘JAVA’, ‘58’);
INSERT INTO user VALUES (‘9’, ‘小白’, ‘23’, ‘python’, ‘61’);
搭建项目
1、项目结构 2、新建Springboot项目
pom.xml文件中需要引入以下依赖。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-devtools
runtime
true
mysql
mysql-connector-java
runtime
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
com.baomidou
mybatis-plus-boot-starter
3.1.0
3、在 application.properties配置文件中添加相关的配置信息#链接数据库配置
spring.datasource.url=jdbc:mysql://localhost:3306/mp?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mybatis-plus相关配置
#xml扫描,多个目录用逗号或者分号隔离(告诉Mapper 对应的xml文件位置)
mybatis-plus.mapper-locations= classpath:mapper
@TableId(type = IdType.AUTO)
private Integer id;
//姓名
private String name;
//年龄
private Integer age;
//科目
private String course;
//分数
private Integer fraction;
}
2、编写Mapper接口UserMapper.java接口
public interface UserMapper extends baseMapper {
}
注: Mapper接口需要继承baseMapper接口,该接口中封装了一些CRUD方法,所以继承该接口后,就
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
不需要编写mapper.xml 文件,即可获得CRUD功能。
3、编写业务层接口UserService.java接口
public interface UserService extends IService {
}
注: UserService接口需要继承IService接口,该接口进一步封装了CRUD采用get 查询单行 、remove 删除、 list 查询集合、 page 分页、 前缀命名方式区分 Mapper 层避免混淆。
4、编写业务层实现类UserServiceImpl.java类
@Service
@Transactional //事务
public class UserServiceImpl extends ServiceImpl
}
5、编写测试ControllerUserController.java类
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/findById")
public User findById(Integer id){
User user = userService.getById(id);
return user;
}
@RequestMapping("/findAll")
public List findAll(){
List userList = userService.list();
return userList;
}
@RequestMapping("/save")
public String save(){
User user = new User();
user.setName(“小三”);
user.setAge(18);
user.setCourse(“C++”);
user.setFraction(88);
userService.save(user);
return “新增一条数据成功!”;
}
}
运行项目后,浏览器上测试:
根据id查询用户
查询全部数据
查询方法为IService接口中封装的,常用方法如下。
Save方法
// 插入一条记录(选择字段,策略插入)
boolean save(T entity);
// 插入(批量)
boolean saveBatch(Collection entityList);
// 插入(批量)
boolean saveBatch(Collection entityList, int batchSize);
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| T | entity | 实体对象 |
| Collection | entityList | 实体对象集合 |
| int | batchSize | 插入批次数量 |
SaveOrUpdate方法
// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);
// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper updateWrapper);
// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList);
// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList, int batchSize);
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| T | entity | 实体对象 |
| Wrapper | updateWrapper | 实体对象封装操作类 UpdateWrapper |
| Collection | entityList | 实体对象集合 |
| int | batchSize | 插入批次数量 |
Remove方法
// 根据 entity 条件,删除记录
boolean remove(Wrapper queryWrapper);
// 根据 ID 删除
boolean removeById(Serializable id);
// 根据 columnMap 条件,删除记录
boolean removeByMap(Map
// 删除(根据ID 批量删除)
boolean removeByIds(Collection extends Serializable> idList);
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| Wrapper | queryWrapper | 实体包装类 QueryWrapper |
| Serializable | id | 主键ID |
| Map
| Collection extends Serializable> | idList | 主键ID列表 |
Update方法
// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper updateWrapper);
// 根据 whereEntity 条件,更新记录
boolean update(T entity, Wrapper updateWrapper);
// 根据 ID 选择修改
boolean updateById(T entity);
// 根据ID 批量更新
boolean updateBatchById(Collection entityList);
// 根据ID 批量更新
boolean updateBatchById(Collection entityList, int batchSize);
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| Wrapper | updateWrapper | 实体对象封装操作类 UpdateWrapper |
| T | entity | 实体对象 |
| Collection | entityList | 实体对象集合 |
| int | batchSize | 更新批次数量 |
Get方法
// 根据 ID 查询
T getById(Serializable id);
// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last(“LIMIT 1”)
T getOne(Wrapper queryWrapper);
// 根据 Wrapper,查询一条记录
T getOne(Wrapper queryWrapper, boolean throwEx);
// 根据 Wrapper,查询一条记录
Map
// 根据 Wrapper,查询一条记录
V getObj(Wrapper queryWrapper, Function super Object, V> mapper);
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| Serializable | id | 主键ID |
| Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
| boolean | throwEx | 有多个 result 是否抛出异常 |
| T | entity | 实体对象 |
| Function super Object, V> | mapper | 转换函数 |
List方法
// 查询所有
List list();
// 查询列表
List list(Wrapper queryWrapper);
// 查询(根据ID 批量查询)
Collection listByIds(Collection extends Serializable> idList);
// 查询(根据 columnMap 条件)
Collection listByMap(Map
// 查询所有列表
List
// 查询列表
List
// 查询全部记录
List listObjs();
// 查询全部记录
List listObjs(Function super Object, V> mapper);
// 根据 Wrapper 条件,查询全部记录
List listObjs(Wrapper queryWrapper);
// 根据 Wrapper 条件,查询全部记录
List listObjs(Wrapper queryWrapper, Function super Object, V> mapper);
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
| Collection extends Serializable> | idList | 主键ID列表 |
| Map | columnMap | 表字段 map 对象 |
| Function super Object, V> | mapper | 转换函数 |
Page方法
// 无条件翻页查询
IPage page(IPage page);
// 翻页查询
IPage page(IPage page, Wrapper queryWrapper);
// 无条件翻页查询
IPage
// 翻页查询
IPage
参数说明
| 类型 | 参数名 | 描述 |
| — | — | — |
| IPage | page | 翻页对象 |
| Wrapper | queryWrapper | 实体对象封装操作类 QueryWrapper |
分页
1、创建分页配置类
MybatisPlusConfig.java类
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
2、编写分页测试方法在上方的测试Controller中添加分页测试方法,代码如下
/**



