根据继承体系顶级的父类是AbatractWrapper,它具备所有的查询条件,例如,where,等于,小于,模糊查询,范围查询等等
我们重点关注他的子类
他继承了父类的所有方法,但是同时自己新增了方法,主要是他可以自定义sql,例如原本父类查询的方法只能查询所有字段,但是,对于QueryWrapper可以指定查询字段,使用.select方法指定查询的字段,如下图。
他同样也继承了父类所有的方法,但是在增加的操作时,在原有的基础之上他可以指定sql便于解决原本查询条件难以解决的sql问题,如下图
它不仅支持父类的所有方法包括自定义sql最关键的是它支持lambad表达式,其实查看使用QueryWrapper构造的查询条件我们可以发现存在大量的硬编码,也就是查询的字段直接写死了,这对于维护和修改都是十分不利的,于是通过LambdaQueryWrapper我们可以完美解决这个问题,修改后的代码如下,查询条件中查询参数传递的将不再是字段名,而是函数
因为存在一种场景,简单的单表查询语句无法满足需求,例如给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 public interface UserMapper extends BaseMapper{ // @Param("ew") void selectByTest(@Param(Constants.WRAPPER) QueryWrapper wrapper, @Param("num") int num); }
注意,条件参数之前一定要加上参数@Param("ew"),注意这是必须的,如果记不住可以使用常量类 Conatants.WRAPPER ,这个可能更难记住,但是这个一定要加,并且不能改变。
书写完sql片段之后使用${ew.customSqlSegment}拼接mp封装好的哪些参数,调用即可
update user set age=age+#{num} ${ew.customSqlSegment}
mapper中的xml文件书写sql语句没有提示如何解决?
1,连接数据库
2,在xml文件中按住 alt+回车
选择如图所示的 inject language or reference
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{ }
接口实现:
@Service public class UserServiceImpl extends ServiceImplimplements 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){ } }
在service中使用lambdaquery做查询或者使用lambdUpdate做更新可以避免书写原生sql复杂的查询if判断
service层代码实例如下:
@Service public class UserServiceImpl extends ServiceImplimplements UserService { //使用Lambda实现复杂查询 public void queryByUser(User user) { //当前类集成了ServieceImpl其实可以直接调用mapper,或者直接调用自身 //1,调用mapper List 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 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批处理方式
了解即可