前言技术之mybatis-plus

news2024/11/13 14:46:34

目录

1.什么是mybatis-plus

2.初体验

3.日志

4.主键生成策略

5.更新

6.自动填充


1.什么是mybatis-plus

升级版的mybatis,目的是让mybatis更易于使用, 用官方的话说“为简化而生” 官网: MyBatis-Plus

2.初体验

1.准备数据库脚本

数据库 Schema 脚本如下:

DROP TABLE IF EXISTS user;

CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);

其对应的数据库 Data 脚本如下:

DELETE FROM user;

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

2.初始化工程

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.7</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.ycx</groupId>
    <artifactId>mptest01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>mptest01</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3.4</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

application.yml:

server.port=8080
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/oapro?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

启动类,指定mapper接口的位置

@MapperScan("com.ycx.mptest01.**")
@SpringBootApplication
public class Mptest01Application {

    public static void main(String[] args) {
        SpringApplication.run(Mptest01Application.class, args);
    }

}

3.编码

编写实体类 User.java

import lombok.Data;

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

编写 Mapper 包下的 UserMapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycx.mptest01.model.User;
import org.springframework.stereotype.Repository;

@Repository
public interface UserMapper extends BaseMapper<User> {

}

4.开始使用

添加测试类,进行功能测试:

package com.ycx.mptest01;

import com.ycx.mptest01.mapper.UserMapper;
import com.ycx.mptest01.model.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
public class SampleTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }

}

 

3.日志

application.properties

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

在开发中将sql语句打印到控制台,以便于调试

4.主键生成策略

雪花算法

默认的主键生策略,如果需要保存的实体对象中没有指定的主键值,则默认使用雪花算法来生成 

自增ID

数据库的字段必须是配置了自增 
对应的实体的主键字段加入自增注解: @TableId(type = IdType.AUTO) 

其他类型:

public enum IdType {
    AUTO(0), //自动增长
    NONE(1), //未设置主键
    INPUT(2), //手动输入
    ASSIGN_ID(3), //雪花算法
    ASSIGN_UUID(4); //排除到下划线的UUID,32位长度
    private final int key;

    private IdType(int key) {
        this.key = key;
    }

    public int getKey() {
        return this.key;
    }
}

测试代码

package com.ycx.mptest01.model;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

@Data
public class User {
//    @TableId(type = IdType.AUTO)  数据库自增
//    @TableId(type = IdType.ASSIGN_ID) 默认雪花算法
    @TableId(type = IdType.INPUT)   // 程序员自己控制
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

SampleTest.java

@Test
    public void testInsert() {
        User user = new User();
        user.setAge(18);
        user.setEmail("javaxl@qq.com");
        user.setName("javaxl");
//        user.setId(66L); // 程序员自己控制
        userMapper.insert(user);
    }

 测试结果如下

 

5.更新

通过主键更新

SampleTest.java

@Test
    public void testUpdate() {
        User user = new User();
        user.setId(6L);
        //ID用于定位sql,其他的列段设置几个就修改几个,没有设置的则保留原来的值
        user.setName("小李飞刀");
        user.setAge(22);
        int i = userMapper.updateById(user);
        System.out.println(i);
    }

6.自动填充

在数据表的设计中,经常需要加一些字段,如:创建时间,最后修改时间等,此时可以使用mybatis-plus来帮我们进行自动维护

在自动填充有两种方式:

一: 通过数据库完成自动填充

 

 

注意:

生成时间:不需要根据当前时间戳更新
最后修改时间:需要根据当前时间戳更新

测试代码如下

@Test
    public void testInsert() {
        User user = new User();
        user.setAge(18);
        user.setEmail("javaxl@qq.com");
        user.setName("javaxl");
        userMapper.insert(user);
    }
@Data
public class User {
//    @TableId(type = IdType.AUTO)  数据库自增
//    @TableId(type = IdType.ASSIGN_ID) 默认雪花算法
//    @TableId(type = IdType.INPUT)   // 程序员自己控制
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //在代码中同步加入创建时间和最后修改时间的维护
    private Date createTime;
    private Date lastModifiedTime;
}

结果如下:

完成后可以通过新增或更新

二:使用程序完成自动填充

将数据库中的自动维护功能取消:

 

 

第一步:实体类中加入注解

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;

import java.util.Date;

@Data
public class User {
//    @TableId(type = IdType.AUTO)  数据库自增
//    @TableId(type = IdType.ASSIGN_ID) 默认雪花算法
//    @TableId(type = IdType.INPUT)   // 程序员自己控制
    private Long id;
    private String name;
    private Integer age;
    private String email;

    //在代码中同步加入创建时间和最后修改时间的维护
//    private Date createTime;
//    private Date lastModifiedTime;

    //表明在插入时自动维护字段
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    //表明在插入和更新时自动维护字段
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date lastModifiedTime;
}

第二步:编写处理类

 

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

// 不要忘了处理器是spring的组件
@Component
public class AutoFillHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("lastModifiedTime", new Date(), metaObject);

    }

    @Override
    public void updateFill(MetaObject metaObject) {
//this.setFieldValByName("createTime",new Date(), metaObject);
        this.setFieldValByName("lastModifiedTime", new Date(), metaObject);
    }
}

 测试代码如下

@Test
    public void testInsert() {
        User user = new User();
        user.setAge(18);
        user.setEmail("javaxl@qq.com");
        user.setName("javaxl");
        userMapper.insert(user);
    }

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId(1611736686478331905L);
        //ID用于定位sql,其他的列段设置几个就修改几个,没有设置的则保留原来的值
        user.setName("小李飞刀");
        user.setAge(22);
        int i = userMapper.updateById(user);
        System.out.println(i);
    }

完成后可以通过新增或更新。

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

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

相关文章

BI 解决方案:BimlStudio 22.3.0 Crack

全功能开发环境&#xff1a;&#xff1a;&#xff1a;&#xff1a; 导入现有解决方案 通过添加 BimlScript 自动化进行更改并重新生成包;使您的解决方案更好、更快。 可视化整个 BI 解决方案 通过我们的可视化设计器在一个位置进行更改&#xff0c;观察您的整个解决方案自行更新…

【ArcGIS微课1000例】0061:ArcGIS打开xyz格式点云数据的方法

本文讲述ArcMap和ArcScene中如何打开xyz格式的点云数据并做可视化的方法。 文章目录 一、xyz格式点云简介二、ArcMap打开xyz点云三、ArcScene打开xyz点云四、注意事项一、xyz格式点云简介 本实验使用的数据是配套数据包中的0061.rar,斯坦福大学的点云数据,格式为X,Y,Z,如下…

【My Electronic Notes系列——晶闸管】

目录 序言&#xff1a; &#x1f3ee;&#x1f3ee;新年的钟声响&#xff0c;新年的脚步迈&#xff0c;祝新年的钟声&#xff0c;敲响你心中快乐的音符&#xff0c;幸运与平安&#xff0c;如春天的脚步紧紧相随&#xff0c;春节快乐&#xff01;春华秋实&#xff0c;我永远与你…

Linux下动静态库的打包与使用C C++

目录前言为什么用动静态库动态链接与静态链接底层优缺点Linux下的动静态库动静态库的对比打包静态库使用静态库打包动态库使用动态库小结win下打包动静态库前言 为什么用动静态库 我们在实际开发中&#xff0c;经常要使用别人已经实现好的功能&#xff0c;这是为了开发效率和…

移动窗口下的LiDAR点云区域生长滤波算法教程

一、前言LiDAR 滤波的现有方法包括&#xff1a;数学形态学滤波法、基于地形坡度滤波、最小二乘内插法滤波等滤波方法。最小二乘内插法能够较好的获取地形趋势面&#xff0c;但是算法中无法根据地形自适应设置参数&#xff1b;在地形起伏较大的地区提取结果精度低&#xff1b;无…

Linux进程的后台运行

文章目录一. 什么是进程?二. 进程后台运行在了解三种进程后台运行的方式前&#xff0c;小编觉得有必要先简单讲解一下什么是进程。 PS: 本篇博客技术参考价值不大&#xff0c;只是类似随笔比较水&#xff0c;详细的知识点可以关注一下nohup命令的使用。 一. 什么是进程? 什…

00开篇词:带你玩转gRPC框架

前言 大家好&#xff0c;先做一下自我介绍 我叫Barry Yan&#xff0c;目前是一名互联网公司的研发工程师&#xff0c;同时也是后端技术领域的狂热爱好者和技术博主&#xff0c;在GitHub、CSDN社区、51CTO博客社区、阿里云技术社区、掘金技术社区和InfoQ写作社区等都有自己的博…

详解1242:网线主管(二分答案经典习题)

题目1242&#xff1a;网线主管时间限制: 1000 ms 内存限制: 65536 KB提交数: 23180 通过数: 5566【题目描述】仙境的居民们决定举办一场程序设计区域赛。裁判委员会完全由自愿组成&#xff0c;他们承诺要组织一次史上最公正的比赛。他们决定将选手的电脑用星形拓扑结构连接在一…

【SVM原理推导】核SVM为什么能分类非线性问题?

核SVM为什么能分类非线性问题?要解决这个问题,首先应该先深入理解SVM的原理与本质。(涉及SVM的问题是很常见的,因为SVM可以算是传统机器学习领域非常成功的算法之一了,现在仍有许多research运用SVM解决问题。) 一、支持向量机(SVM) 1. 基本介绍与提出背景 支持向量机…

【C++】lambda 表达式 | 包装器

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;lambda表…

解决宏碁非凡S3 安装Win11时无法找到驱动器问题

1 问题描述 机型&#xff1a;宏碁非凡S3 2022款CPU&#xff1a;i5 1240P安装系统&#xff1a;Win11 专业版问题描述&#xff1a;安装系统时&#xff0c;在选择驱动器界面无法找到驱动器&#xff0c;如下图所示 2 解决流程 查了一下网上的解决办法&#xff0c;进入BIOS把VMD C…

非极大值抑制(Non-Maximum Suppression)

文章目录一、什么是非极大值抑制二、为什么要用非极大值抑制三、 如何使用非极大值抑制四、代码段一、什么是非极大值抑制 非极大值抑制&#xff0c;简称为NMS算法&#xff0c;英文为Non-Maximum Suppression。其思想是搜素局部最大值&#xff0c;抑制非极大值。NMS算法在不同…

JavaEE7-Bean的作用域

目录 1.作用域定义 2.Bean的6种作用域 2.1.singleton&#xff1a;单例作用域&#xff08;默认作用域&#xff09; 2.2.prototype&#xff1a;原型作用域&#xff08;多例作用域&#xff09; 2.3.request&#xff1a;请求作用域 2.4.session&#xff1a;会话作用域 2.5.a…

C++基础回顾

吼吼吼CC基础回顾C基础入门一、标识符1.1标识符命名规则二、数据类型2.1整形&#xff08;格式&#xff1a;int 关键字&#xff09;2.2 sizeof关键字2.3 float关键字2.4字符型2.5转义字符2.6字符串型2.7布尔类型2.8数据的输入三、运算符3.1算数运算符前置递增与后置递增区别3.2 …

MS Access数据库多数据源JDBC查询

Druid, C3P0都不支持微软的Access&#xff0c;如何实现多数据源JDBC查询&#xff1f;&#xff1f; 2023-01-23T23:54:52.4760800 WARNING com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask544a5904 -- Acquisition Attempt Failed!!! Clearing pending a…

Linux内核驱动初探(二) TI声卡

目录 0. 前言 1. menuconfig 2. 超时问题 3. 稳定性问题 0. 前言 通过查询该设备原理图可知&#xff0c;该声卡的Codec芯片型号为德州仪器 TLV320DAC3101。 1. menuconfig 我们在 linux-menuconfig 里面如下设置&#xff1a;进入 Device Drivers ---> Sound card supp…

准确率、精确率、召回率、F1-measure

文章目录准确率(Accuracy)精确率(precision)召回率(recall)F1-measure值学习理解网站-p’(Predicted)n’(Predicted)p(Actual)True PositiveFalse Negtiven(Actual)False PositiveTrue Negtive 准确率(Accuracy) ANo.Samples Predicted CorrectlyTotal No.of SamplesTPTNPN(1)A…

适配splashscreen步骤以及遇到的坑

Android 12 启动画面 从 Android 12 开始&#xff0c;在所有应用的冷启动和温启动期间&#xff0c;系统一律会应用 Android 系统的默认启动画面。默认情况下&#xff0c;此系统默认启动画面由应用的启动器图标元素和主题的 windowBackground&#xff08;如果是单色&#xff09…

虚函数的静态解析

目录 一.基类的constructor和destructor内 二.使用的是基类的对象而不是基类对象的pointer或reference 存在两种情况&#xff0c;虚函数机制不会出现预期行为&#xff1a; 即不根据虚函数的机制来调用类中对应的虚函数 示例中使用的基类和派生类&#xff1a; class base_cl…

vue事件车的原理与标准写法实现兄弟组件的传值

目录前言一&#xff0c;全局事件总线介绍1.1 原理介绍1.2 x需要满足的条件二&#xff0c;知识点的复习2.1 vc是什么2.2 vm管理vc如何体现2.3 原型2.4 上述知识的串联三&#xff0c;实现需求3.1 x的编写及讲解3.2 使用x四&#xff0c;标准写法4.1 写法改动4.2 销毁五 关键代码后…