springboot-mybatisplus注解与配置类方法整合

本文介绍如何在SpringBoot项目中引入MyBatisPlus,包括依赖导入、配置文件设置、DAO层接口定义等内容,并详细讲解了CRUD操作、特殊查询及分页功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot-mybatisplus

1.导入mybatisplus依赖

<!--mybatisplus依赖-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>
<!--druid连接池依赖-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.11</version>
</dependency>

2.application.yml文件配置

#设置数据源
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/4031
    username: root
    password: 123456

#设置下划线命名改为小驼峰命名
mybatis:
  configuration:
    map-underscore-to-camel-case: true

#设置访问端口号
server:
  port: 80

3.设置dao层接口和代理对象

//该注解设置代理对象
@Mapper   //继承BaseMapper<泛型>抽象类
public interface UserDao extends BaseMapper<User> {
}

4.CRUD标准开发

4.1实体类

public class User {
    //对应数据库主键的属性必须名为id或者加上@TableId表示
    @TableId
    private Long userId;
    private String userName;
    private Double userBalance;
}

4.2业务层代码

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    @Override
    public Result queryUser() {
        //BaseMapper<泛型>抽象类自带的查询方法
        List<User> users = userDao.selectList(null);
        int code=users==null?Code.QUERY_ERR:Code.QUERY_OK;
        return new Result(code,null,users);
    }

    @Override
    public Result getUserById(Integer userId) {
        User user = userDao.selectById(userId);
        int code= user==null?Code.QUERY_ERR:Code.QUERY_OK;
        return new Result(code,null,user);
    }

    @Override
    public Result saveUser(User user) {
        //BaseMapper<泛型>抽象类自带的添加方法
        int insert = userDao.insert(user);
        int code= insert>0?Code.SAVE_OK:Code.SAVE_ERR;
        return new Result(code,null,insert);
    }

    @Override
    public Result updateUser(User user) {
        //BaseMapper<泛型>抽象类自带的修改方法
        int update = userDao.updateById(user);
        int code= update>0?Code.UPDATE_OK:Code.UPDATE_ERR;
        return new Result(code,null,update);
    }

    @Override
    public Result deleteUser(Integer userId) {
        //BaseMapper<泛型>抽象类自带的删除方法
        int i = userDao.deleteById(userId);
        int code= i>0?Code.DELETE_OK:Code.DELETE_ERR;
        return new Result(code,null,i);
    }

}

4.3控制层代码

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

    @GetMapping
    public Result queryUser() {
        return userService.queryUser();
    }

    @GetMapping("/{id}")
    public Result getUserById(@PathVariable Integer id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public Result saveUser(@RequestBody User user) {
        return userService.saveUser(user);
    }

    @PutMapping
    public Result updateUser(@RequestBody User user){
        return userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public Result deleteUser(@PathVariable Integer id){
        return userService.deleteUser(id);
    }
}

5.特殊查询

5.1分页查询

5.1.1业务层代码
public Result pageSelect(Integer current,Integer size) {
    IPage page=new Page<>(current,size);
    IPage<User> page1 = userDao.selectPage(page,null);
    int code=page1.getRecords()==null?Code.QUERY_ERR:Code.QUERY_OK;
    return new Result(code,null,page1);
}
5.1.2配置分页拦截器
@Configuration
public class MpConfig {
    @Bean
    public MybatisPlusInterceptor mpInterceptor(){
        MybatisPlusInterceptor interceptor=new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

自带分页查询的原理是在基本查询时进行拦截并进行切面编程加入limit语句实现分页

5.1.3控制层代码
@GetMapping("/{current}/{size}")
public Result pageUser(@PathVariable("current") Integer current,
                       @PathVariable("size") Integer size){
    return userService.pageSelect(current,size);
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HYMfI7h7-1663767549762)(C:\Users\冯瑞涛\AppData\Roaming\Typora\typora-user-images\1663205836197.png)]

​ 访问和返回方法

关闭多余日志在 application.yml文件中写入

spring:
  main:  #关闭spring日志
    banner-mode: off
    
mybatis-plus:
  global-config:   #关闭mybatis-plus日志
    banner: false

5.2条件查询

创建Wrapper接口的实现类对象来给查询加条件(以下代码为业务层代码)

第一个实现类(QueryWrapper)写法⬇

@Override
public Result conditionSelect(User user) {
     //QueryWrapper对象常规用法
    QueryWrapper<User> wrapper =new QueryWrapper<>();
    wrapper.lt("userBalance",50);
    wrapper.gt("userBalance",100);
    
    List<User> users = userDao.selectList(wrapper);
    int code=users==null?Code.QUERY_ERR:Code.QUERY_OK;
    return new Result(code,null,users);
}

第二种写法(lambda写法)⬇

public Result conditionSelect(User user) {
    // QueryWrapper lambda用法
    QueryWrapper<User> wrapper =new QueryWrapper<>();
    wrapper.lambda().lt(User::getUserBalance,50);
    wrapper.lambda().gt(User::getUserBalance,100);
    
    List<User> users = userDao.selectList(wrapper);
    int code=users==null?Code.QUERY_ERR:Code.QUERY_OK;
    return new Result(code,null,users);
}

第二个实现类(LambdaQueryWrapper)写法⬇

 public Result conditionSelect(User user) {
     //可替代上方lambda写法
        LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper();
        wrapper.lt(User::getUserBalance,100);
        wrapper.gt(User::getUserBalance,100);
     
        List<User> users = userDao.selectList(wrapper);
        int code=users==null?Code.QUERY_ERR:Code.QUERY_OK;
        return new Result(code,null,users);
    }

and条件

//直接写入两相反条件即可
wrapper.lt(User::getUserBalance,100);
wrapper.gt(User::getUserBalance,100);
//连接写法
wrapper.lt(User::getUserBalance,100).gt(User::getUserBalance,100);

or条件

wrapper.lt(User::getUserBalance,100).or();//在第一个条件后加.or()即可
wrapper.gt(User::getUserBalance,100);

条件个数不定查询

//Wrapper接口下的所有方法均由一个boolean类型的参数可限定条件是否加入查询
//常规写法
if(user.balance!=null){
   wrapper.lt(User::getUserBalance,100);
   wrapper.gt(User::getUserBalance,100);   
}
//wrapper写法(直接在条件加入语句中第一个参数位置写入条件)
wrapper.lt(user.balance!=null,User::getUserBalance,100);
wrapper.gt(user.balance!=null,User::getUserBalance,100);

模糊查询语句

wrapper.like(User::getUserName,"张");//用like方法进行模糊查询

查询投影

//通过select方法来实现查询投影(需要查询哪些字段写哪些字段)
wrapper.select(User::getUserId,User::getUserName);

特殊查询投影

//仅有QueryWrapper实现类可实现该种查询
QueryWrapper<User> wrapper =new QueryWrapper<>();
//查询统计数
wrapper.select("count(*) as count");
//使用selectMaps方法结果会成为map集合返回
List<Map<String, Object>> users = userDao.selectMaps(wrapper);

分组统计查询

QueryWrapper<User> wrapper =new QueryWrapper<>();
wrapper.select("count(*) as count");
wrapper.groupBy("roleId");//使用groupby方法分组
List<Map<String, Object>> users = userDao.selectMaps(wrapper);

查询条件统计(lambda实现类对象条件下)

1.等匹配

wrapper.eq(User::getUserName,"张三")

2.范围查询

//between语句
wrapper.between语句(User::getUserBalance,50,100)

6.常用注解

//实体类名与表名不同时使用
@TableName(value = "db_user")
//实体类属性名与表属性名不同时使用
@TableField(value = "pwd")
//指定实体类中某个字段为主键时使用
@TableId
//实体类该字段不参与查询时使用
@TableField(select = false)

7.配置id生产策略和配置表名实体类名映射

7.1id生成策略

注解方式

@TableId(type = IdType.NONE)
/*type的值有:
IdType.AUTO:按数据库指定策略生产id
IdType.NONE:无生成策略
IdType.ASSIGN_ID:mybatisplus生成策略为(时间戳+服务器mac码+12位序列号)
IdType.ASSIGN_UUID:自己手写一个UUID类型的id生成策略
IdType.INPUT:自己输入一个id*/

application.yml文件配置

mybatis-plus:
  global-config:
    db-config:
      id-type: none
#可能的值同注解一样

7.2表名实体类名映射

注解方式

//在实体类中的主键属性上方写
@TableName(value = "表名")

application.yml文件配置通用

mybatis-plus:
  global-config:
    db-config:
      table-prefix: 表前缀名

7.3逻辑删除

先在实体类与数据库表中添加状态字段:

注解方式

public class User {
    private Long userId;
    private String userName;
    private Double userBalance;
    //逻辑删除专用注解value(未删除值)delval(已删除值) 
    @TableLogic(value = "0",delval = "1")
    private Integer state;
    //状态字段,字段名随意,需要与数据库中字段名相同
}

application.yml文件配置通用

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: state #指定逻辑删除状态字段
      logic-not-delete-value: 0 #未删除的值
      logic-delete-value: 1 #已删除的状态值

mybatisplus批量删除

public Result sumDelete(){
    List<Integer> list=new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    //mybatisplus自带的批量删除方法(需要一个存有需删除数据id的集合作为参数)
    int i = userDao.deleteBatchIds(list);
    int code = i > 0 ? Code.DELETE_OK : Code.DELETE_ERR;
    return new Result(code,null,i);
}

字段
logic-not-delete-value: 0 #未删除的值
logic-delete-value: 1 #已删除的状态值


mybatisplus批量删除

```java
public Result sumDelete(){
    List<Integer> list=new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    //mybatisplus自带的批量删除方法(需要一个存有需删除数据id的集合作为参数)
    int i = userDao.deleteBatchIds(list);
    int code = i > 0 ? Code.DELETE_OK : Code.DELETE_ERR;
    return new Result(code,null,i);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值