mybatis-plus 基于 service 接口的 crud

文章目录


通用 Service CRUD 封装 IService (opens new window) 接口,进一步封装 CRUD,

采用 get 查询单行remove 删除list 查询集合page 分页 前缀命名方式,区分 Mapper 层避免混淆

对比Mapper接口CRUD区别:

  • service添加了批量方法
  • service层的方法自动添加事务

使用Iservice接口方式

接口继承IService接口

java 复制代码
public interface UserService extends IService<User> {
}

类继承ServiceImpl实现类

java 复制代码
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService{
}



举例详解

总结

  1. 核心流程 :Spring Boot + MyBatis-Plus的Service层开发,

    核心是「接口继承 IService + 实现类继承 ServiceImpl 」,

    复用MP封装的通用CRUD方法,无需手写基础SQL。

  2. 关键注解
    @Service(标记 Service Bean)、
    @Mapper(标记 Mapper接口)、
    @TableName/@TableId(实体类 映射 数据库)。

  3. 核心类关系
    UserServiceImpl → 继承ServiceImpl<UserMapper, User> → 关联Mapper和实体类 → 实现UserService → 提供通用+自定义业务方法。



第1:创建数据库表(准备数据载体)

sql 复制代码
-- 创建user表
CREATE TABLE IF NOT EXISTS `user` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名',
  `password` VARCHAR(50) NOT NULL COMMENT '密码',
  `nickname` VARCHAR(50) COMMENT '昵称',
  `age` INT(3) COMMENT '年龄',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';


-- 插入测试数据
INSERT INTO `user` (`username`, `password`, `nickname`, `age`) VALUES
('zhangsan', '123456', '张三', 20),
('lisi', '654321', '李四', 22);

第2:编写实体类User(映射数据库表)

src/main/java/com/example/mpdemo下新建entity包,创建User.java

java 复制代码
package com.example.mpdemo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

" 用户实体类:和数据库user表一一映射 "

@Data
@TableName("user") // "指定映射的数据库表名(类名和表名一致时可省略)"
public class User {
    // 主键ID,设置为自增(和数据库表的AUTO_INCREMENT对应)
    @TableId(type = IdType.AUTO)
    private Long id;
    
    private String username; // 对应表的 username 字段
    private String password; // 对应表的 password 字段
    private String nickname; // 对应表的 nickname 字段
    private Integer age;     // 对应表的 age 字段
}

第3:编写Mapper接口UserMapper(数据访问层)

src/main/java/com/example/mpdemo下新建mapper包,创建UserMapper.java

java 复制代码
package com.example.mpdemo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mpdemo.entity.User;
import org.apache.ibatis.annotations.Mapper;

" Mapper接口:继承MyBatis-Plus的BaseMapper,获得通用CRUD方法 "
" @Mapper:告诉MyBatis这是Mapper接口,Spring会扫描并创建代理对象 "

@Mapper
public interface UserMapper extends BaseMapper<User> {
    "基础CRUD不用写,MyBatis-Plus已经封装好了"
    "如需自定义SQL,比如:"根据昵称查用户",可以在这里加方法,后续写XML 或 注解"
}

第4:编写Service接口UserService(业务层接口)

src/main/java/com/example/mpdemo下新建service包,创建UserService.java

java 复制代码
package com.example.mpdemo.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.mpdemo.entity.User;

" 业务层接口:继承MyBatis-Plus的IService,获得Service层的通用CRUD方法 "

public interface UserService extends IService<User> {
    " 这里可以加自定义业务方法(比如:"根据用户名查用户"),先空着,后续扩展 "
}

第5:编写Service实现类UserServiceImpl

service包下新建impl子包,创建UserServiceImpl.java

java 复制代码
package com.example.mpdemo.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.mapper.UserMapper;
import com.example.mpdemo.service.UserService;
import org.springframework.stereotype.Service;

/**
 * 业务层实现类:
 * 1. 继承ServiceImpl(MyBatis-Plus的IService实现类),指定Mapper和实体类
 * 2. 实现自定义的UserService接口
 * 3. @Service:让Spring管理这个Bean,后续可以注入使用
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    "基础CRUD方法不用写,ServiceImpl已经实现了"
}

第6:编写Controller(接口测试层)

src/main/java/com/example/mpdemo下新建controller包,创建UserController.java

java 复制代码
package com.example.mpdemo.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.mpdemo.entity.User;
import com.example.mpdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

" 控制层:提供HTTP接口,调用Service层方法实现CRUD "

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

    // 注入UserService(Spring会自动找UserServiceImpl实现类)
    @Autowired
    private UserService userService;
    

    // ========== 测试1:查询所有用户 ==========
    "调用IService的通用方法 list(),查询所有用户"
    @GetMapping("/list")
    public List<User> listAll() {
        return userService.list();
    }


    // ========== 测试2:根据ID查询单个用户 ==========
    "调用IService的通用方法 getById(),根据ID查询"
    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userService.getById(id);
    }
    

    // ========== 测试3:新增用户 ==========
    " 调用IService的通用方法 save(),新增用户 "
    @PostMapping("/save")
    public boolean saveUser(@RequestBody User user) {
        return userService.save(user);
    }
    

    // ========== 测试4:分页查询用户 ==========
    @GetMapping("/page")
    public IPage<User> pageUser(
            @RequestParam(defaultValue = "1") Integer pageNum, // 页码,默认第1页
            @RequestParam(defaultValue = "2") Integer pageSize // 每页条数,默认2条
    ) {
        // 创建分页对象
        Page<User> page = new Page<>(pageNum, pageSize);
        // 调用IService的通用方法page(),分页查询
        return userService.page(page);
    }
    

    // ========== 测试5:删除用户 ==========
    " 调用IService的通用方法 removeById(),根据ID删除 "
    @DeleteMapping("/{id}")
    public boolean deleteUser(@PathVariable Long id) {
        return userService.removeById(id);
    }
}

第7:启动项目并测试

7.1 启动项目

打开项目的启动类MpDemoApplication.java(默认在com.example.mpdemo下),直接运行main方法:

java 复制代码
package com.example.mpdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // 核心注解,开启Spring Boot自动配置
public class MpDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(MpDemoApplication.class, args);
    }
}

启动成功后,控制台会显示「Started MpDemoApplication in xxx seconds」。

9.2 接口测试(用Postman/浏览器/IDEA自带工具)

接口地址 请求方式 测试说明 示例结果(简要)
http://localhost:8080/user/list GET 查询所有用户 返回2条测试数据(张三、李四)
http://localhost:8080/user/1 GET 查询ID=1的用户 返回张三的信息
http://localhost:8080/user/save POST 新增用户(JSON参数) 传入{"username":"wangwu","password":"111111","nickname":"王五","age":25},返回true
http://localhost:8080/user/page?pageNum=1\&pageSize=2 GET 分页查询 返回第1页、每页2条的用户列表
http://localhost:8080/user/3 DELETE 删除ID=3的用户(新增的王五) 返回true




扩展:添加自定义业务方法(可选)

如果通用方法不够用,比如:要「根据用户名查询用户」,我们来扩展:

1. 在UserService接口中添加方法

java 复制代码
public interface UserService extends IService<User> {
    " 自定义方法:根据用户名查询用户 "
    User getByUsername(String username);
}

2. 在UserServiceImpl中实现方法

java 复制代码
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Override
    public User getByUsername(String username) {
        // 用QueryWrapper构造查询条件
        return this.getOne(new QueryWrapper<User>().eq("username", username));
    }
}

3. 在UserController中添加测试接口

java 复制代码
@GetMapping("/username/{username}")
public User getByUsername(@PathVariable String username) {
    return userService.getByUsername(username);
}

测试:访问http://localhost:8080/user/username/zhangsan,会返回张三的信息。


相关推荐
Java小卷2 小时前
KIE Drools 10.x 规则引擎快速入门
java·后端
fengsen52113142 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
竟未曾年少轻狂2 小时前
Spring Boot 项目集成 Redis
java·spring boot·redis·缓存·消息队列·wpf·redis集群
_codemonster2 小时前
java web修改了文件和新建了文件需要注意的问题
java·开发语言·前端
Java天梯之路2 小时前
Spring Boot 钩子全集实战(九):`@PostConstruct` 详解
java·spring boot·后端
松涛和鸣2 小时前
75、 IMX6ULL LM75温度传感器I2C驱动开发
java·linux·数据库·驱动开发·python
独自破碎E3 小时前
BISHI41 【模板】整除分块
java·开发语言
毕设源码-郭学长3 小时前
【开题答辩全过程】以 基于Springboot图书管理系统为例,包含答辩的问题和答案
java·spring boot·后端
鹅是开哥3 小时前
Spring AI Alibaba + DashScope 调用超时彻底解决(SocketTimeoutException / read timeout)
java·人工智能·spring