写点什么

Springboot+MybatisPlus 高效实现增删改查,mysql 使用教程图解目录

用户头像
极客good
关注
发布于: 刚刚

server:


port: 8092


spring:


datasource:


driver-class-name: com.mysql.cj.jdbc.Driver


url: jdbc:mysql://192.168.67.129:3306/mybatis_plus?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8&nullCatalogMeansCurrent=true


username: root


password: root


mybatis-plus:


mapper-locations: classpath*:mapper/**/*.xml


#实体扫描,多个 package 用逗号或者分号分隔


type-aliases-package: com.huangtl.user.entity


configuration:


log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


主要配置了数据库连接和 mybatis-plus 的扫描,dao 层的 Mapper 扫描还需要一个配置类。


3.MybatisPlusConfig 类:


package com.huangtl.user.config;


import org.mybatis.spring.annotation.MapperScan;


import org.springframework.context.annotation.Configuration;


@Configuration


@MapperScan({"com.huangtl.user.mapper*"})


public class MybatisPlusConfig {


}


@Configuration 说明是 springboot 的配置类。


@MapperScan 指定扫描指定位置的 Mapper 接口。


好了,这样你就可以使用顺利使用 Mybatis-Plus 的代码操作数据库了,接下去看下 Mybatis-Plus 的使用示例。


[](


)四、CURD 示例




生成的代码结构上面已经解释了,我们这里主要看下 service 层的类,这里包含了几乎所有的新增改查方法。


先看下 service 实现类。



这里主要是继承了 Mybatis-Plus 的一个 service 实现类,通过泛型的方式将 Dao 层 Mapper 类和实体类引入。增删改查方法都在该类。我们可以直接调用该父类方法操作数据库,比如根据 id 获取一个用户信息方法:


User byId = this.getById(1);


后面的的例子中都在 UserServiceImpl 中,所以都使用 this 关键字调用,如果需要其他类调用只需要注入该类即可。


1.新增


public void testInsert(){


User user = new User();


user.setNickName("程序员柳大侠");


user.setAge(90);


this.save(user);


}


效果:



2.修改


public User testUpdate(int id){


User user = new User();


user.setId(id);


user.setNickName("柳大侠");


user.setAge(20);


this.updateById(user);


return user;


}


效果:



其他修改方式:


//1.新增或修改


this.saveOrUpdate(user);


//2.lambda 表达式修改


this.update(Wrappers.lambdaUpdate(User.class).set(User::getNickName,"柳大侠").eq(User::getId,id));


//3.数据库原字段修改


this.update(n


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


ew UpdateWrapper<User>().set("nick_name","柳大侠").eq("id",id));


//4.批量修改


List<User> list = new ArrayList<>();


list.add(user);


this.updateBatchById(list);


3.删除


  • 物理删除


默认都是物理删除,会删除数据库中的该条记录。


public void remove(int id){


this.removeById(id);


}


其他方式:


//lambda 表达式方式


this.remove(Wrappers.lambdaQuery(User.class).eq(User::getId,id));


//数据库原字段方式


this.remove(new QueryWrapper<User>().eq("id",id));


//批量删除


this.removeByIds(ids);


  • 逻辑删除


逻辑删除不会删除数据库中的记录,只会修改删除标志字段。


使用方式,在字段上加上 @TableLogic 注解。


@TableLogic


private Integer deleted;


默认 1 为已删除,0 为未删除。


当你调用删除方法比如 removeById 时不会删除记录,只会把 deleted 字段改为 1;


你也可以配置已删除/未删除的标志值。


mybatis-plus:


global-config:


db-config:


logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置注解 @TableLogic)


logic-delete-value: 1 # 逻辑已删除值(默认为 1)


logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)


4.查询


查询方式可以查询单条记录信息和多条信息,示例如下:


//单个查询


User user = this.getById(id);


//lambda 表达式


User user = this.getOne(Wrappers.lambdaQuery(User.class)


.eq(User::getId,id));


//数据库原字段


User user = this.getOne(new QueryWrapper<User>()


.eq("id",id));


//查询多条记录


List ids = new ArrayList();


ids.add(1);


ids.add(2);


List<User> users = this.listByIds(ids);


//查询 20 岁到 30 岁之间的用户


List<User> users = this.list(Wrappers.lambdaQuery(User.class)


.ge(User::getAge,20)


.le(User::getAge,30));


//查询 20 岁或者 30 岁之间的用户


List<User> users = this.list(Wrappers.lambdaQuery(User.class)


.eq(User::getAge,20)


.or().eq(User::getAge,30));


//查询年龄最小的 10 条记录


List<User> users = this.list(Wrappers.lambdaQuery(User.class)


.orderByAsc(User::getAge)


.last("limit 10"));


可以使用 func 方法根据参数指定对应的 sql 语句:


String orderColumn = "age";


List<User> users = this.list(Wrappers.lambdaQuery(User.class)


.func(w->{


//如果排序列是年龄则根据年龄排序


if("age".equals(orderColumn)){


w.orderByAsc(User::getAge);


}else if("nickName".equals(orderColumn)){


//如果排序列是昵称则根据昵称排序


w.orderByAsc(User::getNickName);


}


}));


[](


)五、分页




在 3.4.0 版本以前使用的是 PaginationInterceptor,只需要在配置类中定义:


@Bean


public PaginationInterceptor paginationInterceptor() {


PaginationInterceptor paginationInterceptor = new PaginationInterceptor();


return paginationInterceptor;


}


3.4.0 以后使用的是 MybatisPlusInterceptor:


@Bean


public MybatisPlusInterceptor mybatisPlusInterceptor() {


MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();


interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));


return interceptor;


}


接口写法:


@GetMapping()


public Page queryPage(@RequestBody Page page){


page = userService.page(page, Wrappers.lambdaQuery(User.class).orderByAsc(User::getAge));


return page;


}


这里主要使用到了 userService 的 page 方法,也是 Mybatis-Plus 提供的,返回的也是一个 Page 对象。


Page 类对应的是


com.baomidou.mybatisplus.extension.plugins.pagination.Page;


主要属性如下:


**records:返回记录


total:总页数


size:每页显示条数


current:当前页


pages:总页数**


前端请求体如下:


{


"size":10,


"current":1


}


一般前端只需要传 size 和 current 即可。


返回内容体如下:


{


"records": [


{


"id": 2,


"nickName": "程序员柳大侠",


"age": 90


}


],


"total": 1,


"size": 10,


"current": 1,


"orders": [],


"optimizeCountSql": true,


"hitCount": false,


"countId": null,


"maxLimit": null,


"searchCount": true,


"pages": 1


}


扩展分页参数


一般来讲我们需要前端传一些自定义参数,而不仅是 page 中的参数,那么可以这样子写。


比如我们需要多传一个 maxAge 最大年龄查询参数。


定义一个请求参数体继承 Page 类。


public class pageDto extends Page {


private int maxAge;


public int getMaxAge() {


return maxAge;


}


public void setMaxAge(int maxAge) {


this.maxAge = maxAge;


}


}


定义接口使用自定义的请求体


@GetMapping("/page")


public Page queryPage(@RequestBody pageDto page){


page = userService.page(page, Wrappers.lambdaQuery(User.class)


.le(User::getAge,page.getMaxAge())


.orderByAsc(User::getAge));


return page;


}


前端请求参数


{


"size":10,


"current":1,


"maxAge":100


}


如果不想使用上面的写法,Page 也提供了许多构造函数,当前页和显示条数你可以自己定义参数,然后通过 Page 的构造函数 new Page(…)出来,最后再调用 userService.page(E page, Wrapper queryWrapper)即可。


new Page(long current, long size);


new Page(long current, long size, long total);


newPage(long current, long size, boolean isSearchCount);


......


[](


)六、扩展功能




这里讲两个常用的扩展功能,分别是自动填充属性和枚举属性。


1.自动填充属性


有时候我们需要在新增或更新数据库时自动给一些字段赋值,比如新增时自动赋值创建时间,更新时自动赋值更新时间。


先写各配置类。


package com.huangtl.user.config;


import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;


import org.apache.ibatis.reflection.MetaObject;


import org.springframework.context.annotation.Configuration;


import org.springframework.stereotype.Component;


import java.time.LocalDateTime;


/**


  • @Description 参数填充

  • @Author 程序员柳大侠


**/


@Configuration


@Component


public class MybatisMetaObjectHandler implements MetaObjectHandler {


@Override


public void insertFill(MetaObject metaObject) {


this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)


this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)


}


@Override


public void updateFill(MetaObject metaObject) {


this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)


}


}


定义了新增和更新填充方法,光这样还不行,你需要在实体类的字段上添加 @TableField 注解并指定 fill 属性,如下:


@TableField(value = "create_time",fill = FieldFill.INSERT)


private LocalDateTime createTime;


FieldFill.INSERT 代表新增时会赋值。如果希望新增时也赋值更新时间字段,可以使用 fill = FieldFill.INSERT_UPDATE 。


@TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)


private LocalDateTime updateTime;


我们来试试,给 user 表增加 create_time 和 update_time 字段。



执行新增方法


User user = new User();


user.setNickName("程序员柳大侠");


user.setAge(90);


this.save(user);


可以看到已经自动填充了创建时间和更新时间



我们再来执行下更新方法。


User user = new User();


user.setId(id);


user.setNickName("柳大侠");


user.setAge(20);


this.updateById(user);


需要注意的是,有部分更新方法无法自动填充, 可以使用 updateById 方法。



2.枚举属性


有时候我们有一些字段只会出现固定的值,我们可以用枚举属性来表示,比如性别只有男女,数据库我们可能用 0 和 1 表示。


首先需要修改下配置文件,增加一个


mybatis-plus.typeEnumsPackage 参数,扫描你的枚举所在的包位置


mybatis-plus:


mapper-locations: classpath*:mapper/**/*.xml


#实体扫描,多个 package 用逗号或者分号分隔


type-aliases-package: com.huangtl.user.entity


typeEnumsPackage: com.huangtl.user.enums


configuration:


log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


我们以性别属性为例,我们新增一个 sex 字段和枚举类。示例如下:


package com.huangtl.user.enums;


import com.baomidou.mybatisplus.annotation.EnumValue;


import com.fasterxml.jackson.annotation.JsonValue;


import java.util.HashMap;


import java.util.Map;


public enum SexEnum {


MAN(0,"男"),


WOMAN(1,"女"),


;


SexEnum(int code, String desc) {


this.code = code;


this.desc = desc;


}


@EnumValue


private final int code;


private final String desc;


@JsonValue


public Map result() {


Map map = new HashMap();


map.put("code",code);


map.put("desc",desc);


return map;


}


}


@EnumValue 注解说明我们再数据库中保存的是该值。


@JsonValue 注解代表我们查询返回给前端的属性对象。


在实体类中定义 sex 属性(get/set 方法别漏了)。


@TableField("sex")


private SexEnum sex;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Springboot+MybatisPlus高效实现增删改查,mysql使用教程图解目录