目录
官⽹: https://mybatis.plus/ 或 https://mp.baomidou.com/
一.快速入门
1.入门案例
需求:基于课前资料提供的项目,实现下列功能: 新增用户功能 ,根据id查询用户, 根据id批量查询用户, 更加id更新用户, 根据id删除用户。
1.引入MybatisPlus的起步依赖
MyBatisPlus官方提供了starter,其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。 因此我们可以用MybatisPlus的starter代替Mybatis的starter:
2.定义Mapper
MyBatisPlus提供了一个BaseMapper接口,其中定义了单表的CRUD功能。 因此我们自定义的Mapper只要继承BaseMapper就具备了这些功能,无需自己手动编写:
2.常见注解
MyBatisPlus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息:
@Data
public class User {
private Long id;
private String username;
private String password;
private String phone;
private String info;
private Integer status;
private Integer balance;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}
3.常见配置
MyBatisPlus的配置项继承了MyBatis原生配置和一些自己特有的配置.
ybatis-plus:
type-aliases-package: com.itheima.mp.domain.po # 别名扫描包
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值 global-config:
db-config:
id-type: auto # id为自增长
update-strategy: not_null # 更新策略:只更新非空字段
configuration:
map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射
cache-enabled: false # 是否开启二级缓存
具体可参考官方文档:使用配置 | MyBatis-Plus (baomidou.com)
总结:MyBatisPlus使用的基本流程是什么? 1.引入起步依赖 2.自定义Mapper基础BaseMapper 3.在实体类上添加注解声明表信息 4.在application.yml中根据需要添加配置
二.核心功能
1.条件构造器
MyBatisPlus支持各种复杂的where条件,可以满足日常开发的所有需求。
基于QueryWrapper的查询 :
需求:查询出名字中带o的,存款大于等于1000元的人的id、username、info、balance字段
SELECT id,username,info,balance
FROM user WHERE username LIKE ? AND balance >= ?
需求:更新用户名为jack的用户的余额为2000
UPDATE user
SET balance = 2000
WHERE (username = "jack")
需求:更新id为1,2,4的用户的余额,扣200
UPDATE user
SET balance = balance - 200
WHERE id in (1, 2, 4)
2.自定义SQL
我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
基于Wrapper构建where条件
// 1.构建查询条件
where name like "%o%" AND balance >= 1000QueryWrapper<User> wrapper = new QueryWrapper<User>()
.like("username", "o")
.ge("balance", 1000);
// 2.查询数据
List<User> users = userMapper.findByCustom(wrapper);
在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
List<User> findByCustom(@Param("ew")QueryWrapper<User> wrapper);
自定义SQL,并使用Wrapper条件
<select id="findByCustom" resultType="User">
SELECT * FROM user ${ew.customSqlSegment}
</select>
自定义Update结合Wrapper:
需求:将id为1、2、4的用户金额扣减200,不允许在service层出现SQL语句。
<select id="updateBalanceByIds" resultType="com.itheima.mp.domain.po.User">
UPDATE user
SET balance = balance - 200
WHERE id
<foreach collection="ids" separator="," item="id" open="IN (" close=")">
#{id}
</foreach>
</select>
基于Wrapper的多表关联查询:
需求:查询出所有收货地址在北京的并且用户id在1、2、4之中的用户
<select id="queryUserByIdAndAddr" resultType="com.itheima.mp.domain.po.User">
SELECT *
FROM user u
INNER JOIN address a ON u.id = a.user_id
WHERE u.id
<foreach collection="ids" separator="," item="id" open="IN (" close=")">
#{id}
</foreach>
AND a.city = #{city}
</select>
3.Service接口
IService批量新增
需求:批量插入10万条用户数据,并作出对比: 1.普通for循环插入 2.IService的批量插入 3.开启rewriteBatchedStatements=true参数
IService的Lambda查询
需求:基于IService中的lambdaQuery()实现一个方法,满足下列需求: 1.查询名字为Rose的用户 2.查询名字中包含‘o’的用户 3.统计名字中包含‘o’的用户的数量 4.定义一个方法,接收参数为username、status、minBalance、maxBalance,参数可以为空。 4.1如果username参数不为空,则采用模糊查询; 4.2如果status参数不为空,则采用精确匹配; 4.3如果minBalance参数不为空,则余额必须大于minBalance 4.4如果maxBalance参数不为空,则余额必须小于maxBalance
IService的Lambda更新
需求:基于IService中的lambdaUpdate()方法实现一个更新方法,满足下列需求: 1.参数为balance、id、username 2.id或username至少一个不为空,根据id或username精确匹配用户 3.将匹配到的用户余额修改为balance 4.如果balance为0,则将用户status修改为冻结状态
4.静态工具
总结:
IService中的方法分为几类?
包含save、remove、update、get、list、count、page、lambda等8类
使用MP的最佳实践是什么?
一般业务尽量使用IService中方法 需要自定义SQL时使用BaseMapper
为了避免Service循环依赖,可以使用BaseMapper或静态工具Db
三.扩展功能
1.代码生成
2.逻辑删除
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)