如何利用Spring Boot整合MyBatis-Plus框架
一. 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依赖。
编写实体类
在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了吗?
相关推荐HOT
更多>>如何添加Java环境变量?
要添加Java环境变量,可以按照以下步骤:并安装Java开发工具包(JDK)、找到Java安装路径、设置JAVA_HOME环境变量、添加Java可执行文件路径到PATH...详情>>
2023-05-04 11:00:56从零开始学Java之String字符串的编码
对很多小白来说,可能不明白什么是字符编码,也不知道为什么要有字符编码,所以先来给大家简要地介绍一下字符编码。详情>>
2023-05-04 10:21:02新手速来!几步带你掌握MyBatis Plus
Mybatis-Plus(简称MP)是一款Mybatis的增强工具,它是在Mybatis的基础上实现的简化开发工具。Mybatis-Plus给我们提供了开箱即用的CRUD操作、自动...详情>>
2023-04-28 10:57:09学习java需要什么基础?基础知识有哪些?
网络编程:了解基本的网络编程概念和协议,熟悉 Java 网络编程 API。建议在学习 Java 之前,先学习一些基础的编程语言,如 C 或 Python 等,这...详情>>
2023-04-28 10:41:14