mybatis plus基本使用初体验02

news2024/12/25 9:05:28

1.常用注解

1.1 @TableName注解

MyBatis-Plus在确定操作的表时,由BaseMapper的泛型决定,即实体类型决定,且默认操作的表名和实体类型的类名一致。若实体类类型的类名和要操作的表的表名不一致,会出现什么问题?

将数据库user表改为t_user,运行测试方法。
在这里插入图片描述
可以看到报错了,mp依旧回去操作user表,但是此时数据库中已经没有user表了,所以就会报错,此时需要使用@TableName注解表明实体类与数据库表之间的映射关系。

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {

    private Long id;
    private String name;
    private Integer age;
}

添加注解修改过后,再次运行测试就不会出现报错了。
在这里插入图片描述
同时,如果实体类与数据库表都是采用相同的前缀表示方法,例如:User -> t_user,那么可以使用全局配置来完成映射。

mybatis-plus:
  # 设置MyBatis-Plus的全局配置
  global-config:
    db-config:
      # 设置实体类所对应的表的统一前缀
      table-prefix: t_

1.2 @TableId注解

MyBatis-Plus在实现CRUD时,会默认将id作为主键列,并在插入数据时,默认基于雪花算法的策略生成id。若实体类和表中表示主键的不是id,而是其他字段,例如uid。

将user类的id属性修改为uid,数据库表中id字段也同时改为uid,运行测试方法。,在这里插入图片描述
可以看到mp依旧会操作id这个字段,所以就会出现报错。此时使用@TableId注解表明那个属性是主键即可解决这个问题。

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {

    @TableId
    private Long uid;
    private String name;
    private Integer age;
}

添加注解后,再次运行测试方法,就不会报错了。
在这里插入图片描述
@TableId注解有value属性,可以用来指定主键字段,type属性可以用来指定主键生成策略。

描述
IdType.ASSIGN_ID(默认)基于雪花算法的策略生成数据id,与数据库id是否设置自增无关
IdType.AUTO使用数据库的自增策略,注意,该类型请确保数据库设置了id自增,否则无效

1.3 @TableField注解

MyBatis-Plus在执行SQL语句时,要保证实体类中的属性名和表中的字段名一致,如果实体类中的属性名和字段名不一致的情况,会出现什么问题呢?

将user类的name属性修改为userName,将数据库t_use表的name字段修改为user_name,运行测试方法。
在这里插入图片描述
此时运行成功了,若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格。例如实体类属性userName,表中字段user_name,此时MyBatis-Plus会自动将下划线命名风格转化为驼峰命名风格。

将user类的name属性修改为username,继续运行测试方法。
在这里插入图片描述
此时报错了,mp依旧会操作username,但是数据库表中没有这个字段。这时可以用@TableField注解来解决问题。

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {

    @TableId
    private Long uid;
    @TableField("user_name")
    private String username;
    private Integer age;
}

添加注解后,再次运行测试方法,就不会报错了。

1.4 @TableLogic注解

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

修改实体类和数据库表结构。

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("t_user")
public class User {

    @TableId
    private Long uid;
    @TableField("user_name")
    private String username;
    private Integer age;
    @TableLogic
    private Integer isDelete;
}

在这里插入图片描述
接下来测试删除方法。
在这里插入图片描述
在这里插入图片描述
可以看到删除操作,只是修改记录的状态,将0变为1,表示由有效状态变为无效状态,但是实际的记录依旧在数据库中,并没有被删除掉。

2.条件构造器

2.1 wapper介绍

在这里插入图片描述

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

2.2 QueryWrapper

组装查询条件

    @Test
    public void testQueryWrapper(){
        // 查询用户名中包含pica,并且年龄在20到24之间的用户
        QueryWrapper<User> query = new QueryWrapper<>();
        query.like("user_name", "pica")
                .between("age", 20, 24);
        List<User> userList = userMapper.selectList(query);
        System.out.println(userList);
    }

测试结果:
在这里插入图片描述
组装删除条件

    @Test
    public void testQueryWrapper1(){
        // 删除年龄为23的用户
        QueryWrapper<User> query = new QueryWrapper<>();
        query.eq("age", 23);
        int result = userMapper.delete(query);
        System.out.println("影响的行数:" + result);
    }

测试结果:
在这里插入图片描述
条件的优先级

    @Test
    public void testQueryWrapper2(){
        // 将(年龄大于20并且用户名中包含有pica)或年龄为18的用户信息修改
        QueryWrapper<User> query = new QueryWrapper<>();
        query.like("user_name", "pica")
                .gt("age", 20)
                .or()
                .eq("age", 18);
        User user = new User();
        user.setAge(18);
        user.setUsername("修改");
         int result = userMapper.update(user, query);
        System.out.println("受影响的行数:" + result);
    }

测试结果:
在这里插入图片描述

组装select子句

    @Test
    public void testQueryWrapper3() {
        //查询用户信息的username和age字段
        // SELECT username,age FROM t_user
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.select("user_name", "age");
        //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值 为null
        List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
        maps.forEach(System.out::println);
    }

测试结果:
在这里插入图片描述
实现子查询

    @Test
    public void test06() {
        //查询id大于5的用户信息
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.inSql("uid", "select uid from t_user where uid > 5");
        //selectObjs的使用场景:只返回一列
        List<Object> objects = userMapper.selectObjs(queryWrapper);
        objects.forEach(System.out::println);
    }

测试结果:
在这里插入图片描述
剩余的条件构造其使用基本一致,就不一一展示了。

3.分页插件

MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能。

添加配置类,实现分页插件功能。

@Configuration
//扫描mapper接口所在的包
@MapperScan("com.picacho.mybatisplus.mapper")
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}
    @Test
    public void testPage(){
        //设置分页参数
        Page<User> page = new Page<>(1, 5);
        userMapper.selectPage(page, null);
        //获取分页数据
        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());
    }

测试结果:
在这里插入图片描述
可以看到,直接添加一个配置,然后添加分页插件,就可以在代码中直接使用分页功能了,相当简便。

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

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

相关文章

力扣sql基础篇(八)

力扣sql基础篇(八) 1 大满贯数量 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Championship的数字代表的就是赢得比赛的球员的id,可以使用行转列(UNION all) #如果涉及到分组函数,建议还是不要写除了分组字段外的其他字段,因为不太符合标准sql …

正则化:五重境界理解减少过拟合的神器

本文来自公众号“AI大道理” 正则化作为减少过拟合的手段被大量的使用&#xff0c;那么为什么会出现过拟合呢&#xff1f;正则化又是什么&#xff1f;是怎么样发挥作用的呢&#xff1f; 1、过拟合是什么&#xff1f; 过拟合是指模型在训练集上取得很高的识别性能&#xff0c…

Ubuntu 22.04配置静态IP地址

1、查看ip地址网卡名称&#xff1a;ifconfig 2、编辑网卡配置文件&#xff1a;sudo vim /etc/netplan/01-network-manager-all.yaml 默认样式&#xff1a; network: version: 2 renderer: NetworkManager 3、修改为&#xff1a; network: ethernets: enp7s0: dhcp4: no dhcp6: …

【Kotlin】集合操作 ① ( List 创建与元素获取 | 安全获取集合元素 | getOrElse | getOrNull )

文章目录一、List 创建与元素获取二、安全获取集合元素1、getOrElse 函数2、getOrNull函数三、List 创建与元素获取代码示例一、List 创建与元素获取 Kotlin 中的集合分为两类 , 只读集合 和 可变集合 ; 调用 listOf 函数 , 可以 直接创建 List 集合 ; 通过 [] 下标可以 直接获…

Spring系列 容器

创建容器 方式一&#xff1a;类路径加载配置文件&#xff1a; ApplicationContext ctx new ClassPathXmlApplicationContext("applicationContext.xml"); 方式二&#xff1a;文件路径加载配置文件&#xff08;用绝对路径&#xff09;&#xff1a; ApplicationConte…

闲话统信UOS

这周统信UOS正式在官网发布了22.0镜像统信UOS家庭版官网-正版国产操作系统--统信软件 (uniontech.com) 支持双系统&#xff1a;不影响原有系统使用&#xff0c;更换系统不担心电脑资料丢失&#xff1b; 官方应用商店&#xff1a;无病毒、放心安全下载&#xff0c;工作学习无打…

[C/Linux练习]进度条小程序

前置知识点 \n\r \n 换行&#xff0c;但只是垂直向下&#xff0c;并不水平移动。 \r 回车&#xff0c;返回当前行的头部。 光标返回头部后再打印&#xff0c;会从头开始覆盖之前打印在该行的内容。 printf的\n默认解释成换行回车。 光标是与显示器匹配的&#xff0c;光标在哪…

基于PHP的宠物社会化小程序

摘要随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

Java集合面试题

集合容器概述 什么是集合 集合框架&#xff1a;用于存储数据的容器。 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。 任何集合框架都包含三大块内容&#xff1a;对外的接口、接口的实现和对集合运算的算法。 接口&#xff1a;表示集合的抽象数据类型。接口…

AlexNet,VGG,NiN,GoogleNet,批量归一化

学着学着突然发现&#xff0c;数据分析numpy&#xff0c;matplotlib&#xff0c;pandas这一部分内容没学完&#xff0c;还有pytorch的一些代码没有学完&#xff0c;所以在看像AlexNet这一些代码实现的时候&#xff0c;很多都看不懂&#xff0c;也得慢慢的补上来了hhh。这一周花…

Ajax的学习笔记(包括原生的ajax,jquery,axios,fetch)

一、什么是ajax AJAX 异步 JavaScript 和 XML。 AJAX 是一种用于创建快速动态网页的技术。 通过在后台与服务器进行少量数据交换&#xff0c;AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新。 二、ajxa的创建使…

【尚硅谷】Java数据结构与算法笔记10 - 树结构的基础部分

文章目录一、二叉树1.1 为什么需要树结构1.1.1 数组存储方式的分析1.1.2 链式存储方式的分析1.1.3 树存储方式的分析1.2 树示意图1.3 二叉树的概念1.4 二叉树 - 遍历节点1.5 二叉树 - 查找指定节点1.6 二叉树 - 删除节点二、顺序存储二叉树2.1 顺序存储二叉树的概念2.2 顺序存储…

过气明星组合大衣哥、李嘉明、唐磊,谁录制祝福视频能价值100万

有人说大衣哥、李嘉明和唐磊&#xff0c;都属于过气的明星&#xff0c;只能说仁者见仁&#xff0c;智者见智了&#xff0c;毕竟每个人对事情的的看法不同&#xff0c;得到的结论也不会一样。大衣哥是农民歌唱家&#xff0c;本来就是泥腿子出身&#xff0c;就算有人气流量也不懂…

Ai检测人员穿衣规范系统 opencv

Ai检测人员穿衣规范系统可以通过opencvyolo深度学习技术对现场画面中人员穿衣自动检测&#xff0c;发现现场人员未正确按要求穿衣进行抓拍留档。OpenCV可以在不同的系统平台上使用&#xff0c;包括Windows&#xff0c;Linux&#xff0c;OS&#xff0c;X&#xff0c;Android和iO…

【数据安全】一起聊聊数据安全

信息安全的本质就是保护数据被合法地使用&#xff0c;或者一句话“让对的人看到对的数据&#xff01;”。 近来各种各样的安全名词满天飞&#xff0c;什么信息安全、网络安全、应用安全、数据安全、物联网安全、AI安全… 相应的法律、标准、资质、认证、安全方向产品、创业公司…

HTTP(类似TCP/TUP协议)、Tomact(对整个web操作的集成软件)、Servlet(动态显示,需要Tomcat才能运行)

javaWeb&#xff1a;web为网站&#xff0c;javaWab就是用java来解决web互联网领域的技术栈 B/S架构&#xff1a;Brower/Server&#xff0c;浏览器/服务器 架构模式&#xff0c;他的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器&#…

HBase RowKey设计和实现

HBase由于存储特性和读写性能&#xff0c;在OLAP即时分析中发挥重要作用&#xff0c;Rowkey的设计好坏关乎到HBase的使用情况。 我们知道HBase中定位一条数据需要四个维度的限制&#xff1a;RowKey&#xff0c;Column Family&#xff0c;Column Qualifier&#xff0c;Timestamp…

同源策略和跨域请求的实现

一、什么是同源策略 如果两个 URL 的 protocol、port (en-US) (如果有指定的话) 和 host 都相同的话&#xff0c;则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”&#xff0c;或者直接是“元组”。&#xff08;“元组”是指一组项目构成的整体&#xff0c;双重/…

C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#

文章目录前言1. 为什么使用文件2. 什么是文件程序文件数据文件3. 文件的打开和关闭4. 文件的顺序读写fgetcfputcfgetsfputsfprintffscanf流的介绍fwritefread5. 文本文件和二进制文件6. 文件读取结束的判定被错误使用的feof7. 文件缓冲区写在最后前言 相信大家对文件都不陌生&a…

4、数据类型

目录 1. 基本类型 &#xff08;1&#xff09;数值类型 &#xff08;2&#xff09;字符类型 &#xff08;3&#xff09;布尔类型 2. 构造类型 3. 空类型 本文主要介绍基本数据类型。 1. 基本类型 基本类型也就是C语言中的基础类型&#xff0c;其中包括整型、字符型、浮点…