MybatisPlus核心用法
目录
1.使用MybatisPlus的基本步骤:
①引入MybatisPlus依赖,代替Mybatis依赖
<!--MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
②定义Mapper接口并继承BaseMapper
public interface UserMapper extends BaseMapper<User> {}
③在实体类上添加注解声明 表信息
④在application.yml中根据需要添加配置
2.MybatisPlus是如何获取实现CRUD的数据库表信息的?
MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
约定:
•默认以类名驼峰转下划线作为表名
•默认把名为id的字段作为主键
•默认把变量名驼峰转下划线作为表的字段名
3.MybatisPlus的常用注解有哪些?
•@TableName:指定表名称及全局配置
•@TableId:指定id字段及相关配置
•@TableField:指定普通字段及相关配置
如果表名称和实体类名称不符合约定该怎么做?
使用注解来设定表名、主键、普通字段信息等。
IdType的常见类型有哪些?
•AUTO、ASSIGN_ID、INPUT
使用@TableField的常见场景是?
•成员变量名与数据库字段名不一致
•成员变量名以is开头,且是布尔值
•成员变量名与数据库关键字冲突
•成员变量不是数据库字段
4.MyBatisPlus的配置
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置。例如:
mybatis-plus:
type-aliases-package: com.itheima.mp.domain.po # 别名扫描包
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值
configuration:
map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射
cache-enabled: false # 是否开启二级缓存
global-config:
db-config:
id-type: assign_id # id为雪花算法生成
update-strategy: not_null # 更新策略:只更新非空字段
具体可参考官方文档:使用配置 | MyBatis-Plus (baomidou.com)
5. 核心功能
条件构造器
条件构造器的用法:
•QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
•UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
•尽量使用LambdaQueryWrapper和 LambdaUpdateWrapper,避免硬编码
自定义SQL
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
①基于Wrapper构建where条件
List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
// 1.构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getId, ids);
// 2.自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount);
②在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
③自定义SQL,并使用Wrapper条件
<update id="updateBalanceByIds">
UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update>
Service接口
MP的Service接口使用流程是怎样的?
自定义Service接口继承IService接口
public interface IUserService extends IService<User> {}
自定义Service实现类,实现自定义接口并继承ServiceImpl类
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {}
其中我们可以利用ServiceImpl中实现的方法直接进行增删改查等上图的操作。
lambaQuery.eq(条件,使用反射获取属性,属性的值也就是参数)
lambaUpdate同理,但最后要跟上.update();
6.DB静态方法
使用的时候必须给lambadQueryg一个实体类对象
7.逻辑删除
逻辑删除就是基于代码逻辑模拟删除效果,但并不会真正删除数据。思路如下:
•在表中添加一个字段标记数据是否被删除
•当删除数据时把标记置为1
•查询时只查询标记为0的数据
例如逻辑删除字段为deleted:
•删除操作:
UPDATE user SET deleted = 1 WHERE id = 1 AND deleted = 0
•查询操作:
SELECT * FROM user WHERE deleted = 0
MybatisPlus提供了逻辑删除功能,无需改变方法调用的方式,而是在底层帮我们自动修改CRUD的语句。我们要做的就是在application.yaml文件中配置逻辑删除的字段名称和值即可:
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名,字段类型可以是boolean、integer
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
8.枚举处理器
如何实现PO类中的枚举类型变量与数据库字段的转换?
①给枚举中的与数据库对应value值添加@EnumValue注解
给自定义的枚举类中添加@EnumValue注解如上右图
②在配置文件中配置统一的枚举处理器,实现类型转换
mybatis-plus:
configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler
9.JSON处理
在数据库表中存在info是JSON类型的,当我们想要获取info中的age或者其他属性时,很难获取到,这时候要使用JSON处理器。