mtbatisplus

news2024/11/25 7:47:31

title: mybatis_plus
date: 2023-09-03 21:06:27
tags:


mybatis_plusreviews

约定大于配置

默认

当我们要使用mybatisplus的时候 我们需要去集成mp提供的BaseMapper

public interface UserMapper extends BaseMapper

关于mybatisplus常用注解

注解到类上

@TableName(“表名”) 用来解决 数据库表对应到java实体 符合驼峰命名

注解到字段

@TableId 默认是id为映射字段 可以自己指定 注意(一个实体对应一个表只有一个主键)

mybatisplus不支持联合主键

private Long id;

1.0@TableField(“isMarried”)

作用 解决实体属性与数据库字段不一致情况

作用二、

@TableField(“isMarried”)

private Boolean isMarried 在对应到mybatisplus 查询语句时会自动去掉is 对应数据库 的Married字段

作用三、

@TableField(“order”)

private Stringi order;

实体名字与mysql的保留关键字冲突

@exist()

是否是数据库字段

mybatisplus的配置可以替代mybatis的配置

mybatis-plus:
type-aliases-package: com.itheima.mp.domain.po
global-config:
db-config:
id-type: *auto
* logic-delete-field: deleted # *逻辑删除字段
* configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

mybatis支持各种复杂的where条件

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

demo

   @Test
    public void test(){
        List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L));
        users.forEach(System.out::println);
    }
    @Test
    public void testdemo01(){
        //1.构建查询条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<User>()
                .select("id", "username","info","balance")
                .like("username","o")
                .ge("balance",1000);
        List<User> users = userMapper.selectList(objectQueryWrapper);
        for (User user : users) {
            System.out.println(user.toString());
        }
    }

    @Test
    public void testqueryWrapper(){
        User user = new User();
        user.setBalance(2000);
        //1.构建查询条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<User>()
                .eq("username","jack");
        userMapper.update(user,objectQueryWrapper);
    }

    @Test
    public void testUpdateWrapper(){
        UpdateWrapper<User> in = new UpdateWrapper<User>().setSql("balance=balance-200")
                .in("id",List.of(1L, 2L, 4L));
        userMapper.update(null,in);
    }
    
    @Test
    public void testLamdaQueryWrapper(){

        //1.构建条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
        LambdaQueryWrapper<User> userLambdaQueryWrapper = objectQueryWrapper.lambda().select(User::getId, User::getUsername, User::getBalance
                        , User::getInfo).like(User::getUsername, "0")
                .ge(User::getBalance, 1000);

        List<User> users = userMapper.selectList(userLambdaQueryWrapper);
    }

}

lamdaQueryWrapper

示例

LambdaQueryWrapper<User> userLambdaQueryWrapper = lamdQueryWrapper.lambda().select(User::getId, User::getUsername, User::getBalance
                        , User::getInfo).like(User::getUsername, "0")
                .ge(User::getBalance, 1000);

自定义sql

思想就是 我们where之后的判断条件采用mtbatis构建的并且采用${} 拼接到我们自己的

示例

首先定义一个queryWrapper传给自己的方法 也就是定义在mapper中的方法


    //定义条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
                objectQueryWrapper.lambda().in(User::getId,longs);
        //2.执行更新
        userMapper.updateBalanceByWrapper(200,objectQueryWrapper);

mapper 注意mapper中只能用@Param(“ew”) 来接收自定义的条件 这是规定

 @Update("UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}")
    void updateBalanceByWrapper(@Param("amount") int amount, @Param("ew") 							QueryWrapper<User> wrapper);
    该方法对应到Mapper.xml
   <select id="queryUsersByWrapper" resultType="com.itheima.mp.domain.po.User">
        SELECT u.*
        FROM user u
        INNER JOIN address a on u.id = a.user_id
        ${ew.customSqlSegment}
    </select>

因为mybatisplus没办法做多表查询 我们可以使用自定义sql来实现都多表查询

       List<Long> longs = List.of(1L, 2L, 3L);
        //定义条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
            new QueryWrapper<User>().in("u.id",longs)
                    .eq("a.city","中国");
        //2.执行更新
        List<User> users = userMapper.queryUsersByWrapper(objectQueryWrapper);

xml文件

 <select id="queryUsersByWrapper" resultType="com.itheima.mp.domain.po.User">
        SELECT u.*
        FROM user u
        INNER JOIN address a on u.id = a.user_id
        ${ew.customSqlSegment}
    </select>

UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}

    @Test
    public void testCustomSql(){

        List<Long> longs = List.of(1L, 2L, 3L);

        //定义条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
                objectQueryWrapper.lambda().in(User::getId,longs);
        //2.执行更新
        userMapper.updateBalanceByWrapper(200,objectQueryWrapper);


    }
    
    在UserMapper接口
        @Update("UPDATE user SET balance = balance - #{amount} ${ew.customSqlSegment}")
    void updateBalanceByWrapper(@Param("amount") int amount, @Param("ew") QueryWrapper<User> wrapper);
    
    

    @Test
    public void testJoinCustomSql(){

        List<Long> longs = List.of(1L, 2L, 3L);

        //定义条件
        QueryWrapper<User> objectQueryWrapper = new QueryWrapper<>();
            new QueryWrapper<User>().in("u.id",longs)
                    .eq("a.city","中国");
        //2.执行更新
        List<User> users = userMapper.queryUsersByWrapper(objectQueryWrapper);

    }
    mapper接口
       List<User> queryUsersByWrapper(@Param("ew") QueryWrapper<User> wrapper);
       
       该方法对应到Mapper.xml
   <select id="queryUsersByWrapper" resultType="com.itheima.mp.domain.po.User">
        SELECT u.*
        FROM user u
        INNER JOIN address a on u.id = a.user_id
        ${ew.customSqlSegment}
    </select>

Service接口

批处理记得开启mysql的 rewriteBatchedStatements=true 重写批处理方案 oracle默认开启

如果不开启则是每次追加追加sql语句 即

insetinto tablename values(?????)

每次insert都是把我们的数据填充到问号中 而不是 直接拼接后values(1,2,3,4,5),(1,2,3,4,5)

开启之后就是 values(1,2,3,4,5),(1,2,3,4,5)这种拼接 就是只执行一次sql

url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

service层面 的lamdaQuery()

示例 注意在service层面写的lamdaQuery()

或者lamdaUpdate 条件的最后要追加执行的动作

例如

.one();

.list();

.update(); // 执行update

userService.lambdaQuery().
eq(User::getUsername,"jack")
.one();
   User user = userService.lambdaQuery()
                .eq(User::getUsername, "Rose")
                .one();

        System.out.println("user = " + user);

        List<User> list = userService.lambdaQuery()
                .like(User::getUsername, "o")
                .list();
        list.forEach(System.out::println);

        Long count = userService.lambdaQuery()
                .like(User::getUsername, "o")
                .count();
        System.out.println("count = " + count);

动态sql查询示例

 return userService.lambdaQuery()
                .like(username != null, User::getUsername, username)
                .eq(status != null, User::getStatus, status)
                .gt(min != null, User::getBalance, min)
                .lt(max != null, User::getBalance, max)
                .list();
        userService.lambdaUpdate()
                .set(User::getBalance, balance)
                .set(balance == 0, User::getStatus, 2)
                .eq(id != null, User::getId, id)
                .eq(username != null, User::getUsername, username)
                .update(); // 执行update
    

问题 为了解决循环依赖问题 mybatisplus 提供了静态工具类 DB

循环依赖

举例

usersevice 需要adreeservice

adreevice又需要 uservice

我们在userservice注入addressservice

在addressvice 注入uservice 就会出现循环依赖问题

DB 类

Db.save(user);
   
List<User> list = Db.list(new QueryWrapper<User>().like("username", "o"));

User user = Db.lambdaQuery(User.class)
                .eq(User::getUsername, "Rose")
                .one();
                
Long count = Db.lambdaQuery(User.class)
                .like(User::getUsername, "o")
                .count();
Db.lambdaQuery(User.class)
                .like(username != null, User::getUsername, username)
                .eq(status != null, User::getStatus, status)
                .gt(min != null, User::getBalance, min)
                .lt(max != null, User::getBalance, max)
                .list();
Db.lambdaUpdate(User.class)
                .set(User::getBalance, balance)
                .set(balance == 0, User::getStatus, 2)
                .eq(id != null, User::getId, id)
                .eq(username != null, User::getUsername, username)
                .update(); // 执行update

mybatisplus设置逻辑删除字段

mybatis会自动检测我们的删除字段

在我们执行删除操作的时候会替代成逻辑删除

mybatis-plus:
  type-aliases-package: com.itheima.mp.domain.po
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted # 逻辑删除字段
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

枚举转换器 JSON处理器 不实用

需要配置mybatis的配置设置一个美剧转换器

并且在枚举类加上注解

​ @EnumValue

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结"),
    ;
    @EnumValue
    private final int value;
    @JsonValue
    private final String desc;

    UserStatus(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}

configuration:
default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

JSON

    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;

myabatisplus分页插件

CV 大法好

首先 mybatisplus的分页插件基于 mybatis的 interceptor

先注册好核心拦截器 配置好mp的拦截器配置

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 1.创建核心拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 2.创建插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        paginationInnerInterceptor.setMaxLimit(1000L);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        // 返回
        return interceptor;
    }

注意mybatis的分页插件条件时page对象

返回的数据也是page对象

    @Test
    void testPageQuery() {
        int pageNo = 1, pageSize = 5;
        // 1.分页条件
        Page<User> p = Page.of(pageNo, pageSize);
        // 2.排序条件
        p.addOrder(new OrderItem("balance", false));

        // 3.查询
        Page<User> page = userService.page(p);

        // 4.分页结果
        long total = page.getTotal();
        System.out.println("total = " + total);
        long pages = page.getPages();
        System.out.println("pages = " + pages);
        List<User> records = page.getRecords();
        for (User record : records) {
            System.out.println("record = " + record);
        }
    }

工具

List users=p.getRecords();

UserVO vo = BeanUtil.copyProperties(user, UserVO.class);

加粗样式

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

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

相关文章

【c++】只出现一次的数字I II III(三个版本:三道题)

注&#xff1a;看这篇文章之前你需要了解& | ^ << >> 这五个运算符&#xff0c;此外&#xff0c;代码均经过测试运行通过 目录 1、只出现一次的数字I&#xff08;难度&#xff1a;简单&#xff09; 2、只出现一次的数字II&#xff08;难度&#xff1a;中等&a…

Ubuntu之apt-get系列--apt-get安装软件的方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--apt-get安装软件的方法/教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Ubuntu使用apt-get安装软件的方法。 安装软件 先更新列表 sudo apt-get update 安装软件 sudo apt-get install <package name>[<version>]…

importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图

一 drf之请求响应回顾 # 1 drf请求-请求对象&#xff1a;data&#xff0c;query_params&#xff0c;其他跟之前一样&#xff0c;FILES-默认&#xff1a;支持三种编码-局部配置&#xff1a;视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…

MySQL的故事——MySQL架构与历史

MySQL架构与历史 文章目录 MySQL架构与历史一、MySQL逻辑架构二、并发控制三、事务四、多版本并发控制(MVCC) 一、MySQL逻辑架构 第一层&#xff1a;连接处理、授权认证、安全等等 第二层&#xff1a;查询解析、分析、优化、缓存以及所有的内置函数。包含跨存储引擎的功能&…

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

java:操作cookie

背景 cookie 是一种客户端会话技术&#xff0c;将数据保存到客户端。主要流程就是&#xff1a; 1、服务器把数据设置到cookie并返回给浏览器 2、浏览器自动保存 3、浏览器下一次发送请求自动携带cookie给服务器 我们主要来看一下 java 是怎么操作 cookie 的。 cookie介绍 特…

区块链技术与应用 - 学习笔记2【密码学基础】

大家好&#xff0c;我是比特桃。本系列笔记只专注于探讨研究区块链技术原理&#xff0c;不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划&#xff0c;在“加快数字发展 建设数字中国”篇章中&#xff0c;区块链被列为“十四五”七大数字经济重点产业之一&#…

Node.js安装使用

目录 一、安装 Node.js二、环境变量配置三、npm常用命令 Node.js 是一个强大的运行时环境&#xff0c;它使您能够在服务器端运行 JavaScript 代码。它非常流行&#xff0c;用于构建 Web 应用程序、API 和各种后端服务。 一、安装 Node.js 1、访问 Node.js 官方网站。 在主页上…

算法训练day34|贪心算法 part03(LeetCode 1005.K次取反后最大化的数组和、134. 加油站、135. 分发糖果(处理一边再处理一边))

文章目录 1005.K次取反后最大化的数组和思路分析代码实现 134. 加油站暴力方法贪心方法 135. 分发糖果(处理一边再处理一边)思路分析代码实现思考总结 1005.K次取反后最大化的数组和 题目链接&#x1f525; 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#…

使用redis实现队列功能

使用redis实现队列功能 操作方法描述LPUSHLong lPush(String key, String… values)将一个或多个值 value 插入到列表 key 的表头&#xff0c;返回插入后列表中value的数量&#xff0c;若key不存在&#xff0c;会创建一个新的列表并执行 LPUSH 操作RPOPLPUSHString rPopLPush(S…

hive安装步骤

centos7安装hive&#xff0c;hive版本3.1.2 一、环境准备 JDK版本&#xff1a;jdk-8u381 Hadoop版本&#xff1a;hadoop-3.1.3 MySQL版本&#xff1a;8.0.34 二、hive安装步骤 1.解压 将压缩包复制到/opt/software目录下&#xff0c;并解压至/opt/module/目录 tar -zxf…

bootstrap 导航栏下拉菜单,居右下拉菜单

<!DOCTYPE html> <html lang"en"> <head><!-- 新 Bootstrap5 核心 CSS 文件 --> <link rel"stylesheet" href"bootstrap-5.0.0-beta1-dist/css/bootstrap.min.css"><!-- 最新的 Bootstrap5 核心 JavaScript 文…

Ubuntu22.04 LTS 显卡相关命令

第一部分查看驱显卡信息 一、查看显卡型号 # -i表示不区分大小写 lspci | grep -i nvidia # 必须安装好nvidia驱动 nvidia-smi -L 二、查看显卡驱动版本 cat /proc/driver/nvidia/version 三、查看CUDA、cuDNN版本 # 或者 nvcc -V&#xff08;两个显示的版本一致&#xf…

指针和字符数组笔试题及其解析(第一组)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 数组名在寻常情况下表示首元素地址&#xff0c;但有两种情况例外&#xff1a; 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff0c;这里的…

【KRouter】一个简单且轻量级的Kotlin Routing框架

【KRouter】一个简单且轻量级的Kotlin Routing框架 KRouter&#xff08;Kotlin-Router&#xff09;是一个简单而轻量级的Kotlin路由框架。 具体来说&#xff0c;KRouter是一个通过URI来发现接口实现类的框架。它的使用方式如下&#xff1a; val homeScreen KRouter.route&l…

C# PSO 粒子群优化算法 遗传算法 随机算法 求解复杂方程的最大、最小值

复杂方程可以自己定义&#xff0c;以下是看别人的题目&#xff0c;然后自己来做 以下是计算结果 private void GetMinResult(out double resultX1, out double min){double x1, result;Random random1 new Random(DateTime.Now.Millisecond* DateTime.Now.Second);min 99999…

创建MyBatis的映射文件模板

Settings->Editor->->Code Style->File and Code Templates <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dt…

tomcat部署、tomcat虚拟主机及tomcat多实例

目录 一、Tomcat概述 tomcat是什么&#xff1f; 什么是 servlet&#xff1f; 什么是 JSP? Tomcat 功能组件结构 Container 结构分析 Tomcat 请求过程 二、Tomcat部署 1、关闭防火墙和selinux&#xff0c;并将Tomcat所需软件包传到/opt目录下 2、安装JDK 3、设置JDK…

MATLAB 2022b 中设置关闭 MATLAB 之前进行询问

在 MATLAB 2022b 中可以进行设置&#xff0c;在关闭 MATLAB 之前进行询问&#xff0c;防止意外关闭 MATLAB。如图&#xff1a;

《Effective STL》读书笔记(一):容器

容器类型&#xff1a; 标准STL序列容器&#xff1a;vector, string, deque, list标准STL关联容器&#xff1a;set, multiset, map, multimap非标准序列容器slist和rope非标准关联容器&#xff1a;hash_set, hash_multiset, hash_map, hash_multimap标准的非STL容器&#xff1a…