介绍
MyBatis-Plus是MyBatis的好朋友, 与MyBatis配合, 实现开发效率的提高
官网:
特点:
- 润物细无声: 只做增强不做改变, 引入它不会对现有工程产生影响, 如丝般顺滑
- 效率自上: 只需简单配置, 即可快速进行单表CRUD, 从而节省大量时间
- 功能丰富: 代码生产, 自动分页, 逻辑删除, 自动填充等功能一应俱全
单表CRUD
需求: 基于资料中的项目, 实现以下功能
- 新增用户
- 根据id查询用户
- 根据id更新用户
- 根据id批量查询用户
- 根据id删除用户
准备工作
- 打开工程: mp-demo
- 修改配置: 修改数据库的连接信息
- 建库建表: 执行资料中的sql
使用MP的步骤
- 引入依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
- MyBatisPlus官方提供了starter, 其中集成了MyBatis和MyBatisPlus的所有功能, 并且实现了自动装配效果
- 因此, 我们可以用MyBatisPlus的starter代替Mybatis的的starter
- 继承接口
public interface UserMapper extends BaseMapper<User> {
}
- 自定义的Mapper继承MyBatisPlus提供的BaseMapper接口
- 自定义的Mapper中看似什么代码都没有, 但是已经继承了强大的CRUD方法
- 注意要把数据表对应的实体类作为泛型传递给BaseMapper接口, 这样MP才知道CRUD要操作哪个实体
- 直接调用继承的增删改查的方法
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void testInsert() {
User user = new User();
user.setId(5L);
user.setUsername("Lucy");
user.setPassword("123");
user.setPhone("18688990011");
user.setBalance(200);
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userMapper.insert(user);
}
@Test
void testSelectById() {
User user = userMapper.selectById(5L);
System.out.println("user = " + user);
}
@Test
void testQueryByIds() {
List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));
users.forEach(System.out::println);
}
@Test
void testUpdateById() {
User user = new User();
user.setId(5L);
user.setBalance(20000);
userMapper.updateById(user);
}
@Test
void testDeleteUser() {
userMapper.deleteById(5L);
}
}
原理
MyBatis-Plus是通过扫描实体类, 并基于反射获取实体类信息作为数据库表信息, 生成CRUD方法
符合以下约定, MyBatisPlus就可以正确的获取到数据库表的信息, 然后进行增删改查操作
- 类名驼峰转下划线作为表名, 例如 类名 tbUser -> 表名 tb_user
- 名为id的字段作为主键, 如果没有id字段运行会报错
- 变量名驼峰转下划线作为表的字段名
常用注解
大多数情况下, 数据表的设计和实体类是符合MyBatisPlus开发约定的, 特殊情况下需要通过注解解决特定问题
指定表名: 数据表与实体类的名称不一致时, 通过@TableName注解, 指定表名
@Data
@TableName(value = "tb_user")
public class User {
... ...
}
指定主键: 数据表中主键名不是id时, MP运行就会报错, 需要通过@TableId注解, 指定表中的主键字段
@Data
public class User {
/**
* 用户id
*/
@TableId(value="id", type=IdType.AUTO)
private Long idNumber;
}
- 参数说明:
- value用来指定主键字段名
- type用来指定主键类型
- IdType枚举:
- AUTO: 数据库自增长
- INPUT: 通过set方法自行输入
- ASSIGN_ID: 分配基于雪花算法的ID (默认)
- 如果数据表中指定id是自增长, 那么使用MP时, 一定要给id字段设置类型为AUTO, 因为默认是雪花算法
指定字段: 当实体类的变量名存在特殊情况时, 使用@TableField注解, 处理表中的字段
@Data
public class User {
//用户名
//1.成员变量名与数据库字段名不一致
@TableField("username")
private String name;
//状态(1正常 2冻结)
//2.成员变量名以 is 开头, 且是布尔值
//如果变量以is开头且是布尔值, MP编译时会去掉is, 造成变量名与字段名不一致,所以需要手动处理
@TableField("is_status")
private Boolean isStatus;
//排序
//3.成员变量名与数据库关键字冲突
@TableField("`order`")
private Integer order;
//地址
//4.成员变量名不是数据库字段
@TableField(exist=false)
private String address;
}
常用配置
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己的配置, 更多的配置可以去官网查看