Mybatis-plus-核心篇

1,条件构造器

        根据继承体系顶级的父类是AbatractWrapper,它具备所有的查询条件,例如,where,等于,小于,模糊查询,范围查询等等

        我们重点关注他的子类

        QueryWrapper

                他继承了父类的所有方法,但是同时自己新增了方法,主要是他可以自定义sql,例如原本父类查询的方法只能查询所有字段,但是,对于QueryWrapper可以指定查询字段,使用.select方法指定查询的字段,如下图。

        UpdateWrapper

                他同样也继承了父类所有的方法,但是在增加的操作时,在原有的基础之上他可以指定sql便于解决原本查询条件难以解决的sql问题,如下图

        LambdaQueryWrapper 

                它不仅支持父类的所有方法包括自定义sql最关键的是它支持lambad表达式,其实查看使用QueryWrapper构造的查询条件我们可以发现存在大量的硬编码,也就是查询的字段直接写死了,这对于维护和修改都是十分不利的,于是通过LambdaQueryWrapper我们可以完美解决这个问题,修改后的代码如下,查询条件中查询参数传递的将不再是字段名,而是函数

 2,自定义SQL

        为什么使用自定义sql?

                因为存在一种场景,简单的单表查询语句无法满足需求,例如给id为1,2,3的用户的年龄加2,这时候书写sql语句应该是

update user set age=age+2 where id in (1,2)

如果我们直接拼接SQL会导致业务层代码和mapper层代码缠上耦合,如果全部书写sql会非常繁琐,我们希望得到的一种解决方案就是,使用mp提供的便捷的条件封装,加上我们自定义在mapper的sql合并拼装成一条sql语句,进而简化开发并且遵守开发规范,这时候就需要使用自定义sql。

        第一步,封装条件

        第二步,在mapper接口自定义方法
@Mapper
public interface UserMapper extends BaseMapper<User> {
    //  @Param("ew")
    void selectByTest(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("num") int num);
}

注意,条件参数之前一定要加上参数@Param("ew"),注意这是必须的,如果记不住可以使用常量类        Conatants.WRAPPER ,这个可能更难记住,但是这个一定要加,并且不能改变。 

        第三步,在xml映射文件书写sql片段

书写完sql片段之后使用${ew.customSqlSegment}拼接mp封装好的哪些参数,调用即可

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wms.mapper.UserMapper">
    <!--命名空间加载映射接口-->
    <update id="selectByTest">
        update user set age=age+#{num} ${ew.customSqlSegment}
    </update>
</mapper>

        mapper中的xml文件书写sql语句没有提示如何解决?

 1,连接数据库

 2,在xml文件中按住 alt+回车

选择如图所示的         inject language or reference

3,IService接口     

        1,IService基本用法

        mp同样封装了service的常用增删改查的方法,简化我们对于业务层的简单的增删改查

之前我们业务层会定义一个UserService以及他的实现类UserServiceImpl实现它,在UserService的实现类中调用mapper实现业务层逻辑,但是现在我们不需要了,根据mp的业务层继承体系来看

        Iservice中封装了大量的增删改查的业务层代码,我们的UserService接口只需要继承他既可以获取他的所有方法,之后我们的UserServiceImpl实现类实现 UserService接口就可以完成业务层简单的增删改先查,但是,存在一个问题,UserServiceImpl实现接口之后,原本UserService继承自IService的所有方法全部都要实现,如此多的方法要是都一一实现我们继承的意义何在,于是mp为我们又提供了一个类ServiceImpl,这个类实现了IService所有的方法,于是我们的UserServiceImpl只需要再次继承ServiceImpl这个类就不需要实现如此冗余的方法了,但是继承的之后需要制定BaseMapper的类型以及实体类,因为他其实也是帮助我们调用的BaseMapper

使用mp之后业务层的代码实现

接口定义:

public interface UserService extends IService<User> {
}

接口实现:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

之后就可以使用Service实现基本的增删改查了 

        2,使用@RequiredAgsContructor注解加 private final Userservice userservice

代替 @Autowried +...

由于spring官方不支持使用@AutoWried注解自动注入,推荐我们使用构造器的方式进行注入,也就是如下:

private UserService userService;
public UserControl (UserService userService){
    this.userService=userService;
}

但是这种方式书写起来太过繁琐,于是我们采用lambok中的一个构造器注解,@RequiredArgsConstructor解决,规范写法如下:

@RestController
@RequestMapping("/users")
@Api(tags = "测试管理文档")
@RequiredArgsConstructor //由于spring官方不推荐使用@Autowried注解进行自动装配,
                        // 于是我们需要使用构造器注入,这个注解就是用于初始化之前需要
public class UserControl {
    private final UserService userService;
    @PostMapping
    @ApiOperation("新增用户接口")
    public void saveUser(@RequestBody User user){

    }
}
2,IService的Lambda方法

        在service中使用lambdaquery做查询或者使用lambdUpdate做更新可以避免书写原生sql复杂的查询if判断

service层代码实例如下:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    //使用Lambda实现复杂查询
    public void queryByUser(User user) {
        //当前类集成了ServieceImpl其实可以直接调用mapper,或者直接调用自身
        //1,调用mapper
        List<User> users = baseMapper.selectList(null);
        /,2,调用service也就是自身直接查询,可以使用this,也可以直接查询
        User byId = this.getById(1);
        User byId1 = getById(2);

        //,3重点查询,使用Lambda进行多条件复杂查询,
        //list查询集合,one查询一个,update更新
        //假设有当前条件,姓名不为空时,查询姓名为name
        //年龄不为空时,查询年龄小于age
        String name = user.getName();
        int age = user.getAge();
        List<User> list = lambdaQuery().
                like(name != null, User::getName, name).
                lt(age != 0, User::getAge, age).
                list();
        //4,更新操作,也可以指定参数不为空
        lambdaUpdate().
                set(name!=null,User::getName,name).
                eq(User::getId,1).
                update();

    }
}

3,IService批处理方式

        了解即可 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值