当前位置: 首页 > news >正文

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

目录

1. MyBatis-Plus简介

1.1 简介

1.2 特性

1.3 支持的数据库

 1.4 框架结构

1.5 代码及文档地址

2. 入门案例

2.1 开发环境

2.2 创建数据库及表

 1. 创建表

2. 添加数据

2.3 创建SpringBoot工程

1. 初始化工程

 2. 引入依赖

 3. IDEA中安装lombok插件

​编辑

2.4 编写代码 

1. 配置application.yml

2. 启动类

3. 添加实体

4. 添加mapper

5. 测试

6. 添加日志

2.5 MapperScan和repository的区别


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

JDKJDK1.8

构建工具:  maven 3.6.0

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

Spring Boot2.7.4

MyBatis-Plus3.5.1

2.2 创建数据库及表

 1. 创建表

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. 添加数据

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.3 创建SpringBoot工程

1. 初始化工程

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

 

 2. 引入依赖

        <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

spring:# 配置数据源信息datasource:# 配置数据源类型type: com.zaxxer.hikari.HikariDataSource# 配置连接数据库信息driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=falseusername: rootpassword: 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驱动),驱动类使用:      

driver-class-name: com.mysql.jdbc.Driver

spring boot 2.1及以上(内置jdbc8驱动),驱动类使用:

driver-class-name: com.mysql.cj.jdbc.Driver

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

 2、连接地址url 

MySQL5.7版本的url

jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false

MySQL8.0版本的url

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

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

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

2. 启动类

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

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

        接口的代理实现类是由框架来提供的,所以我们需要配置一个单独扫描mapper的扫描器。

@SpringBootApplication
@MapperScan("com.qcby.mybatisplus.mapper")
public class MybatisPlusApplication {public static void main(String[] args) {SpringApplication.run(MybatisPlusApplication.class, args);}}

3. 添加实体

@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方法,泛型为操作的 实体类型

public interface UserMapper extends BaseMapper<User> {
}
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. 测试

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

jdk1.8的输出格式 

userMapper.selectList(null).forEach(System.out::println);

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

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

结果

 注意:

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

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


@Repository
public interface UserMapper extends BaseMapper<User> {
}

 原因:

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

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

6. 添加日志

application.yml中配置日志输出

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

可以看到执行的sql语句。

2.5 MapperScan和repository的区别

  接口的代理实现类是由框架来提供的,所以我们需要配置一个单独扫描mapper的扫描器。

@MapperScan是 MyBatis-Spring 框架里的注解。MyBatis 是一个优秀的持久层框架,而 MyBatis-Spring 则让 MyBatis 能更好地集成到 Spring 框架中。

        作用:它的作用是扫描指定包下的所有接口,并把这些接口自动注册为 MyBatis 的 Mapper Bean。这样一来,我们就无需在每个 Mapper 接口上单独添加@Mapper注解了。

@Repository是 Spring 框架自带的注解。

        将类(这个接口的代理类)交给Spring去管理,而这个代理类是由mybatisPlus(MyBatis的增强,还是MyBatis)实现的。管理着它的实现类,要是没有这个注解,就需要userMapperImpl,但是mybatisPlus框架都给提供了。

        如果不加,他会报波浪线,但是不出错。

        如果这个接口有很多实现类,加了@Repository注解,就明确告诉它,用的是框架提供的实现类。


http://www.mrgr.cn/news/96118.html

相关文章:

  • vue vue3 走马灯Carousel
  • 高性能 Android 自定义 View:数据渲染与事件分发的双重优化
  • QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤
  • 自动化测试selenium(Java版)
  • Java基础关键_029_线程(二)
  • Vue3 项目通过 docxtemplater 插件动态渲染 .docx 文档(带图片)预览,并导出
  • linux - centos7 部署 redis6.0.5
  • Echarts使用
  • 字节跳动前端开发实习生面试总结
  • 蓝桥杯高频考点——二分(含C++源码)
  • QT自运行程序
  • 海康HTTP监听报警事件数据
  • Docker+Ollama+Xinference+RAGFlow+Dify+Open webui部署及踩坑问题
  • 2.4 Gannt图【甘特图】
  • EMQX Dashboard
  • 运行前端项目报错解决方法
  • 计算机组成原理的学习day01
  • 【悲观锁和乐观锁有什么区别】以及在Spring Boot、MybatisPlus、PostgreSql中使用
  • 蓝桥杯 第十二天 819 递增序列
  • el-table单元格编辑,动态增删行,回车/上下左右箭头切换单元格