MyBatis-Plus 🚀 为简化开发而生 (baomidou.com)
使用基本步骤:
-
引入Mybatis-plus依赖,代替Mybatis依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-spring-boot3-starter</artifactId> <version>3.5.7</version> </dependency>
-
定义Mapper接口继承BaseMapper
public interface AccountMapper extends BaseMapper<Account> { }
-
在实体类上添加注解声明 表信息
-
在application.yml中根据需要添加配置
MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。
- 类名驼峰转下划线作为表名
- 名为id的字段作为主键
- 变量名驼峰转下划线作为表的字段名
常见注解
-
@TableName
指定表名 -
@TableId
指定表中的主键字段信息 -
@TableField
指定表中的普通字段信息@TableField("username")
表中为name
@TableField("'order'")
与关键字冲突,使用转义字符@TableField(exist=false)
数据库表不存在
IdType枚举:
AUTO
数据库自增长,一定要加@TableID(type=AUTO)
INPUT
通过set方法自行输入ASSIGN_ID
分配ID,接口IdentifierGenerator
的方法nextId
来生成id
,默认实现类为DefaultIdentifierGenerator
雪花算法
常见配置
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 # 更新策略:只更新非空字段
注:全局配置优先级 < 注解
核心功能
1 条件构造器
MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。
QueryWrapper
和LambdaQueryWrapper
通常用来构建select、delete、update的where条件部分UpdateWrapper
和LambdaUpdateWrapper
通常只有在set语句比较特殊才使用- 尽量使用
LambdaQueryWrapper
和LambdaUpdateWrapper
,避免硬编码
-
查询出名字中带o的,存款大于等于1000元的人的id、username、info、balance字段
SELECT id,username,info,balance FROM user WHERE username LIKE ? AND balance >= ?
// 1. 构建查询条件 QueryWrapper<User> wrapper = new QueryWrapper<User>() .select("id","username","info","balance") .like("username","o") .ge("balance",1000); // 2. 查询 List<User> users = userMapper.selectList(wrapper);
-
更新用户名为jack的用户的余额为2000
UPDATE user SET balance = 2000 WHERE (username = "jack")
// 1. 要更新的数据 User user = new User(); user.setBalance(2000); // 2. 更新的条件 QueryWrapper<User> wrapper = new QueryWrapper<User>.eq("username","Jack"); // 3. 执行更新 userMapper.update(user, wrapper);
-
更新id为1,2,4的用户的余额,扣200
List<Long> ids = List.of(1L,2L,4L); UpdateWrapper<User> wrapper = new UpdateWrapper<User>() .setSql("balance = balance - 200") .in("id",ids); userMapper.update(null, wrapper);
-
使用Lambda(传函数)
// 1. 构建查询条件 LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>() .select(User::getId,User::getUsername,User::getInfo,User::getBalance) .like(User::getUsername,"o") .ge("balance",1000); // 2. 查询 List<User> users = userMapper.selectList(wrapper);
2 自定义SQL
利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
例:将id在指定范围的用户(例如1、2、4 )的余额扣减指定值
-
基于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接口
- 自定义Service接口继承IService接口
public interface IAccountService extends IService<Account> {
}
- 自定义Service实现类,实现自定义接口并继承ServiceImpl类
@Service
public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> implements IAccountService {
}