我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MyBatis-Plus(实用篇)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MyBatis-Plus(实用篇)

一、基础组件(接口和实现类)

简介

  • MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具
  • 在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生

1、BaseMapper

  • BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型
  • Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
  • BaseMapper接口,增删改返回影响数据条数的Integer

在这里插入图片描述

BaseMapper中提供的CRUD方法

  • 增加:insert

在这里插入图片描述

  • 删除:delete

在这里插入图片描述

  • 修改:update
  • update方法:entity实体对象某属性为null,则不会修改此属性

在这里插入图片描述

  • 查询:select

在这里插入图片描述

  • selectObjs方法:只返回第一个字段的值
  • selectPage方法:分页需要添加MybatisPlusInterceptor插件,否则不生效

在这里插入图片描述

MybatisPlusInterceptor分页插件

@Configurationpublic class MybatisPlusConfig {    @Bean    public MybatisPlusInterceptor mybatisPlusInterceptor() {        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();        //注意使用哪种数据库        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));        return interceptor;    }}

2、IService

  • 封装IService接口,进一步封装CRUD采用get查询单行、remove删除、list查询集合、page分页前缀命名方式
  • IService接口,增删改返回是否操作成功的boolean
  • 泛型 T 为任意实体对象

在这里插入图片描述

IService中提供的CRUD方法

  • 增加:save

在这里插入图片描述

  • 删除:remove

在这里插入图片描述

  • 修改:update

在这里插入图片描述

  • 新增或修改:主键存在则根据主键修改,主键不存在则新增

在这里插入图片描述

  • 查询:单个get,集合list
  • getOne方法,多个抛出异常,boolean throwEx = false 则获取第一条数据

在这里插入图片描述
在这里插入图片描述

  • 查询记录数:count

在这里插入图片描述

  • 分页查询:page

在这里插入图片描述
在这里插入图片描述

  • 集合查询:list
  • listObjs方法,可以将查询结果T类型转换成V类型返回List

在这里插入图片描述

3、链式查询与修改

IService接口中提供

  • 链式查询:可以串着写多个条件
    • .one()结尾:查询单条数据
    • .list()结尾:查询多条数据
    • .count()结尾:查询记录数

在这里插入图片描述

 @Test public void test1(){  // 单个查询,多个报错     User user = userService.lambdaQuery().eq(User::getName, "Tom").one(); // 集合查询     List userList = userService.lambdaQuery().like(User::getName, "J").eq(User::getAge,20).list();     // 记录数查询     Integer count = userService.lambdaQuery().like(User::getAge, 20).select(User::getName, User::getAge).count();  }
  • 链式修改:可以串着写多个条件
    • .update()结尾:修改set的字段
    • .update(entity)结尾:修改entity数据的字段
    • .remove()结尾:删除数据

在这里插入图片描述

  @Test  public void test2() {  // set修改某些属性      userService.lambdaUpdate().eq(User::getName, "Tom").set(User::getId, 110).set(User::getAge, 15).update();      // 修改整个对象      User user = new User();      user.setId(110L);      user.setAge(15);      userService.lambdaUpdate().eq(User::getName, "Tom").update(user);      // 根据名称删除      userService.lambdaUpdate().eq(User::getName, "Jack").remove();   }

4、调用Service层操作数据

  • 创建UserService并继承IService
public interface UserService extends IService {}
  • 创建UserService的实现类并继承ServiceImpl
@Servicepublic class UserServiceImpl extends ServiceImpl implements UserService{}

二、常用注解

1、@TableName

  • 在实体类类型上添加@TableName(“t_user”),标识实体类对应的表
  • 不加注解,默认驼峰转下划线则是表明,如实体OrderInfo,则默认对应表名order_info
@Data@TableName("t_user")public class User {    private Long id;    private String name;    private Integer age;    private String email;}
  • 为实体类所对应的表名设置默认的前缀,那么就不需要在每个实体类上通过@TableName标识实体类对应的表
mybatis-plus:  global-config:    db-config:      # 设置实体类所对应的表的统一前缀      table-prefix: t_

2、@TableId

  • MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认基于雪花算法的策略生成id

@TableId的value属性

  • 不加注解,默认情况Long id就是主键
  • 如果想其他字段作为主键,则添加@TableId
  • 如果想其他字段作为主键,且实体与数据库字段不一致,则添加@TableId(value = “tid”)
@Datapublic class User {    @TableId(value = "tid")    private Long uid;    private String name;    private Integer age;    private String email;}

@TableId的type属性

常用主键策略:

描述
IdType.ASSIGN_ID(默认)基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO使用数据库的自增策略,注意,该类型请确保数据库设置了id自增
@Datapublic class User {    @TableId(type = IdType.AUTO)    private Long uid;    private String name;    private Integer age;    private String email;}

3、@TbaleField

  • 实体字段不满足数据库下划线转驼峰的解决方法(实体-name,数据库-username)
public class User {    private Long id;    @TableField("username")    private String name;    private Integer age;    private String email;}

4、@TableLogic

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录

实现逻辑删除

  • 数据库中创建逻辑删除状态列,设置默认值为0

在这里插入图片描述

  • 实体类中添加逻辑删除属性

在这里插入图片描述

  • 测试删除功能,真正执行的是修改
public void testDeleteById(){    int result = userMapper.deleteById(1527472864163348482L);    System.out.println(result > 0 ? "删除成功!" : "删除失败!");    System.out.println("受影响的行数为:" + result);}

在这里插入图片描述

  • 此时执行查询方法,查询的结果为自动添加条件is_deleted=0
public void testSelectList(){    List users = userMapper.selectList(null);}

在这里插入图片描述

三、条件构造器

1、wapper介绍

在这里插入图片描述

  • Wrapper:条件构造抽象类,最顶端父类
    • AbstractWrapper:用于查询条件封装,生成sql的where条件
      • QueryWrapper:查询条件封装
      • UpdateWrapper:update条件封装
      • AbstractLambdaWrapper:使用Lambda语法
        • LambdaQueryWrapper:用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper:用于Lambda语法更新封装Wrapper

2、构造器常用方法

函数名说明说明/例子
eq等于=例:eq(“name”,“zhangsan”) —> name = ‘zhangsan’
ne不等于<>例:ne(“name”,“zhangsan”) —> name <> ‘zhangsan’
gt大于>例:gt(“age”,18) —> age > 18
ge大于等于>=例:ge(“age”,18) —> age >= 18
lt小于<例:lt(“age”,18) —> age < 18
le小于等于<=例:le(“age”,18) —> age <= 18
betweenbetween 值1 and 值2例:between(“age”,10,20) —> age between 10 and 20
notBetweennot between 值1 and 值2例:notBetween(“age”,10,20) —> age not between 10 and 20
likelike ‘%值%’例:like(“name”,“强”) —> name like ‘%强%’
notLikenot like ‘%值%’例:notLike(“name”,“强”) —> name not like ‘%强%’
likeLeftlike ‘%值’例:like(“name”,“飞”) —> name like ‘%强’
likeRightlike ‘值%’例:like(“name”,“王”) —> name like ‘王%’
isNull字段 is null例:isNull(“emal”) —> email is null
isNotNull字段 is not null例:isNotNull(“emal”) —> email is not null
in字段 in (值1,值2…)例:in(“age”,{10,18,30}) —> age in (10,18,30)
notIn字段 not in (值1,值2…)例:notIn(“age”,{10,18,30}) —> age not in (10,18,30)
inSql字段 in ( sql语句 )inSql(“id”, “select id from table where name like ‘%J%’”)
—> id in (select id from table where name like ‘%J%’)
notInSql字段 not in ( sql语句 )notInSql(“id”, “select id from table where name like ‘%J%’”)
—> id not in (select id from table where name like ‘%J%’)
groupBy分组 group by 字段,…例:groupBy(“id”,“name”) —> group by id,name
orderBy排序 ordery by 字段,…例:orderBy(true,true,“id”,“name”) —> order by id asc,name asc
orderByAsc升排序 order by 字段,… asc例:orderByAsc(“id”,“name”) —> order by id,name
orderByDesc降排序 order by 字段,… desc例:orderByDesc(“id”,“name”) —> order by id desc,name desc
havinghaving (sql语句)having(“sum(age) > {0}”,18) —> having sum(age) > 18
or拼接or例:eq(“id”,1).or().eq(“name”,“老王”) —> id =1 or name = ‘老王’
andand 嵌套例:and(i -> i.eq(“name”,“李白”).ne(“status”,“活着”))
—> and (name = ’李白‘ and status <> ‘活着’)
apply拼接sql例:apply(“date_format(date_time,‘%Y-%m-%d’) = {0}”,“2002-08-08”)
—> date_fromat(date_time,‘%Y-%m-%d’) = ‘2008-08-08’
注意事项:动态入参对应{index}部分,直接写sql语句,有sql注入风险
last拼接到sql的最后例:last(“limit 5”)
注意事项:只能调用一次,多次调用以最后一次为准,有sql注入风险
exists拼接exists (sql语句)例:exists(“select id from table where age = 1”)
not exists拼接not exists (sql语句)例:not exists(“select id from table where age = 1”)
nested正常嵌套 不带and和or例:nested(i-> i.eq(“name”,“李华”).gt(“age”,20))
—> (name = “李华” and age > 20)

3、组装条件示例

条件的优先级

sql语句规则:and和or一起用,and优先级高

 @Testpublic void test01() {        QueryWrapper queryWrapper = new QueryWrapper<>();    queryWrapper.gt("age", 20)            .like("user_name", "a")            .or()            .isNotNull("email");    User user = new User();    user.setName("小明");    user.setEmail("test@atguigu.com");    int result = userMapper.update(user, queryWrapper);    System.out.println("result = " + result);}@Testpublic void test02() {    // lambda中条件优先级        QueryWrapper queryWrapper = new QueryWrapper<>();    queryWrapper.like("user_name", "a")            .and(i -> i.gt("age", 20).or().isNull("email"));    User user = new User();    user.setName("小红");    user.setEmail("test@atguigu.com");    int result = userMapper.update(user, queryWrapper);    System.out.println("result = " + result);}

Lambda表达式

@Testpublic void test3() {        String username = "a";    Integer ageBegin = null;    Integer ageEnd = 30;    //组装set子句    LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();    //避免使用字符串表示字段,防止运行时错误    queryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)            .gt(ageBegin != null, User::getAge, ageBegin)            .le(ageEnd != null, User::getAge, ageEnd);    List list = userMapper.selectList(queryWrapper);    list.forEach(System.out::println);}@Testpublic void test4() {        LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();    updateWrapper.like(User::getName, "a")            //lambda表达式内的逻辑优先运算            .and(i -> i.gt(User::getAge, 20).or().isNull(User::getEmail));     updateWrapper.set(User::getName, "小黑").set(User::getEmail, "abc@atguigu.com");    int result = userMapper.update(null, updateWrapper);    System.out.println("result = " + result);}

4、自定义分页

UserMapper中定义接口方法

  • page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位
Page selectPageVo(@Param("page") Page page,@Param("age") Integer age);

UserMapper.xml中编写SQL

测试方法

  • xml中没有分页语句,mybatisplus自动分页
@Testpublic void testSelectPageVo(){ //设置分页参数    Page page = new Page<>(1, 5);     userMapper.selectPageVo(page, 20);    //获取分页数据    List list = page.getRecords();     list.forEach(System.out::println);     System.out.println("当前页:"+page.getCurrent());     System.out.println("每页显示的条数:"+page.getSize());     System.out.println("总记录数:"+page.getTotal());     System.out.println("总页数:"+page.getPages());     System.out.println("是否有上一页:"+page.hasPrevious());     System.out.println("是否有下一页:"+page.hasNext());}

5、IPage的泛型转换(entity转换为vo)

// 分页查询Page userPage = super.lambdaQuery().page(new Page<>(request.getCurrent(), request.getSize()));// entity转换为voIPage infoResPage = userPage.convert(item -> Convert.convert(UserVO.class, item));

四、MyBatisX插件

1、生成逆向工程

  • 找到我们需要生成的表点击右键

在这里插入图片描述

  • 填写完信息以后下一步

在这里插入图片描述

  • 继续填写信息

在这里插入图片描述

  • 结果展示

在这里插入图片描述

2、快速生成CRUD

MyBaitsX可以根据我们在Mapper接口中输入的方法名快速帮我们生成对应的sql语句

在这里插入图片描述

在这里插入图片描述

来源地址:https://blog.csdn.net/qq_35512802/article/details/128279171

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MyBatis-Plus(实用篇)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MyBatis-Plus(实用篇)

文章目录 一、基础组件(接口和实现类)1、BaseMapper\2、IService\3、链式查询与修改4、调用Service层操作数据 二、常用注解1、@TableName2、@TableId3、@TbaleField4、@T
2023-08-17

mybatis-plus中的Enum用法实例

本文主要介绍了mybatis-plus中的Enum用法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-11

模仿mybatis-plus实现rpc调用

这篇文章主要为大家介绍了模仿mybatis-plus实现rpc调用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-02-14

MyBatis Plus有什么用

小编给大家分享一下MyBatis Plus有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!MyBatis Plus 是国内人员开发的 MyBatis 增强工
2023-06-02

Mybatis-Plus实现分页查询

Mybatis-Plus实现分页查询 文章目录 Mybatis-Plus实现分页查询1.1技术概述1.2技术详述1.2.1配置分页插件1.2.2自定义分页1、如果你的mapper没有继承BaseMapper2、如果你的mapper继
2023-08-17

MyBatis-Plus中SimpleQuery查询实现

本文主要介绍了MyBatis-Plus中SimpleQuery查询实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2022-11-13

mybatis-plus中resultMap怎么用

小编给大家分享一下mybatis-plus中resultMap怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!不一致,那么用来接收查询出来的result对应的
2023-06-25

Mybatis Plus中@TableField怎么用

这篇文章给大家分享的是有关Mybatis Plus中@TableField怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。@TableField的使用1 研究背景和过程妹纸开发突然发现@TableField失
2023-06-26

编程热搜

目录