Mybatis-plus(上)

news/2024/11/15 5:55:32/

1.什么是mybatis-plus

升级版的mybatis,目的是让mybatis更易于使用, 用官方的话说“为简化而生”
官网:https://baomidou.com/
    • 初体验

按照官网中的快速开始即可

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');
  1. 初始化工程

pom.xml

        <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>

application.yml

spring:#配置数据源信息系datasource:#配置数据源类型driver-class-name: com.mysql.cj.jdbc.Driver#配置连接数据库的个人信息url: jdbc:mysql://localhost:3306/oapro?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456

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

package com.ljj.mp0111.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ljj.mp0111.model.User;
import org.springframework.stereotype.Repository;@Repository
public interface UserMapper extends BaseMapper<User> {}

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.ljj.mptest01.model.User;
import org.springframework.stereotype.Repository;@Repository
public interface UserMapper extends BaseMapper<User> {}

4.开始使用

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

package com.ljj.mp0111;import com.ljj.mp0111.mapper.UserMapper;
import com.ljj.mp0111.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 {@Autowiredprivate UserMapper userMapper;@Testpublic 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.主键生成策略

雪花算法

默认的主键生策略,如果需要保存的实体对象中没有指定的主键值,则默认使用雪花算法来生成
雪花优点:
1.全局唯一
2.可以排序
uuid:全局唯一,不可以排序
自动增长:做不到全局唯一 可以排序

自增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.ljj.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);
}

不更改最原始的model层 测试方法默认就会

使用雪花算法

测试结果如下:

数据库自增

同时数据库中的对应表也开启自增 否则会报错

执行结果:+1

自定义

执行结果:

5.更新

通过主键更新

SampleTest.java

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

6.自动填充

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

在自动填充有两种方式:

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

注意:CURRENT_TIMESTAMP

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

测试代码如下

@Testpublic 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;
}

结果如下:

首次新增效果

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

更新:

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

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

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

package com.ljj.mp0111.model;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.ASSIGN_ID) 默认雪花算法
//    @TableId(type = IdType.AUTO)  //数据库自增
//        @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 lastModifyTime;
}

第二步:编写处理类

package com.ljj.mp0111.component;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 {@Overridepublic void insertFill(MetaObject metaObject) {this.setFieldValByName("createTime", new Date(), metaObject);this.setFieldValByName("lastModifyTime", new Date(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {//this.setFieldValByName("createTime",new Date(), metaObject);this.setFieldValByName("lastModifyTime", new Date(), metaObject);}
}

测试代码如下

@Testpublic void testInsert() {
//        1613094385287696385User user = new User();user.setAge(18);user.setEmail("javaxl@qq.com");user.setName("javaxl");
//        user.setId(66L); // 程序员自己控制int insert = userMapper.insert(user);System.out.println(insert);}@Testpublic void testUpdate() {User user = new User();user.setId(1613454651141697538L);//ID用于定位sql,其他的列段设置几个就修改几个,没有设置的则保留原来的值user.setName("小刘3");user.setAge(247);int i = userMapper.updateById(user);System.out.println(i);}

执行效果:

新增

更新

一般公司里都是选用程序来操作维护我们的这种数据 而不会选择去更改表的设计

ok 本期内容到此结束啦 Mybatis-plus第二期将介绍它的乐观锁以及条件查询和分页查询,逻辑删除,使用xml配置等...

我们下期见!


http://www.ppmy.cn/news/11551.html

相关文章

pytest-pytest插件之测试覆盖率pytest-cov

简介 测试覆盖率是指项目代码被测试用例覆盖的百分比&#xff0c;使用pytest-cov插件可以统计测试覆盖率 添加链接描述 安装插件pytest-cov pip install pytest-cov用法 基本用法 –cov的参数是要统计代码覆盖率的源码&#xff0c;我将源码放在mysrc中&#xff0c;test_s…

Kotlin的lateinit和by lazy的区别

一、lateinit1.lateinit的使用由于kotlin有严格的语法要求变量需要声明是否可以为null&#xff0c;但由于在实际的业务场景中&#xff0c;这个变量必须在某些时候才能做初始化操作&#xff0c;并且这个变量肯定不为null&#xff0c;如果为null&#xff0c;就是逻辑有问题了。这…

xilinx srio ip学习笔记之再识srio

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 xilinx srio ip学习笔记之再识srio前言SRIO的理解IP核的理解前言 这段时间&#xff0c;随着对SRIO的学习&#xff0c;又有了更深的一点认识&#xff0c;不像一开始这么慌张了…

nodejs——MongoDB模块

MongoDB 是一个面向文档&#xff0c;schema 无关&#xff08;schema-less&#xff09;的数据库&#xff0c;它非常适合于 Node.js 应用以及云端部署。 与 MySQL 及 PostgreSQL 是根据固定的结构设计&#xff08;schema&#xff09;将数据存储在表中不同&#xff0c;MongoDB 可以…

设计模式面试题

工厂模式是我们最常用的实例化对象模式了&#xff0c;是用工厂方法代替new操作的一种模式,工厂模式在Java程序中可以说是随处可见。本文来给大家详细介绍下工厂模式 面向对象设计的基本原则&#xff1a; OCP&#xff08;开闭原则&#xff0c;Open-Closed Principle&#xff0…

【Linux】 gcc 、动态库和静态库,程序是如何链接的

文章目录前言一、gcc 是什么&#xff1f;二、使用步骤1.预编译2.编译3.汇编4.链接三、动静态库1.概念2.区别前言 在Linux环境下&#xff0c;除了学好编辑器 vim 的使用&#xff0c;还需要学会C语言的编译器 gcc 的功能&#xff0c;否则代码无法翻译成可执行程序。本文将介绍 gc…

RK3588平台开发系列讲解(日志篇)RK3588 syslog的使用

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、查看是否启用syslog.conf二、配置启用syslog.conf1、配置busybox2、添加配置文件3、编译buildroot烧录三、验证1、编写测试代码2、查看日志文件3、运行测试程序沉淀、分享、成长,让自己和他人都能有所收获!😄 …

详解结构体内存对齐

目录 前言 一、结构体内存对齐规则 二、 offsetof 宏 三、结构体内存对齐的原因 四、 修改默认对齐数 前言 引入问题&#xff1a; #include <stdio.h>struct S {char c1;int i;char c2; };int main() {printf("%zd\n", sizeof(struct S));return 0; } 程…