MybatisPlus真的很简单

概要

Mybatis大家肯定都用的很多了,作为一个java持久层的框架,mybatis通过简单的XML或者注解配置文件,将SQL语句与java对象进行映射,从而实现我们能够通过SQL语句直接实现对数据库的操作。

而MybatisPlus不一样,它是在Mybatis的基础上,只做增强不做改变。增强的地方主要有如下几点:

①更简单的CRUD:使用MybatisPlus都不用手写SQL语句了,逻辑的判断全由java代码来实现。

②代码自动生成:使用MybatisPlus插件,是可以自动帮我们生成代码的噢~包括controller层、service层、mapper层以及实体类。这几层是我们使用SpringBoot框架做开发的基础架构。

③集成了分页插件:使用分页功能的时候更加快捷简便。

④MybatisPlus支持多种数据库:MybatisPlus可以在多种数据库之间从容切换。

从零手撕MybatisPlus

介绍这么多,想必大家对MybatisPlus已经有了一个初步的认识,接下来就带领大家手撕MybatisPlus~

0、学习建议

在手撕MybatisPlus的过程中,我们先用原来的步骤自己创建工程结构,感受一下MybatisPlus的运作流程,最后再使用代码生成器去生成代码。其实这是一个学习的过程,只有先熟悉了代码,再自动生成的时候我们也看的懂。就像当初学习java基础的时候,get、set、构造器方法没少折磨,但是学到后面才发现,原来可以一键生成。

1、环境准备

1、数据库
我们需要准备一个数据库:

在这里插入图片描述
2、导依赖
使用MybatisPlus需要我们导入相关依赖才能使用。

<!--mybatisplus起步依赖-->

<dependency>
	<groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>

3、写配置
使用MybatisPlus还需要在yml文件中配置MybatisPlus

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #打印sql语句

4、创工程
我们需要创建一个SpringBoot项目,工程目录如下:

在这里插入图片描述
5、实体类内容

在这里插入图片描述
这里有四个注解我们之前没有用过,在这里做一个简单的介绍:

①:表名,用于实体类和数据库表名不一致时,进行关系绑定映射。

②:表ID:用于实体类的属性和数据库的主键字段进行绑定,type=AUTO是指使用自增。

③:表字段:用于实体类属性和数据库表字段的映射关系。exist=false:代表数据库中不存在这个字段。

④:逻辑删除:物理删除就是我们直接将数据库的数据删除掉了,而逻辑删除用于不想真实删除某些数据,但又不想让其出现时。

6、mapper层
controller层、service层不变,还是原来的写法,仅仅是mapper层继承BaseMapper
在这里插入图片描述
7、启动类上扫描mapper层
在这里插入图片描述

环境我们已经准备好了,注意,我们现在体验的是最普通的MybatisPlus,后续还可以简化的。现在我们随便写点代码初步体验一下MybatisPlus的CRUD

2、简单的CRUD

①根据Id查询

首先我们在controller层随便写点代码:

代码如下(示例):

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

	//根据id查询用户
    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id){
        User user = userService.getUserById(id);
        return user;
    }
}

这些代码相比大家都熟悉到不能在熟悉了,不过多做解释,直接来到实现类:

代码如下(示例):

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    
    //根据id查询用户
    @Override
    public User getUserById(Long id) {
        User user = userMapper.selectById(id);
        return user;
    }
}

往常进行到这里,是不是就要开始去mapper写代码啦~诶不用!因为我们的mapper层,继承了BaseMapper,因此就不用写SQL语句咯。我们直接运行一下,然后在浏览器直接看结果:

在这里插入图片描述
解释:
在BaseMapper中早就已经封装好了基础查询的语法规则了,我们继承以后可以直接拿来用,就是这么简单。
在这里插入图片描述

②新增一个用户

controller层代码如下(示例):

	//新增用户
    @PostMapping
    public void getNewUser(@RequestBody User user){
        userService.getNewUser(user);
    }

实现类也及其简单,代码如下(示例):

	//新增用户
    @Override
    public void getNewUser(User user) {
        userMapper.insert(user);
    }

因为我们新增用户要用到表单,没有写~我们就用测试工具搞一下:
在这里插入图片描述
没报错就是对了~我们去数据库瞅一眼张五这条数据在不在
在这里插入图片描述

③修改一个用户

controller层代码如下(示例):

    //根据Id修改用户
    @PutMapping("/{id}")
    public void updateUser(@PathVariable Long id){
        userService.updateUser(id);
    }

实现类代码如下(示例):

	//修改用户
    @Override
    public void updateUser(Long id) {
        User user = userMapper.selectById(id);
        user.setName("张二麻子");
        userMapper.updateById(user);
    }

由于条件苛刻,我们就数据写死,简单测一下即可~
在这里插入图片描述
查看一眼数据库:
在这里插入图片描述

④删除一个用户

删除太简单了,这里就不测了哈
controller层代码如下(示例):

	//根据id删除用户
    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id){
        userService.deleteUserById(id);
    }

实现类代码(示例):

	//删除用户
    @Override
    public void deleteUserById(Long id) {
        userMapper.deleteById(id);
    }

3、稍微复杂一丢丢的业务

光是简单的CRUD肯定无法满足业务需求,因此就有了按条件查询。其实按条件查询也非常简单,步骤就是如下几步:

①创建QueryWrapper<>对象,泛型是实体类,建议用LambdaQueryWrapper<>;这二者除了写法上有所区别外,内容毫无区别,后者更优雅一些,因此我们都以LambdaQueryWrapper<>为例。

②写条件

③调用BaseMapper的方法

技术名词解释

创建对象就不用说了叭,直接new出来就行了。主要是条件的写法,首先介绍一下条件语法:

	eq( ) :  等于 =
    ne( ) :  不等于 <>
    gt( ) :  大于 >
    ge( ) :  大于等于  >=
    lt( ) :  小于 <
    le( ) :  小于等于 <=
    between ( ) :  BETWEEN 值1 AND 值2
    notBetween ( ) :  NOT BETWEEN 值1 AND 值2
    in( ) :  in
    notIn( ) :not in

    like  相当于:'%值%'【索引失效】  数量大时
    likeLeft 相当于: '%值' 【坚决不写,让索引失效】
    likeRight 相当于: '值%' 【可写】

    组合条件:
    1. 并且关系(and)
    2. 或者关系(or)
    3. null值的处理

条件语法总体就是这些,我们简单感受一下:

1、查询年龄大于20岁的用户

controller层代码如下(示例):

	//查询年龄大于20岁的用户
    @GetMapping
    public List<User> getUserById(){
        List<User> list = userService.getUsers();
        return list;
    }

实现类代码如下(示例):

	//查询年龄大于20岁的用户
    @Override
    public List<User> getUsers() {
    	//第一步,创建queryWrapper对象
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        //第二步,写条件
        queryWrapper.gt(User::getAge,20);
        //第三步,调方法
        List<User> list = userMapper.selectList(queryWrapper);
        return list;
    }

简单解释一下第二步,条件在上面已经罗列出来了,参数的意思如下:

第一个参数是实体类的属性名称,表示需要进行大于比较的属性。

第二个参数是需要进行比较的值,表示查询结果中对应属性的值必须大于该值才符合查询条件。

在这里插入图片描述

2、修改指定id的用户

controller层的代码和上面修改指定用户的代码一致,我们只需要更改一下实现类的方法就行。
实现类代码如下(示例):

//修改用户
    @Override
    public void updateUser(Long id) {
    	//对于修改专门有updateWapper,但用法和queryWapper一样
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        //先获取指定id的用户
        updateWrapper.eq(User::getId,id);
        //设置条件
        updateWrapper.set(User::getName,"李哈哈哈哈");
        //null代表更新所有字段
        userMapper.update(null,updateWrapper);
    }

在这里插入图片描述

3、模糊查询

代码我就不测试了哈,简单给大家看一下实现类的代码即可:

	@Override
    public List<User> findUserByLike() {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        //queryWrapper.like(User::getName, "张");
        //姓张:通配符%在张的右边,因此最好用likeRight
        queryWrapper.likeRight(User::getName,"张");
        List<User> userList = userMapper.selectList(queryWrapper);
        return userList;
    }

这些条件查询用法都是一样的,代码都是万变不离其宗的,大家自己去实验一下即可掌握~

4、分页查询

之所以要单独将一下分页查询,是因为我们之前使用mybatis的时候,分页的需求我们都是用分页插件来完成的。而我们的MybatisPlus怎么能没有呢?但是我们现在不用分页插件,而是用内部的分页拦截器来完成。具体操作步骤如下:

1、定义一个配置类:
代码如下(示例):

//注册分页拦截器
@Configuration
public class PageConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        //1、创建 MP 拦截器对象
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        //2、添加分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        //3、返回拦截器对象
        return mybatisPlusInterceptor;
    }
}

2、使用的时候我们需要先定义分页对象

controller层代码(示例):

 	//分页查询
    @GetMapping
    public Page<User> getByPage(){
        Page<User> page = userService.getByPage();
        return page;
    }

实现类代码:

 	//分页查询
    @Override
    public Page<User> getByPage() {
        //1.构建分页对象
        Page<User> page = new Page<>(1,2);
        //2.构建条件对象
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        //3、写条件
        queryWrapper.ge(User::getAge, 18);
        //4.调用selectPage()方法
        Page<User> pageResult = userMapper.selectPage(page, queryWrapper);
        return pageResult;
    }

直接看控制台比较好
在这里插入图片描述

技术细节一

MybatisPlus不仅可以封装Mapper 层,也可以封装service层,这样我们有很多
简单的代码,就可以直接在service层就结束了,具体我就不演示了哈~

封装service:

在这里插入图片描述

封装实现类:

在这里插入图片描述

技术细节二

前文我们提到,MybatisPlus还可以帮我们生成代码对叭~现在也教给大家:

1、下载一个插件:MybatisPlus

在这里插入图片描述
2、在导航栏上找other

在这里插入图片描述
3、先点①建立数据库连接

4、再点②生成代码

在这里插入图片描述

小结

充电时刻
MybatisPlus是一个非常好用的持久层框架,其最大的优点就是,不用写SQL语句,这对程序员来说,极大的加快了我们的开发速度。
并且MybatisPlus使用起来也非常的简单。只要大家勤练,很快就能上手了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值