一篇文章看懂SpringBoot+MyBatis-Plus开发CURD接口!

1.添加依赖

1.1添加要使用到的工具依赖

<!--springboot父依赖 -->
	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
    </parent>
 <!--mybatis-plus依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
         <!--lombok依赖 不了解这个的下面会讲!-->
         <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

2.使用MyBatis-Plus准备工作:

简单整个用户表
我们可以看到有id,username,password字段!
-------------------咱们简单的举个例子,不做过多的列举-----------------------

注意:这里的id为什么有两个不同的类型切换,是因为不同的类型可以使用不同的ID生成策略!后边会讲到!

2.1搭建使用user表的类(MyBatis-Plus 简称MP)

2.1.1实体类:user表对应:User.java

用户类
插句题外话:@TableId这个注释是代表了你的id生成策略!
IdType.AUTO:代表自动递增【MySQL中必须勾选自动递增才能生效!】
还有其他的几种生成策略这里就不一一赘述了,有兴趣可以自己查阅或者留言我们再讨论!

2.1.2确立User类后介绍新人物:Lombok

在这里再提到一个好用的插件:lombok!
在这里插入图片描述
安装插件:idea–>setting–>Plugins–>搜索然后install–>Apply即可!

那么什么是lombok,为什么用这个插件呢?
我们常常讲开发使用框架最主要是为了少敲代码!正如它的价值就是自动生成我们需要的代码!
引入这个插件使用到的是:@Data注解 它的作用如下:
在这里插入图片描述
我们可以看到,我们的类中只写了类的属性【数据库的字段】并没有写构造函数以及set/get以及构造方法…但是左边显示我们写完了!这就是lombok的好用之处!给我们省力气!

2.1.3实体类有了,下来就要做我们的素质三连击:

Controller + Mapper + Service

控制器、映射文件以及我们的业务处理文件

Let’s go!

1)创建UserController在这里插入图片描述
@RestController:将返回值都写入响应体中方便统一操作而不是将值放到模型中并传递给一个视图以便于渲染。
@CrossOrigin: 跨域注解!@CrossOrigin允许在@RequestMapping注解中指定的所有源和HTTP方法!(前后端分离使用/因为不分离是同一个端口不涉及跨域问题)
@RequestMapping(“/user”):@RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上。
实际上注解后方的(“value”)才是请求资源的访问路径,它是http://localhost:port/value/xxx【接口方法地址】

2)创建mapper文件
在这里插入图片描述
Mapper文件是接口类型,因此创建的时候注意不要选择Class!
我们不妨点按住 唱跳rap篮球键(Ctrl键)+鼠标左键单击 开继承的这个BaseMapper

在这里插入图片描述
细心的小伙伴们可以发现,BaseMapper后边有一个

    User是实体类的名字/数据库表名字/泛型的加入是为了实体类的规范,就比如你的方法是修改A类结果你传入B类参数,这不就不符合规范了吗!所以使用规范编程很有必要!

废话少说!

3)创建业务处理层!
service包下放入接口!UserService!
在这里插入图片描述
不过内嵌的实现CURD方法名不同罢了!!!
在这里插入图片描述
你看一个叫insert(mapper)/一个叫save(service)

同样的封装,熟悉的身影~就想那个Ta一样,那么熟悉但不是Ta!!!

这个接口负责业务处理,处理不能只靠定义方法,得具体实现!

因此:实现类来了!
在这里插入图片描述
service下的impl包下写出他的实现类!

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
//ServiceImpl<UserMapper, User> 固定写法 
//一个实现类想使用MP,必须使用这个继承类并写入Mapper以及实体类!

做到现在我们发现:准备工作结束!但是具体的接口方法呢?被博主吃了?

开整:仔细对比下面的方法

2.2.1添加(insert/save)

@RestController
@CrossOrigin
@RequestMapping("/user")
public class UserController {

    @Autowired //自动注入userMapper 交给Spring容器管理
    private UserMapper userMapper;

    @Autowired //自动注入userService交给Spring容器管理
    private UserService userService;

    //1.使用userMapper完成添加!
    @PostMapping("add")
    public R add(@RequestBody User user){
        int insert = userMapper.insert(user);
        if (insert == 1 ){
            return R.ok();
        }else {
            return R.error();
        }
    }

    //2.使用userService完成添加!
    @PostMapping("add2")
    public R add2(@RequestBody User user){
        boolean save = userService.save(user);
        if (save){
            return R.ok();
        }else {
            return R.error();
        }
    }
}
			//使用不同的方法调用!但是结果没有区别! 那我们就能任选其一吗? 
				//简单的逻辑这么做没问题!但是复杂的逻辑最好还是用规范写法!
					//规范些~编码的方式规范些~

那么怎么算是规范呢?

//UserController文件
@PostMapping("add3")
    public R add3(@RequestBody User user){
      //调用Service中的add自定义方法!
        boolean save = userService.add(user);
        if (save){
            return R.ok();
        }else {
            return R.error();
        }
    }
//UserService中实现方法
public interface UserService extends IService<User> {
    boolean add(User user);
}

//UserServiceImpl文件中处理实现我们的add方法
   @Autowired
    private UserMapper userMapper;

    @Override
    public boolean add(User user) {
        int insert = userMapper.insert(user);
        if (insert==1){
            return true;
        }else{
        return false;
        }
    }

		//使用控制层调用逻辑层--->逻辑层调用业务处理层【impl包里面的代码】!

在这里插入图片描述
这种add一条记录的操作,没必要如此大动干戈,这里只是做个比喻方便你明白,自定义复杂逻辑的处理流程!

批添加同理:

 userService.saveBatch(List<User> userList) // 批添加操作!
 System.out.println("批添加只有我们的service封装了!mapper没有");

那么简单的添加方法就介绍到这儿!
宝!!!看到这儿了!别走!!!!

2.2.2删除:Delete!

刚刚讲完添加(insert/add)是不是感觉好磨叽!其实是因为我们增加前置工作繁琐!

废话不多**!
在这里插入图片描述

	//代码在此
@GetMapping("del/{id}")
    public R del(@PathVariable String id){
        //使用id传参直接remove
        boolean b = userService.removeById(id);
        if (b){
            return R.ok();
        }
        else{
            return R.error();
        }
    };

@PathVariable:从url地址中拿到我们的id!

http://localhost:8080/del/1
http://localhost:8080/del/1
看这个地址 发现目标:del/1

我们规定:这个参数id名称必须对应我们的**@GetMapping(“del/{id}”) 中的 {id}**才能使用这个注解拿到我们的值!!!!

根据这个id让MyBatis-Plus这小子来帮我们通过这个id值去删除这个记录!!!!!!

//另一种删除:
@GetMapping("del/{id}")
    public R del(@PathVariable String id){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //条件查询构造器QueryWrapper:【拼接你的条件作为sql中的where】
        //条件:数据库字段:id 是 id变量值这条数据我不要了
        wrapper.eq("id",id);
        boolean remove = userService.remove(wrapper);
        if (remove){
            return R.ok();
        }else{
            return R.error();
        }
    }
}

你可以多次累加条件到同一个参数构造器!
在这里插入图片描述
看到了吗?这个简单的登录流程代码,使用我们的条件查询构造器很容易就能完成用户账户以及密码的验证!

/**
那么随之而来就是我们的批量删除!

同样它只需要你给一个id的集合就能完成操作!

便捷的不要不要的~~~~
*/
public R delByIds(@RequestBody List<String> ids){
        boolean deleteByIds = studentService.removeByIds(ids);
        if (deleteByIds){
            return R.ok().message("删除成功!");
        }else {
            return R.error().message("删除失败!");
        }

2.2.3 修改竟然与添加没什么区别!!!

    /**
仔细观察:是不是跟我们的新增很相似!

其实就是传入修改后的整体对象,通过id进行修改!

批修改也是如此!不过一般很少使用!做个了解就行。
*/
 @PostMapping("update")
    public R update(@RequestBody User user){
        boolean update = userService.updateById(user);
        if (update){
            return R.ok().message("修改成功!");
        }else {
            return R.error().message("修改失败!");
        }
    }



    /**
     * <p>
     * 批量修改插入
     * </p>
     *
     * @param entityList 实体对象集合
     */
    boolean saveOrUpdateBatch(Collection<T> entityList);

    /**
     * <p>
     * 批量修改插入
     * </p>
     *
     * @param entityList 实体对象集合
     * @param batchSize  每次的数量
     */
    boolean saveOrUpdateBatch(Collection<T> entityList, int batchSize);

总结:修改就是一个存在id字段的无新记录的新增!

2.2.4 查询(分页) 重点

/**
					分页就得使用分页插件,不然分页咳嗽!!!
					固定写法CV就行!
*/
@Configuration
public class MpConfig {
    /**
     * 分页插件
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
						//开始分页查询
						
 @PostMapping("page/{current}/{limit}")//拿到我们想要的页码以及记录条数
 //【选配其他条件查询 ==  条件分页查询 ? Yes,true】
 
 //R是返回类 是自己设计的,不想写可以私信我!给你发!宠你!
 //R是返回类 是自己设计的,不想写可以私信我!给你发!宠你!
 //R是返回类 是自己设计的,不想写可以私信我!给你发!宠你!
    public R findByPage(@PathVariable Integer current,
                        @PathVariable Integer limit,
                        @RequestBody Query query("条件!")
        Page<User> page = new Page<>(current,limit);//拿到分页对象传分页参数!
        QueryWrapper<User> wrapper = new QueryWrapper<>();//生成构造器对象
        //下面是条件 可以根据具体情况具体设计 这里就给封印了!
         // if (query.getId() != null){
         //   wrapper.eq("id",query.getId());
         //  }
        //   if (query.getName() != null){
        //       wrapper.like("name",query.getName());
        //   }
        wrapper.orderByDesc("gmt_modified");//查询 降序
        IPage<User> pageRecords = userService.page(page, wrapper);
        //所有数据都在这个pageRecords里
        long total = pageRecords.getTotal();//得到总记录数--->数据库总记录数
        List<User> records = pageRecords.getRecords();//当前页数据!
        Map map = new HashMap();
        map.put("total",total);
        map.put("records",records);
        return  R.ok().data(map);//返回数据给前端接收!
        }

在这里插入图片描述
以上就是SpringBoot集成MyBatis-Plus进行简单的CURD操作!

有很多地方可能不够深入,不过不懂可以随时交流!

如果觉得文章写的让你有丁点儿收货!

还请帮忙点赞转发!后续会更新玩Vuejs拿捏后端传递的数据!

让更多的小白一起慢慢成长!
在这里插入图片描述
这是我的公众号!刚起步,准备与大家共进步! 欢迎关注探讨技术! 谢谢!!!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值