MybatisPlus(条件构造器Wrapper-lambda、自定义sql)

引入依赖

<!--MybatisPlus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>

直接继承MybatisPlus提供的BaseMapper接口:
有MP就可以不要注释掉MyBatis
MybatisPlus中比较常用的几个注解如下
@TableName:用来指定表名 大概是标记成员类的
@Tableld:用来指定表中的主键字段信息 需要制定id为自增长
@TableField:用来指定表中的普通字段信息 标记出来sql表中的真实字段名

@TableName("tb_user")
public class User {
    @TableId(value="id",type= IdType.AUTO )
    private Long id;

属性名和字段名不一致都需要field注解但
属性名为is开头的一般为布尔类型,MP会默认映射到数据库表将is去掉只取后部分命名变量(所以is开头变量必须加field)
属性名和数据库关键字冲突,比如order 用``裱起来 @TableField(" `order` ")
成员变量不是数据库字段 @TableField(exist= false)
关于这个id注解主键,如果特指了类型
ldType的常见类型有哪些?
AUTO、ASSIGN ID、INPUT
就是auto自增,不指定就会默认使用MP自带的雪花算法来赋值id为Long INPUT就是自己填

mybatis-plus:
  type-aliases-package:com.itheima.mp.domain.po #别名扫描包  主要用于扫描映射文件,来mapper与xml文件sql语句对应,来扫描id
  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 # 更新策略:只更新非空字段

条件构造器
MP内置Wrapper条件构造器,主要用于sql复杂语法where条件
Wrapper下有AbstractWrapper类继承其用法,其下又有UpdateWrapper-QueryWrapper和lambda
QueryWrapper就是在允许Query功能还能select哪些字段
构建条件查询

SELECT id,username,info,balance
FROM user
WHERE username LIKE %o% AND balance >=1000

gt=great than ge-great equals eq-equals

@Test
void testQueryWrapper(){
    //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);
    users.forEach(System.out::println);

使用lambda

@Test
void testQueryWrapper(){
    //1.构建查询条件
    QueryWrapper<User>wrapper = new QueryWrapper<User>()
                      .select(User::getId,User::getUsername,User::getInfo,User::getBalance)
                      .like( "username","o" )
                      .ge("balance",1000);

    // 2.查询
    List<User> users =userMapper.selectList(wrapper);
    users.forEach(System.out::println);
UPDATE user
SET balance = 2000
WHERE(username = "jack" )
void testUpdateByQueryWrapper(){
    //1.要更新的数据
    User user =new User();    首先对象设置余额为2000
    user.setBalance(2000);
    //2.更新的条件            齐次用wrapper找到用户名是jack的用户

    QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","jack");
    //3.执行更新
    //执行更新有两种一种是通过id一种是传进去wrapper和user对象
    userMapper.update(user,wrapper);

wrapper对象调用where方法只需要where后面的条件直接.

@Test
void testUpdateWrapper(){
    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);

lambdaWrapper是遵循lambda语法规则
个人理解上述update和query都写死了。用lambda可以作用于动态sql
不接受死参数值,接受函数

条件构造器的用法:
QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
尽量使用LambdaQueryWrapper和LambdaUpdateWrapper避免硬编码

自定义sql
需求:将id在指定范围的用户(例如1、2、4)的余额扣减指定值
where条件交给MP去构建、前半部分就用自定义

我们可以利用MyBatisPlus的Wrapper来构建复杂的Where条件,然后自己定义SQL语句中剩下的部分。
1.基于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);

2.在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew
    void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);

3.自定义SQL,并使用Wrapper条件
<update id="updateBalanceByIds">
    UPDATE tb_user SET balance = balance - #{amount} ${ew.customSqlSegment}
</update> 

wrapper相当于where条件部分,自定义sql相当于操作部分也就是sql的前半部分

Service接口
待续service接口

posted @ 2024-02-02 08:04  launch  阅读(667)  评论(0编辑  收藏  举报