MyBatis-Plus(SpringBoot版)学习第一讲:简介&入门案例

目录

[1. MyBatis-Plus简介](#1. MyBatis-Plus简介)

[1.1 简介](#1.1 简介)

[1.2 特性](#1.2 特性)

[1.3 支持的数据库](#1.3 支持的数据库)

[1.4 框架结构](#1.4 框架结构)

[1.5 代码及文档地址](#1.5 代码及文档地址)

[2. 入门案例](#2. 入门案例)

[2.1 开发环境](#2.1 开发环境)

[2.2 创建数据库及表](#2.2 创建数据库及表)

[1. 创建表](#1. 创建表)

[2. 添加数据](#2. 添加数据)

[2.3 创建SpringBoot工程](#2.3 创建SpringBoot工程)

[1. 初始化工程](#1. 初始化工程)

[2. 引入依赖](#2. 引入依赖)

[3. IDEA中安装lombok插件](#3. IDEA中安装lombok插件)

[2.4 编写代码](#2.4 编写代码)

[1. 配置application.yml](#1. 配置application.yml)

[2. 启动类](#2. 启动类)

[3. 添加实体](#3. 添加实体)

[4. 添加mapper](#4. 添加mapper)

[5. 测试](#5. 测试)

[6. 添加日志](#6. 添加日志)


1. MyBatis-Plus简介

1.1 简介

MyBatis-Plus (简称 MP)是一个 MyBatis 的增强工具 ,在 MyBatis 的基础上只做增强不做改变 ,为 简化开发、提高效率而生 。Mybatis-Plus提供了通用的Mapper和Service,可以在不编写任何SQL语句的前提下,快速的实现单表的增删改查(CURD),批量,逻辑删除,分页等操作。只要把MyBatis-Plus的特性到优秀插件,以及多数据源的配置进行详细讲解。

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。

1.2 特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.3 支持的数据库

任何能使用MyBatis进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下

1.4 框架结构

1.5 代码及文档地址

官方地址: http://mp.baomidou.com

代码发布地址:

Github: GitHub - baomidou/mybatis-plus: An powerful enhanced toolkit of MyBatis for simplify development

Gitee: mybatis-plus: mybatis 增强工具包,简化 CRUD 操作。 文档 http://baomidou.com低代码组件库 http://aizuda.com

文档发布地址: https://baomidou.com/pages/24112f


2. 入门案例

2.1 开发环境

IDE: idea 2017

JDK:JDK1.8

构建工具: maven 3.6.0

MySQL版本: MySQL 5.6 (mysql常用版本:5.6 5.7 8.0)

Spring Boot:2.7.4

MyBatis-Plus:3.5.1

2.2 创建数据库及表

1. 创建表

sql 复制代码
CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名 ',
`age` int(11) DEFAULT NULL COMMENT '年龄 ',
`email` varchar(50) DEFAULT NULL COMMENT '邮箱 ',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2. 添加数据

sql 复制代码
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

2.3 创建SpringBoot工程

1. 初始化工程

使用 Spring Initializr 快速初始化一个 Spring Boot 工程

2. 引入依赖

XML 复制代码
        <dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

3. IDEA中安装lombok插件


2.4 编写代码

1. 配置application.yml

java 复制代码
spring:
  # 配置数据源信息
  datasource:
    # 配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource
    # 配置连接数据库信息
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
    username: root
    password: 2020

相关解释 :

数据库连接池

Spring Boot 1.x 版本默认的数据库连接池是 org.apache.tomcat.jdbc.pool.DataSource。在 Spring Boot 2.x 版本及以后,默认的数据库连接池是 com.zaxxer.hikari.HikariDataSource

驱动类

在 MySQL 5.x 版本中,推荐使用的 JDBC 驱动类是 com.mysql.jdbc.Driver。不过从 MySQL Connector/J 5.1.47 版本开始,官方更推荐使用 com.mysql.cj.jdbc.Driver 这个新的驱动类。

而到了 MySQL 8.0 版本,com.mysql.jdbc.Driver 被标记为已过时,官方只支持使用

com.mysql.cj.jdbc.Driver。

注意!!

1、驱动类driver-class-name

spring boot 2.0 (内置jdbc5驱动),驱动类使用:

java 复制代码
driver-class-name: com.mysql.jdbc.Driver

spring boot2.1及以上(内置jdbc8驱动),驱动类使用:

java 复制代码
driver-class-name: com.mysql.cj.jdbc.Driver

否则运行测试用例的时候会有 WARN 信息

2、连接地址url

MySQL5.7版本的url:

java 复制代码
jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false

MySQL8.0版本的url:

java 复制代码
jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false

否则运行测试用例报告如下错误:

java 复制代码
java.sql.SQLException: The server time zone value'Öйú±ê׼ʱ¼ä' is unrecognized or represents more

2. 启动类

在Spring Boot启动类中添加**@MapperScan**注解,扫描mapper包。

用途是扫描指定包路径下的 Mapper 接口,并且将这些接口自动注册为 Spring Bean。如此一来,你就能在服务层里直接注入这些 Mapper 接口,进而使用它们来操作数据库。

java 复制代码
@SpringBootApplication
@MapperScan("com.qcby.mybatisplus.mapper")
public class MybatisPlusApplication {

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

}

3. 添加实体

java 复制代码
@Data  //lombok注解
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
@ToString
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

快捷键:ctrl+F12 查看类结构。

只有**@Data**注解时,没有含参的构造器。

@AllArgsConstructor 注解可以自动为类生成一个包含所有成员变量的构造函数。

但是如果只加 @AllArgsConstructor 就没有无参的构造器了,需要再加一个**@NoArgsConstructor**,构造无参构造器。

@Getter注解,显然是构造访问器。

@Setter注解,构造更改器。

4. 添加mapper

BaseMapper 是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的 实体类型

java 复制代码
public interface UserMapper extends BaseMapper<User> {
}
java 复制代码
package com.baomidou.mybatisplus.core.mapper;

public interface BaseMapper<T> extends Mapper<T> {

    /**
    * 插入一条记录
    * @param entity 实体对象 */
    int insert(T entity);
    
    /**
    * 根据 ID 删除
    * @param id 主键ID */
    int deleteById(Serializable id);
    
    /**
    * 根据实体(ID)删除
    * @param entity 实体对象
    * @since 3.4.4 */
    int deleteById(T entity);
    
    /**
    * 根据 columnMap 条件,删除记录
    * @param columnMap 表字段 map 对象 */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
    /**
    * 根据 entity 条件,删除记录
    * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where
    语句)
    */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    /**
    * 删除(根据ID 批量删除)
    * @param idList 主键ID列表(不能为 null 以及 empty) */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    
    /**
    * 根据 ID 修改
    * @param entity 实体对象 */
    int updateById(@Param(Constants.ENTITY) T entity);
    
    /**
    * 根据 whereEntity 条件,更新记录
    * @param entity        实体对象 (set 条件值 ,可以为 null)
    * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成
    where 语句)
    */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
    
    /**
    * 根据 ID 查询
    * @param id 主键ID */
    T selectById(Serializable id);
    
    /**
    * 查询(根据ID 批量查询)
    * @param idList 主键ID列表(不能为 null 以及 empty) */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
    
    /**
    * 查询(根据 columnMap 条件)
    * @param columnMap 表字段 map 对象 */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
    
    /**
    * 根据 entity 条件,查询一条记录
    * <p>查询一条记录,例如 qw.last("limit 1") 限制取一条记录 , 注意:多条数据会报异常 </p>
    * @param queryWrapper 实体对象封装操作类(可以为 null)
    */
    default T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper) { List<T> ts = this.selectList(queryWrapper);
    if (CollectionUtils.isNotEmpty(ts)) {
    if (ts.size() != 1) {
    throw ExceptionUtils.mpe("One record is expected, but the query result is multiple records");
    }
    return ts.get(0);
    }
    return null;
    }
    
    /**
    * 根据 Wrapper 条件,查询总记录数
    * @param queryWrapper 实体对象封装操作类(可以为 null) */
    Long selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    /**
    * 根据 entity 条件,查询全部记录
    * @param queryWrapper 实体对象封装操作类(可以为 null) */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    /**
    * 根据 Wrapper 条件,查询全部记录
    * @param queryWrapper 实体对象封装操作类(可以为 null) */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    /**
    * 根据 Wrapper 条件,查询全部记录
    * <p>注意: 只返回第一个字段的值</p>
    * @param queryWrapper 实体对象封装操作类(可以为 null) */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    /**
    * 根据 entity 条件,查询全部记录(并翻页)
    * @param page         分页查询条件(可以为 RowBounds.DEFAULT)
    * @param queryWrapper 实体对象封装操作类(可以为 null) */
    <P extends IPage<T>> P selectPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
    
    /**
    * 根据 Wrapper 条件,查询全部记录(并翻页)
    * @param page         分页查询条件
    * @param queryWrapper 实体对象封装操作类 */
    <P extends IPage<Map<String, Object>>> P selectMapsPage(P page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

5. 测试

java 复制代码
@SpringBootTest
class MybatisPlusApplicationTests {

	@Autowired
	private UserMapper userMapper;

	@Test
	public void testSelectList(){
		//selectList()根据MP内置的条件构造器查询一个list集合,null表示没有条件,即查询所有
		userMapper.selectList(null).forEach(System.out::println);
	}

可以直接注入接口的原因是:

在测试类里注入 Mapper 接口时,实际上注入的是 MyBatis-Plus 为该接口生成的代理对象。MyBatis-Plus 会为扫描到的 Mapper 接口创建代理对象。这些代理对象实现了 Mapper 接口的方法,并且在方法调用时会和数据库进行交互。

结果

注意:

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

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

java 复制代码
@Repository
public interface UserMapper extends BaseMapper<User> {
}

原因:

在 Spring 框架里,@Repository 是一个重要的注解,它主要用于将一个类标记为数据访问层(DAO,Data Access Object)的组件。

@Repository 注解用于告诉 Spring 容器,被注解的类是一个数据访问对象,负责与数据库、文件系统等数据源进行交互。Spring 会自动将这个类注册为一个 Bean,这样你就可以在其他组件中通过依赖注入的方式使用它。

6. 添加日志

在application.yml中配置日志输出

java 复制代码
# 配置MyBatis日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

可以看到执行的sql语句。

相关推荐
梦幻精灵_cq27 分钟前
三个print优雅打印datetime模块的“时间密码”
学习
潘多编程2 小时前
实战指南:使用 OpenRewrite 将 Spring Boot 项目从 JDK 8 升级到 JDK
java·spring boot·elasticsearch
QQ828929QQ2 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
suuijbd2 小时前
Java实习生面试题(2025.3.23 be)
spring·面试·vue·mybatis
LN花开富贵2 小时前
【单片机通信技术应用——学习笔记三】液晶屏显示技术,取模软件的应用
笔记·stm32·单片机·嵌入式硬件·学习
武昌库里写JAVA3 小时前
Vue3生态工具:Volar语言服务与Unplugin自动化导入配置
vue.js·spring boot·毕业设计·layui·课程设计
李白的粉3 小时前
基于springboot的地方美食分享网站(全套)
java·spring boot·毕业设计·课程设计·美食·源代码
addaduvyhup3 小时前
从 Java 的 Spring Boot MVC 转向 Go 语言开发的差异变化
java·spring boot·go·mvc
执念斩长河4 小时前
go-zero学习笔记
笔记·学习·golang
计算机-秋大田4 小时前
基于Spring Boot的产业园区智慧公寓管理系统的设计与实现(LW+源码+讲解)
java·vue.js·spring boot·后端·课程设计