MybatisPlus--基础入门!真滴方便

目录

一、简介

2.特性

二、入门

1.创建springboot 项目(点击查看如何创建 )

注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题

2.数据准备

3.配置application.yml

4.代码

BaseMapper<>很重要!它封装了常用的 CRUD 操作

5.创建 测试类

三、主键策略&自动填充

1.自增策略

要想影响所有实体的配置,可以设置全局主键配置

2.自动填充

项目结构展示(还没写完)

三、MybatisPlus分页查询

 以下是完整的测试代码:


一、简介

Mybatis-Plus简称 MP 是一个mybatis的增强工具,在mybatis的基础上只做增强,不做改变,为简化开发 提高效率而生,MP 提供了代码生成器,可以一键生成controller service mapper model mapper.xml 代码,同时 提供丰富的CRUD 操作方法,非常方便我们操作

2.特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

  • 支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库

  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

  • 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动

  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

  • 支持关键词自动转义:支持数据库关键词(order、key......)自动转义,还可自定义关键词

  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

  • 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击

二、入门

1.创建springboot 项目(点击查看如何创建 )

# pom 文件 
<?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.2.10.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhp</groupId>
    <artifactId>sbdemo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sbdemo1</name>
    <description>sbdemo1</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>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--mysql-->
        <dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!--使用lombok 记得装插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>


        <!--mybatis-plus-->
       <dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.2</version>
		</dependency>


		<!--mybatis-plus代码生成器-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-generator</artifactId>
			<version>3.3.2</version>
		</dependency>
		<!--模板   代码生成器需要使用模板进行生成-->
		<dependency>
			<groupId>org.apache.velocity</groupId>
			<artifactId>velocity</artifactId>
			<version>1.7</version>
		</dependency>
		
		<!--mybatis-plus 扩展插件  比如  分页插件依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-extension</artifactId>
			<version>3.4.2</version>
		</dependency>


    </dependencies>

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

</project>

注意:引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 MyBatis-Spring,以避免因版本差异导致的问题

2.数据准备

创建数据 库  创建User 表

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');

3.配置application.yml

# 数据库地址
datasource:
  url: localhost:3306/java

spring:
  #  profiles:
  #    active: dev
  #数据库的配置
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://${datasource.url}?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true
    username: root
    password: 123456

#mp的配置
mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: 1
      logic-not-delete-value: 0
      id-type: auto  # 设置全局主键自增

  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl        #  查看sql输出日志
    map-underscore-to-camel-case: true              # 驼峰命名规范   stu_name stuName
  mapper-locations: classpath:mapper/*.xml   # 指定映射文件所在位置
  #  指定别名设置的包
  type-aliases-package: com.zhp.sbdemo1.pojo

# 查看sql语句的日志
logging:
  level:
    com.zhp.sbdemo1.mapper: debug
server:
  port: 8888

4.代码

# 1.启动类
#启动类添加 @MapperScan 注解  ,扫描mapper 包下的接口

/**
 * 这类也算是 配置类
 *
 * @SpringBootConfiguration
 * @EnableAutoConfiguration
 *
 * 1.添加mp依赖
 * 2.在 application.yml 中配置
 * 3.创建mapper 继承BaseMapper接口,这个接口封装了常用的增删改查方法,可以直接调用
 * */
@SpringBootApplication  // 忽略数据源的自动配置
@MapperScan("com.zhp.sbdemo1.mapper")
public class Sbdemo1Application {
    public static void main(String[] args) {
        SpringApplication.run(MybatisPlusApplication.class, args);
    }

}

#2.实体类  在pojo 下 创建User.java  使用lombok 简化代码
@Data
public class User {
    //@TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

#3. 创建mapper 包  创建UserMapper 接口 UserMapper.java
@Repository
public interface UserMapper extends BaseMapper<User> {
}

BaseMapper<>很重要!它封装了常用的 CRUD 操作

* 1.公共的方法进行抽取,抽取到BaseMapper接口中,将用户操作的方法对象,转化为数据库能够识别的SQL语句
* 2.通过userMapper查找父级接口BaseMapper
* 3.根据BaseMapper查找泛型对象User对象
* 4.根据user对象查找指定的注解@TableName,获取表名,默认是匹配和实体类名字一样的表,
//@TableName("t_users")     // 指定插入到哪个表,不写就自动映射到数据库中与实体类名字相同的表中


* 5.根据user对象的属性,动态获取表中的字段
* 6.在获取字段的同时,获取属性的值,最后进行SQL的拼接
* 7.MP将拼接好的SQL交给Mybatis框架处理执行

注意:

IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。

为了避免报错,可以在 mapper 层 的接口上添加 @Repository 注

5.创建 测试类

@SpringBootTest
class UserMapperTest {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelectList() {

        //UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper
        //所以不填写就是无任何条件
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);
    }
}    

通过以上几个简单的步骤,我们就实现了 User 表的 基本查询 功能,甚至连 XML 文件都不用编写!

三、主键策略&自动填充

1.自增策略

要想主键自增需要配置如下主键策略

  • 需要在创建数据表的时候设置主键自增

  • 实体字段中配置 @TableId(type = IdType.AUTO)

// 使用 数据库的 自增策略       默认是 IdType.ID_WORKER    雪花算法生成的id
@TableId(type = IdType.AUTO)      
private Long id;

要想影响所有实体的配置,可以设置全局主键配置

application.yml中添加
#全局设置主键生成策略
mybatis-plus.global-config.db-config.id-type=auto

2.自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:

1.数据库表中添加自动填充字段

在User表中添加datetime类型的新的字段 create_time、update_time

2.实体上添加注解

@Data public class User { ......

@TableField(fill = FieldFill.INSERT) // 添加时 赋值 private Date createTime;

//@TableField(fill = FieldFill.UPDATE) 修改时 赋值

@TableField(fill = FieldFill.INSERT_UPDATE) // 添加 和 修改 都会赋值

private Date updateTime;

}

3.实现元对象处理器接口 注意:不要忘记添加 @Component 注解

@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("insert info ......");
        // 添加时填充
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
        // 添加 乐观锁的  默认值是 1
        this.setFieldValByName("version", 1, metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("update info ......");
        this.setFieldValByName("updateTime", new Date(), metaObject);

    }
}

项目结构展示(还没写完)

 

三、MybatisPlus分页查询

首先配置分页在配置类 MybatisPlusConfig 

@EnableTransactionManagement
@Configuration
@MapperScan("com.zhp.sbdemo1.mapper")
public class MybatisPlusConfig {

    // 配置这个拦截器 可以帮助我们实现 乐观锁、分页等功能
    @Bean
    public MybatisPlusInterceptor optimisticLockerInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

        // 添加分页拦截器  --- 分页插件
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInnerInterceptor);

        // 添加乐观锁拦截器 --- 乐观锁插件
        OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor = new OptimisticLockerInnerInterceptor();

        interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor);

        return interceptor;
    }

  

}

在controller方法中,先写上: Page<User> userPage = new Page<>(1,3);

 如果返回结果想要 对象:userPage = userMapper.selectPage(userPage, null);

 如果返回结果想要 集合

 // 封装 页码和每页的记录数
        Page userPage = new Page<User>(1,3);
        // 分页查询的方法
        Page<Map<String,Object>> page1 = userMapper.selectMapsPage(userPage, null);

 以下是完整的测试代码:

 @Test
    // 结果封装为 实体类对象 方式
// 结果为:   [User(id=1, name=小萝卜, password=123456), User(id=2, name=小溪, password=123, User(id=3, name=张小溪, password=222)]
    public void testSelectPage(){
        // 封装 页码和每页的记录数
        Page<User> userPage = new Page<>(1,3);
        // 分页查询的方法
        userPage = userMapper.selectPage(userPage, null);
        List<User> records = userPage.getRecords();
        System.out.println(records);
    }

    @Test
    // 结果封装为 键值(map) 方式
//  结果为: [{password=123456, name=小萝卜, id=1}, {password=123, name=小溪, id=2}, {password=222, name=张小溪, id=3}]
    public void testSelectMapsPage(){
        // 封装 页码和每页的记录数
        Page userPage = new Page<User>(1,3);
        // 分页查询的方法
        Page<Map<String,Object>> page1 = userMapper.selectMapsPage(userPage, null);
        List<Map<String, Object>> records = page1.getRecords();
        System.out.println(records);
    }

MybatisPlus分页查询就这么简单,直接两行搞定,不需要SQL因为BaseMapper帮你做了crud

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nacos注册中心源码分析一之服务注册、服务心跳

源码分析 nacos客户端注册分析 依赖包 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>Nacos的客户端是基于SpringBoot的自动装配实现的 看下依…

Java多线程基础

目录 一、线程的基本使用 &#xff08;一&#xff09;创建线程的两种方式 &#xff08;二&#xff09;线程简单案例&#xff08;Thread&#xff09; 问题&#xff1a;main函数与开启的线程是否是阻塞的&#xff0c;即线程运行时&#xff0c;main函数等待线程运行结束&#…

DOUBLETROUBLE 1

文章目录 DOUBLETROUBLE: 1实战演练一、前期准备1、相关信息 二、信息收集1、nmap探测目标靶机端口2、扫描目标网址目录3、访问网站&#xff0c;发现secret下有个图片4、将图片下载5、查看图片所含内容6、破解密码并查看7、登陆邮箱8、创建反弹shell9、上传反弹shell10、监听11…

失业五个月,终于有offer了!但这家公司的风评惨不忍睹,要接吗?

往年&#xff0c;程序员们找工作可以说是不怎么费力的&#xff0c;不少求职者还会比对几家offer&#xff0c;看薪酬、看加不加班、看通勤时间等等等等&#xff0c;最后选择自己最满意的那一家过去。 但是今年&#xff0c;情况确实完全不一样&#xff0c;用网友的话形容就是“往…

不同厂家对讲机耳塞耳挂/领夹型988对讲机如何写频改频点/频率能互相通信

988型号都是很多厂家代工出来的,代工出来默认的频点都不一样,有可能买回来的2个不同厂家生产的对讲机,这样它们要能通讯,必须要同频点才能互通,它一般出厂设定16个频道,长按+和-键来切换频道。 需要用到typeC 的写频线,其实是用CH430芯片的usb写频线,可以找厂家要写频线…

文件上传之,waf绕过(24)

上传参数名解析&#xff1a;明确哪些东西可以修改 content-disposition:一般可更改 表单的数据 name:表单参数值&#xff0c;不能更改 表单提交的值 filename&#xff1a;文件名&#xff0c;可以修改 上传的文件名 content-type&#xff1a;文件mime&#xff0c;…

数据库索引结构(1)概念

常见的索引 主键和二级索引 MySQL学习笔记-主键索引和二级索引_mysql中主键索引和二级索引的区别_爱因诗贤的博客-CSDN博客 MYSQL-主键索引与二级索引_mysql二级索引存在哪个文件_青苔小榭的博客-CSDN博客 采用主键索引的好处&#xff1a;如果元素的位置发生修改&#xff0c;那…

【随笔记】全志 T507 PF4 引脚无法被正常设置为中断模式的问题分析

相关信息 硬件平台&#xff1a;全志T507 系统版本&#xff1a;Android 10 / Linux 4.9.170 问题描述&#xff1a;PF4 无法通过标准接口设置为中断模式&#xff0c;而 PF1、PF2、PF3、PF5 正常可用。 分析过程 一开始以为是引脚被其它驱动占用引起&#xff0c;或者该引脚不具…

Mybatis中处理特殊SQL处理逻辑

文章目录 0、前言1、模糊查询2、动态表名3、获取自增的组件4、批量删除 0、前言 在MyBatis中可能会有一些特殊的SQL需要去执行&#xff0c;一般就是模糊查询、批量删除、动态设置表名、添加功能获取自增的主键这几种&#xff0c;现在分别来进行说明。 为了方便演示 &#xff0…

OA管理痛点解决:从“硬编码”到“低代码”

低代码开发平台是一种逐渐流行起来的软件开发方式&#xff0c;它可以以快速且简单的方式构建各种应用程序&#xff0c;从而帮助企业快速响应市场变化和满足不断变化的业务需求。在企业的日常管理工作中&#xff0c;OA系统是一种非常常见的应用程序&#xff0c;它可以帮助企业管…

C++每日一练:饿龙咆哮-逃离城堡(避坑指南)非负整数求和

文章目录 前言一、题目二、解题代码及思路1、思路2、代码 三、非负整数求和总结 前言 饿龙这一题要说难度嘛&#xff0c;还真是挺简单的&#xff0c;但要满分也是有坑的&#xff01;本文就记录了笔者解题过程&#xff0c;希望能对读者使用C编程有所启发。至于非负整数求和代码…

redis高级篇三(分片集群)

一)进行测试Sentinel池: 集群的定义:所谓的集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态 之前的哨兵模式是存在着一些问题的&#xff0c;因为如果主节点挂了&#xff0c;那么sentinel集群会选举新的s…

斯坦福、Nautilus Chain等联合主办的 Hackathon 活动,现已接受报名

由 Stanford Blockchain Accelerator、Zebec Protocol、 Nautilus Chain、Rootz Lab 共同主办的黑客松活动&#xff0c;现已接受优秀项目提交参赛申请。 在加密行业发展早期&#xff0c;密码极客们就始终在对区块链世界基础设施&#xff0c;在发展方向的无限可能性进行探索。而…

如何用Python进行屏幕录制?

文章目录 引言gpt3.5给出的代码更换截图函数——ImageGrab.grab禁用imshow解决递归现象摄像头录制代码后期需求 引言 关于屏幕录制这个功能需求&#xff0c;之前用过基于ffmpeg的Capture录屏软件&#xff0c;但是fps拉高以后会变得很卡&#xff0c;声音也同样出现卡顿。也自己…

nodej+vues汽车销售4s店服务平台商城系统购物车积分兑换7z9d2

在经济快速发展的带动下&#xff0c;汽车服务平台的发展也是越来越快速。用户对汽车服务信息的获取需求很大。在互联网飞速发展的今天&#xff0c;制作一个汽车服务平台系统是非常必要的。本系统是借鉴其他人的开发基础上&#xff0c;用MySQL数据库和nodejs定制了汽车服务平台系…

【MySQL】事务

事务是一组操作的集合,我们将一组操作视为一个整体,所以事务里面的操作的时候要么同时成功,要么同时失败,之所以会有事务也是因为我们在实际生活中会用到 最典型的例子就是转账操作:A向B进行转账,A这边扣款成功的同时B那边一定是收款成功的,如果没有事务的话就会出现A扣款成功但…

LMS,RGB,XYZ色彩空间转换

前言 首先需要指明本文中描述的R,G,B并非通常的sRGB中的三个分量R,G,B&#xff0c;而是波长分别为700nm&#xff0c;546.1nm&#xff0c;435.8nm的单色红光&#xff0c;单色绿光&#xff0c;单色蓝光。sRGB中的RGB中的红色、绿色、蓝色已经不是单色光了。虽然习惯上大家都叫RGB…

网络安全里的主要岗位有哪些?小白如何快速入门?

入门Web安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等&#xff0c;每个不同的领域要掌握的技能也不同。 当然入门Web安全相对难度较低&#xff0c;也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447; 网…

SpringCloud微服务调用方式(RestTemplate)

服务调用方式 RPC和HTTP 无论是微服务还是SOA&#xff0c;都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢&#xff1f; 常见的远程调用方式有以下2种&#xff1a; RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&am…

learn C++ NO.4 ——类和对象(2)

1.类的6个默认成员函数 1.1.默认成员函数的概念 在 C 中&#xff0c;如果没有显式定义类的构造函数、析构函数、拷贝构造函数和赋值运算符重载函数&#xff0c;编译器会自动生成这些函数&#xff0c;这些函数被称为默认成员函数。 class Date { };初步了解了默认成员函数&am…
最新文章