千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:重庆千锋IT培训  >  技术干货  >  如何利用Spring Boot整合MyBatis-Plus框架

如何利用Spring Boot整合MyBatis-Plus框架

来源:千锋教育
发布人:lxl
时间: 2023-04-04 14:15:11

  一. MyBatis-Plus简介

  MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。MP的愿景是成为MyBatis最好的搭档,就像魂斗罗中的1P、2P,基友搭配,效率翻倍。

  特性

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

  损耗小:启动即会自动注入基本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操作智能分析阻断,也可自定义拦截规则,预防误操作。

  2. 支持数据库

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

  MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb。

  达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据库,瀚高数据库。

  二. 使用Spring Boot整合MyBatis-Plus

  MyBatis-Plus部署配置

  1.1 引入依赖

  在pom.xml文件中添加Mybatis-Plus依赖。

 

整合MyBatis-Plus框架

  编写实体类

  在springbootdata数据库中创建products商品信息表并插入数据。

  CREATE TABLE t_product (

  id INT PRIMARY KEY AUTO_INCREMENT,

  name VARCHAR(50), #商品名称

  price DOUBLE,

  flag VARCHAR(2), #上架状态

  goods_desc VARCHAR(100), #商品描述

  images VARCHAR(400), #商品图片

  goods_stock INT, #商品库存

  goods_type VARCHAR(20), #商品类型

  created_user VARCHAR(20) COMMENT '日志-创建人',

  created_time DATETIME COMMENT '日志-创建时间',

  modified_user VARCHAR(20) COMMENT '日志-最后修改执行人',

  modified_time DATETIME COMMENT '日志-最后修改时间'

  );

  INSERT INTO t_product VALUES (

  NULL,

  'HUAWEI P60',

  6999,

  '1',

  '华为P60 5G手机 分期 麒麟990 晨曦金 8+256GB',

  'https://img14.360buyimg.com/5f4da578E7c6efde1/2cd53a53083ab2ed.jpg',

  99,

  '1',

  'admin',

  '2022-11-04 15:46:55',

  'Tom',

  '2022-11-04 15:46:55');

  在com.cy.domain包下创建Product实体类。

  package com.cy.domain;

  import com.baomidou.mybatisplus.annotation.IdType;

  import com.baomidou.mybatisplus.annotation.TableField;

  import com.baomidou.mybatisplus.annotation.TableId;

  import com.baomidou.mybatisplus.annotation.TableName;

  import lombok.Data;

  import java.io.Serializable;

  import java.util.Date;

  @Data

  @TableName("t_product") // 表明注解,标识实体类对应的表

  public class Product implements Serializable {

  @TableId(type = IdType.AUTO) // 注解注解

  private Integer id;

  private String name;

  private double price;

  private String flag;

  // @TableField("goods_desc") // 字段注解(非主键)

  private String goodsDesc;

  private String images;

  private long goodsStock;

  private String goodsType;

  private String createdUser;

  private Date createdTime;

  private String modifiedUser;

  private Date modifiedTime;

  }

  定义Mapper

  在com.cy.mapper包下创建ProductMapper接口并继承BaseMapper接口。

  package com.cy.mapper;

  import com.baomidou.mybatisplus.core.mapper.BaseMapper;

  import com.cy.domain.Product;

  import org.apache.ibatis.annotations.Mapper;

  @Mapper

  public interface ProductMapper extends BaseMapper{

  }

  MyBatis-Plus的Mapper层接口需要配置扫描,配置方式有两种:

  直接在Mapper层使用@Mapper注解修饰Mapper接口。

  在项目的启动类上添加@MapperScan("com.cy.mapper")包扫描。

  1.3 配置properties

  在application.properties配置文件中将原有的MyBatis配置删除,改写为MyBatis-Plus的配置。

  # 开启驼峰命名匹配映射

  # mybatis.configuration.map-underscore-to-camel-case=true

  # 配置MyBatis的XML配置文件位置

  # mybatis.mapper-locations=classpath:mapper/*.xml

  # 配置XML映射文件中指定的实体类别名路径

  # mybatis.type-aliases-package=com.cy.domain

  # 输出SQL语句

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

  # 配置MyBatis的XML配置文件位置

  mybatis-plus.mapper-locations=classpath:mapper/*.xml

  # 配置XML映射文件中指定的实体类别名路径

  mybatis-plus.type-aliases-package=com.cy.domain

  说明:MyBatis-Plus默认开启了驼峰命名匹配映射。

  2. MyBatis-Plus增删改查操作

  2.1 新增数据操作

  在com.cy测试包下编写MyBatisPlusTests测试类,并添加插入数据操作的测试方法。

  package com.cy;

  import com.cy.domain.Product;

  import com.cy.mapper.ProductMapper;

  import org.junit.jupiter.api.Test;

  import org.springframework.beans.factory.annotation.Autowired;

  import org.springframework.boot.test.context.SpringBootTest;

  @SpringBootTest

  public class MyBatisPlusTests {

  @Autowired

  private ProductMapper productMapper;

  @Test

  public void test01() {

  Product product = new Product();

  product.setName("小米手机");

  product.setPrice(2999.0);

  product.setFlag("1");

  product.setGoodsDesc("骁龙8+ 旗舰处理器 | 徕卡光学镜头 | 徕卡原生双画质 | 大师镜头包");

  productMapper.insert(product);

  }

  }

  2.2 删除数据操作

  @Test

  public void test02() {

  int row = productMapper.deleteById(1);

  System.out.println("row = " + row);

  }

  @Test

  public void test03() {

  ArrayListids = new ArrayList<>(){{

  add(2);

  add(3);

  add(4);

  }};

  int row = productMapper.deleteBatchIds(ids);

  System.out.println("row = " + row);

  }

  @Test

  public void test04() {

  Map<string, object=""> columnMap = new HashMap<>(){{

  put("name", "小米");

  put("price", 1999);

  }};

  int row = productMapper.deleteByMap(columnMap);

  System.out.println("row = " + row);

  }

  @Test

  public void test05() {

  // 条件构造器

  UpdateWrapperqueryWrapper = new UpdateWrapper<>();

  queryWrapper.gt("price", 2000).or().likeRight("name", "小米");

  int row = productMapper.delete(queryWrapper);

  System.out.println("row = " + row);

  }

  2.3 修改数据操作

  @Test

  public void test06() {

  Product product = new Product();

  product.setId(3);

  product.setName("小米");

  product.setPrice(1999);

  int row = productMapper.updateById(product);

  System.out.println("row = " + row);

  }

  @Test

  public void test07() {

  Product product = new Product();

  product.setId(3);

  // 条件构造器

  UpdateWrapperupdateWrapper = new UpdateWrapper<>();

  // set():设置更新SQL的SET片段,ge():大于等于

  updateWrapper.set("name", "小米Pro").set("price", 3999).ge("goods_stock", 10);

  int row = productMapper.update(product, updateWrapper);

  System.out.println("row = " + row);

  }

  2.4 查询数据操作

  2.4.1 条件查询

  根据指定的限定条件进行数据查询操作。

  @Test

  public void test09() {

  Listids = new ArrayList<>() {{

  add(2);

  add(3);

  add(4);

  }};

  productMapper.selectBatchIds(ids).forEach(System.out::println);

  }

  @Test

  public void test10() {

  // 条件构造器

  QueryWrapperqueryWrapper = new QueryWrapper<>();

  // gt()大于,eq()等于

  queryWrapper.gt("goods_stock", 10).eq("name", "小米");

  Listproducts = productMapper.selectList(queryWrapper);

  products.forEach(System.out::println);

  }

  2.4.2 分页查询

  进行单表的条件查询并实现分页。

  第一步先配置分页插件。Mybatis-Plus框架是通过拦截器实现分页的。

  package com.cy.config;

  import com.baomidou.mybatisplus.annotation.DbType;

  import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;

  import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;

  import org.springframework.context.annotation.Bean;

  import org.springframework.context.annotation.Configuration;

  /** 分页插件配置(必须) */

  @Configuration

  public class MyBatisPlusConfig {

  /** Mybatis-Plus拦截器 */

  @Bean

  public MybatisPlusInterceptor mybatisPlusInterceptor() {

  // 创建Mybatis-Plus拦截器对象

  MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();

  // 创建分页内部拦截器对象,并指定数据库类型

  PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);

  // 在Mybatis-Plus拦截器对象上绑定分页内部拦截器对象

  mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);

  // 返回Mybatis-Plus拦截器对象

  return mybatisPlusInterceptor;

  }

  }

  第二步在MyBatisPlusTests类中添加单表条件分页查询的测试方法。

  // 单表的条件 + 分页查询

  @Test

  public void test11() {

  // 分页信息

  // IPagepage = new Page<>();

  IPagepage = new Page<>(1, 3);

  // 条件构造器

  QueryWrapperqueryWrapper = new QueryWrapper<>();

  queryWrapper.like("name", "小米");

  IPagepageInfo = productMapper.selectPage(page, queryWrapper);

  // 取分页的信息

  long total = pageInfo.getTotal(); // 总记录数

  System.out.println("total=" + total);

  long pages = pageInfo.getPages(); // 总页数

  System.out.println("pages=" + pages);

  // 当前页数据

  pageInfo.getRecords().forEach(System.out::println);

  }

  3. MyBatis-Plus复杂查询

  3.1 添加查询

  MetaObjectHandler接口是Mybatis-Plus为我们提供的的一个扩展接口,我们可以利用这个接口在我们插入或者更新数据的时候,为一些字段指定默认值。

  在实体类中添加@TableField注解。

  FieldFill.INSERT:表示只是插入时生效。

  FieldFill.INSERT_UPDATE:表示插入和更新时生效。

  @Data

  @TableName("t_product") // 表明注解,标识实体类对应的表

  public class Product implements Serializable {

  // ...

  @TableField(fill = FieldFill.INSERT)

  private Date createdTime;

  @TableField(fill = FieldFill.INSERT_UPDATE)

  private Date modifiedTime;

  }

  在项目的com.cy.config包下创建MyMetaObjectHandler类实现MetaObjectHandler接口,并添加@Component注解。

  package com.cy.config;

  import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;

  import org.apache.ibatis.reflection.MetaObject;

  import org.springframework.stereotype.Component;

  import java.util.Date;

  @Component

  public class MyMetaObjectHandler implements MetaObjectHandler {

  @Override

  public void insertFill(MetaObject metaObject) {

  this.strictInsertFill(metaObject, "createdTime", Date.class, new Date()); // 起始版本3.3.0(推荐使用)

  this.strictInsertFill(metaObject, "modifiedTime", Date.class, new Date()); // 起始版本3.3.0(推荐使用)

  }

  @Override

  public void updateFill(MetaObject metaObject) {

  this.strictUpdateFill(metaObject, "modifiedTime", Date.class, new Date()); // 起始版本3.3.0(推荐)

  }

  }

  然后在MyBatisPlusTests测试类中添加测试方法。

  @Test

  public void test12() {

  Product product = new Product();

  product.setName("小米手机");

  product.setPrice(2999.0);

  product.setFlag("1");

  productMapper.insert(product);

  }

  @Test

  public void test13() {

  Product product = new Product();

  product.setId(1);

  product.setName("小米");

  product.setPrice(1999);

  int row = productMapper.updateById(product);

  System.out.println("row = " + row);

  }

  3.2 自定义查询

  通过LambdaUpdateChainWrapper类和LambdaQueryChainWrapper类(Lambda更新链包装器和Lambda查询链包装器)实现自定义条件查询。

  @Test

  public void test14() {

  LambdaUpdateChainWrapperupdateChainWrapper = new LambdaUpdateChainWrapper<>(productMapper);

  updateChainWrapper.set(Product::getName, "小米Max Pro").set(Product::getPrice, 3999).eq(Product::getId, 2).update();

  }

  @Test

  public void test15() {

  LambdaUpdateChainWrapperupdateChainWrapper = new LambdaUpdateChainWrapper<>(productMapper);

  updateChainWrapper.eq(Product::getId, 2).remove();

  }

  @Test

  public void test16() {

  LambdaQueryChainWrapperqueryChainWrapper = new LambdaQueryChainWrapper<>(productMapper);

  queryChainWrapper.like(Product::getName, "小米").list().forEach(System.out::println);

  }

  现在你知道在SpringBoot中怎么整合Mybatis-Plus了吗?

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

java的输入语句—— Scanner类

2023-05-04

java数据库操作常识事务的四大特性

2023-05-04

DML数据操作之增加或删除数据

2023-05-04

最新文章NEW

socket是什么?有什么作用?

2023-05-04

Java常量定义是什么

2023-04-28

一分钟带你学多线程

2023-04-28

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>