MyBatis-Plus(实用篇)

news2025/4/8 14:03:18

文章目录

  • 一、基础组件(接口和实现类)
    • 1、BaseMapper\<T>
    • 2、IService\<T>
    • 3、链式查询与修改
    • 4、调用Service层操作数据
  • 二、常用注解
    • 1、@TableName
    • 2、@TableId
    • 3、@TbaleField
    • 4、@TableLogic
  • 三、条件构造器
    • 1、wapper介绍
    • 2、构造器常用方法
    • 3、组装条件示例
    • 4、自定义分页
  • 四、MyBatisX插件
    • 1、生成逆向工程
    • 2、快速生成CRUD

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

简介

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

1、BaseMapper<T>

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

在这里插入图片描述

BaseMapper中提供的CRUD方法

  • 增加:insert

在这里插入图片描述

  • 删除:delete

在这里插入图片描述

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

在这里插入图片描述

  • 查询:select

在这里插入图片描述

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

在这里插入图片描述

MybatisPlusInterceptor分页插件

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

2、IService<T>

  • 封装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<V>

在这里插入图片描述

3、链式查询与修改

IService接口中提供

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

在这里插入图片描述

 @Test
 public void test1(){
 	 // 单个查询,多个报错
     User user = userService.lambdaQuery().eq(User::getName, "Tom").one();
	 // 集合查询
     List<User> 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
/**
  * UserService继承IService模板提供的基础功能 
  */
public interface UserService extends IService<User> {}
  • 创建UserService的实现类并继承ServiceImpl
/**
  * ServiceImpl实现了IService,提供了IService中基础功能的实现 
  * 若ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
  */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> 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”)
@Data
public 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自增
@Data
public 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<User> 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优先级高

 /** 组装修改条件  将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改 **/
@Test
public void test01() {
    /*
        UPDATE t_user SET user_name=?, email=?
        age > ? AND user_name LIKE ? OR email IS NOT NULL
     */
    QueryWrapper<User> 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);
}

/** 条件优先级  将用户名中包含a并且(年龄大于20或邮箱为null)的用户信息修改 **/
@Test
public void test02() {
    // lambda中条件优先级
    /*
        UPDATE t_user SET user_name=?, email=?
        WHERE user_name LIKE ? AND (age > ? OR email IS NULL)
     */
    QueryWrapper<User> 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表达式

@Test
public void test3() {
    /*
        SELECT uid AS id,user_name AS name,age,email,is_deleted FROM t_user
        WHERE user_name LIKE ? AND age <= ?
     */
    String username = "a";
    Integer ageBegin = null;
    Integer ageEnd = 30;
    //组装set子句
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    //避免使用字符串表示字段,防止运行时错误
    queryWrapper.like(StringUtils.isNotBlank(username), User::getName, username)
            .gt(ageBegin != null, User::getAge, ageBegin)
            .le(ageEnd != null, User::getAge, ageEnd);
    List<User> list = userMapper.selectList(queryWrapper);
    list.forEach(System.out::println);
}

@Test
public void test4() {
    /*
        UPDATE t_user SET user_name=?,email=?
        WHERE user_name LIKE ? AND (age > ? OR email IS NULL)
     */
    LambdaUpdateWrapper<User> 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<User> selectPageVo(@Param("page") Page<User> page,@Param("age") Integer age);

UserMapper.xml中编写SQL

<select id="selectPageVo" resultType="User">
    select id,username as name,age,email from t_user where age > #{age}
</select>

测试方法

  • xml中没有分页语句,mybatisplus自动分页
@Test
public void testSelectPageVo(){ //设置分页参数
    Page<User> page = new Page<>(1, 5); 
    userMapper.selectPageVo(page, 20);
    //获取分页数据
    List<User> 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());
}

四、MyBatisX插件

1、生成逆向工程

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

在这里插入图片描述

  • 填写完信息以后下一步

在这里插入图片描述

  • 继续填写信息

在这里插入图片描述

  • 结果展示

在这里插入图片描述

2、快速生成CRUD

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

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/109662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程艺术之变成原则

编程有一个原则&#xff0c;就是尽可能去避免重复的代码。 类的开闭原则&#xff0c;类做好后&#xff0c;就尽量不要再在类上面在修改代码&#xff0c; 耦合度&#xff1a;简单的一个例子&#xff0c;活字印刷术在之前是整版印刷&#xff0c;导致&#xff0c;如果有一个字要…

作一回白嫖怪:写一个脚本自动获取ST官网积分,用积分领取奖品

环境&#xff1a;Python、selenium、ubuntu22.04 网址&#xff1a;STMCU中文官网 chrome: 版本 108.0.5359.124&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; chromeDriver: CNPM Binaries Mirror 这两个文件我打包起来了&#xff0c;0积分方便大家…

【表格合并与底纹】vue-elementul表格简单实现合并单元格,与列和行给底纹颜色

前言 这是一个很常见的需求啊&#xff0c;因为很多公司都会涉及到写表格展示数据 那么在某些公司内就会出现为了让数据更直观的感受到 而让你给某些行和列用颜色标出来。使得看起来更方便 那么这里就汇总一下常用的横竖合并以及横竖颜色底纹如何实现 效果图 这是写的一个dem…

小米便签维护过程记录——可能出现问题解决方案

在对小米便签开源代码进行研究和维护及新功能开发的同时&#xff0c;会遇到很多问题&#xff0c;将以本文进行记录总结。 导入项目 若不导入直接Open会导致默认为Project&#xff0c;不为Android。 小米标签菜单栏不显示的问题 先来看NotesListActivity类&#xff0c;这个类创…

Zookeeper 4 Zookeeper JavaAPI 操作 4.5 Curator API 常用操作【修改节点】

Zookeeper 【黑马程序员Zookeeper视频教程&#xff0c;快速入门zookeeper技术】 文章目录Zookeeper4 Zookeeper JavaAPI 操作4.5 Curator API 常用操作4.5.1 修改节点4 Zookeeper JavaAPI 操作 4.5 Curator API 常用操作 4.5.1 修改节点 直接开干 修改之前app1 的数据是本机…

PS1文件执行

PS1文件执行目录概述需求&#xff1a;设计思路实现思路分析1.power shell 管理2.shell 管理执行参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for ch…

软件需求说明书(GB856T——88)基于协同的在线表格forture-sheet

软件需求说明书的编写提示 1引言 1.1产品目的 制造一个功能丰富&#xff0c;配置简单的在线表格组件&#xff0c;开箱即用&#xff0c;产品对位所有办公用户&#xff0c;可以大量用户同时在线进行协同合作办公&#xff0c;可以大大的提高工作效率。 1.2产品范畴 产品为软件…

Javaweb会话跟踪技术(Cookie和Session)

目录 一、会话跟踪技术概述 二、Cookie 1.Cookie基本原理 2.Cookie基本使用 3.Cookie存活时间 4.cookie存储中文 三、Session 1.Session钝化、活化 2.Session基本使用 3.sesion销毁 四Cookie和Sesion区别 一、会话跟踪技术概述 1.会话&#xff1a;用户打开浏览器&…

Java和vue开发的橱柜定制系统家具定制系统

简介 橱柜定制家具定制系统。用户查看家具样本&#xff0c;进行预约下单&#xff0c;后台人员根据用户的要求给出效果图和方案&#xff0c;以及报价&#xff0c;填写上门时间。管理员上门测量和用户确定好需求后上传协议&#xff0c;此时订单变成待开工订单&#xff0c;后台人…

过半985、单岗位2K+简历!速腾聚创如何开展校园招聘?

在半导体、芯片等新兴科技产业&#xff0c;人才短缺和人才培养已经成为全球性问题。 速腾聚创是国内激光雷达领域的龙头企业&#xff0c;在庞大人才实力的助推下&#xff0c;构建起激光雷达硬件、感知软件和芯片三大核心技术闭环&#xff0c;通过领先的技术实力和过硬的产品质量…

VB实现火焰的效果

Option Explicit 锁定指定窗口&#xff0c;禁止它更新。同一时刻间只能有一个窗口处于锁定状态&#xff0c;可用在界面作大弧度布局改变时。 Private Declare Function LockWindowUpdate Lib “user32” (ByVal hwndLock As Long) As Long 在指定的设备场景中设置一个像素的RGB…

机器学习多分类二分类回归问题数据集分享

数据集&#xff1a; https://download.csdn.net/download/qq_38735017/87336921

DocuWare 文档管理软件在医疗保健行业的应用

DocuWare 文档管理软件在医疗保健行业的应用 尽管技术在其他领域取得了很大进步&#xff0c;但许多医院、门诊机构和医疗保健提供商仍然使用过时的系统来管理计费、财务和人力资源等文档密集型流程。借助快速、安全、灵活的 DocuWare 文档管理软件&#xff0c;可以节省您的时间…

基于注解方式实现Spring Security忽略拦截

文章目录1.Spring Security忽略拦截配置2.基于配置文件注入2.1.添加配置2.2.修改Spring Security配置类2.3. 测试3.基于注解的方式过滤接口3.1.添加忽略拦截注解3.2.获取所有使用了IgnoreWebSecurity注解的接口访问路径3.3.测试1.Spring Security忽略拦截配置 关于Spring Secu…

启动项目端口被占用无奈只能重启?程序员的电脑绝不允许重启!

各位小伙伴大家好呀~最近疫情严重很多小伙伴都阳了༼༎ຶᴗ༎ຶ༽虽然放开了&#xff0c;但还是要注意防护呀&#xff01; 我们在写代码的时候&#xff0c;很多小伙伴都遇到过启动项目但是端口被占用&#xff0c;找了半天也不知道究竟谁占用的&#xff0c;所以就使出了“杀手锏…

@Scope注解的使用方法

Scope注解的使用方法 原文详细参考 1.Scope注解是什么 Scope注解是 Spring IOC 容器中的一个作用域&#xff0c;在 Spring IOC 容器中&#xff0c;他用来配置Bean实例的作用域对象。Scope 具有以下几种作用域&#xff1a; singleton 单实例的(单例)(默认)   ----全局有且…

OPTIONS 漏洞修复

文章目录前言&#xff1a;OPTIONS 漏洞说明Nginx 修复方法环境说明修复测试Tomcat 修复方法环境说明修复测试Tomcat 版本&#xff1a;8.5.3 测试SpringBoot 项目修复方法环境说明修复测试总结前言&#xff1a;OPTIONS 漏洞说明 漏洞名称 &#xff1a; OPTIONS method is enabl…

Docker+Jenkins+Gitee+Maven构建后台jar包后配置SSH传送到服务器并执行指定命令

场景 DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑&#xff1a; DockerJenkinsGiteeMaven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑_霸道流氓气质的博客-CSDN博客 在上面将后台jar包构建成功之后&#xff…

【SpringMVC】SpringMVC的入门

1.SpringMVC的入门案例 1.1 项目目录 1.2 配置核心控制器和编码过滤器(web.xml) <?xml version"1.0" encoding"UTF-8"?> <web-app><display-name>Archetype Created Web Application</display-name><!--配置spring mvc的核…

20221223英语学习

今日托福词汇 review n.复习; 回顾, 检讨; 检阅; 评论; 详检, 审核; 回放功能 tentative adj.试验性的; 不确定的; 暂时的; 犹豫的, 踌躇不决的 synonym n.同义词 confine v.限制&#xff1b;监禁 parking n.机动车停放&#xff1b;停车场 sculpture n.雕像&#xff0c;雕…