MybatisPlus经典实用
MyBatisPlus简介
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生
本文将介绍mybatisplus+Springboot的精简使用
1.添加依赖
springboot版本最好不要使用最新的会有冲突 建议使用2.6.2
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatisplus依赖包含了mybatis依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<!--mybatisplus代码生成器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<!--velocity模板使用依赖-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<!--freemarker模板使用依赖-->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<!--lombok依赖使用-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</dependency>
Mybatis-Genetator启动器
适用版本:mybatis-plus-generator 3.5.1 及其以上版本,对历史版本不兼容!
package com.example.mybaisplus.utils;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import java.util.ArrayList;
import java.util.Collections;
/**
* mybatisPlus 的代码生成器
*/
public class MybatisPlusGenerator {
public static void main(String[] args) {
//获取项目路径
String path = System.getProperty("user.dir");
//添加表明
ArrayList<String> tables = new ArrayList<>();
tables.add("user_base_info");
tables.add("orders");
//数据库连接
FastAutoGenerator.create("jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimeZone=UTC","用户名","密码")
//全局配置
.globalConfig(builder -> {
builder.author("作者名")
//覆盖已生成文件
.fileOverride()
//指定输出目录
.outputDir(path+"/src/main/java")
//禁止打开输出目录
.disableOpenDir()
//日期格式
.dateType(DateType.ONLY_DATE);
})
//包配置
.packageConfig(builder -> {
//父包名
builder.parent("com.example")
//父包模块名
.moduleName("mybaisplus")
.entity("pojo")
.service("service")
.serviceImpl("service.impl")
.mapper("mapper")
.xml("mapper.xml")
.controller("controller")
//xml路径配置信息
.pathInfo(Collections.singletonMap(OutputFile.mapperXml, path+"/src/main/resources/mapper"));
})
//策略配置
.strategyConfig(builder -> {
builder.addInclude(tables)
.entityBuilder()
//开启 lombok 模型
.enableLombok()
//添加表字段填充
.addTableFills(new Column("create_time", FieldFill.INSERT))
.addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE))
.mapperBuilder()
.enableBaseResultMap()
.enableBaseColumnList()
//格式化文件名称
.formatMapperFileName("%sMapper")
.formatXmlFileName("%sMapper")
.controllerBuilder()
//开启生成@RestController 控制器
.enableRestStyle()
.formatFileName("%sController")
.serviceBuilder()
.formatServiceFileName("%sService")
.formatServiceImplFileName("%sServiceImp");
})
/*模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
.templateEngine(new BeetlTemplateEngine())
.templateEngine(new FreemarkerTemplateEngine())*/
.templateEngine(new FreemarkerTemplateEngine())
.execute();
}
}
效果
3.逻辑删除
配置1
mybatis-plus:
global-config:
db-config:
logic-delete-field: status # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
配置2 实体类字段上加上@TableLogic
注解
@TableLogic
private Integer status;
测试
@Test
void delete(){
int i = userBaseInfoMapper.deleteById(55l);
System.out.println(i);
}
==> Preparing: UPDATE user_base_info SET status='1' WHERE id=? AND status='0'
==> Parameters: 55(Long)
<== Updates: 1
实际上进行的是更新操作 另外查询的时候也会将删除表示自动添加上
4.自动填充功能
- 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler
- 注解填充字段
@TableField(.. fill = FieldFill.INSERT)
生成器策略部分也可以配置!
/**
* 创建时间
*注意!这里需要标记为填充字段
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 修改时间
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
自定义实现类 MyMetaObjectHandler
package com.example.mybaisplus.config;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.util.Date;
@Slf4j
@Component
public class MybatisPlusHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("insert");
this.setFieldValByName("createTime", new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("update");
this.setFieldValByName("updateTime",LocalDateTime.now(),metaObject);
}
}
测试
@Test
void insert(){
UserBaseInfo info = new UserBaseInfo();
info.setUsername("jhjhu");
info.setPwd("huhhjh");
info.setName("jhj");
int insert = userBaseInfoMapper.insert(info);
}
==> Preparing: INSERT INTO user_base_info ( name, username, pwd, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? )
==> Parameters: jhj(String), jhjhu(String), huhhjh(String), 2022-12-03 10:43:32.926(Timestamp), 2022-12-03 10:43:32.926(Timestamp)
<== Updates: 1
可以看到日期自动添加以及更新
5.分页插件
配置
package com.example.mybaisplus.configrator;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@MapperScan(value = "com.example.mybaisplus.mapper")
public class MybatisPlusConfg {
/**
* 分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
//<!-- 对于单一数据库类型来说,都建议配置该值,避免每次分页都去抓取数据库类型 -->
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
单表测试查询
@Test
void select(){
Page<UserBaseInfo> page = new Page<>(1,5);
QueryWrapper<UserBaseInfo> wrapper = new QueryWrapper<>();
wrapper.orderByDesc("create_time");
Page<UserBaseInfo> page1 = userBaseInfoMapper.selectPage(page, wrapper);
}
==> Preparing: SELECT COUNT(*) AS total FROM user_base_info WHERE status = '0'
==> Parameters:
<== Columns: total
<== Row: 13
<== Total: 1
==> Preparing: SELECT id,name,username,session_id,avatar,pwd,create_time,update_time,status FROM user_base_info WHERE status='0' ORDER BY create_time DESC LIMIT ?
==> Parameters: 5(Long)
<== Columns: id, name, username, session_id, avatar, pwd, create_time, update_time, status
<== Row: 56, jhj, jhjhu, null, null, huhhjh, 2022-12-03 10:43:33, 2022-12-03 10:43:33, 0
<== Row: 44, 15968191810, 15968191810, null, null, $2a$10$bFz8Q3iCi53.mJdoutgTD.IqtoQJ0UsjpPc/cccOVxfnj5ytvRSPi, 2021-06-15 11:46:26, 2021-06-15 11:59:59, 0
<== Row: 40, 测测, 13128751174, null, null, $2a$10$S7m8G7RJj/0OWN57XXYNB.0/d8JTz1LmhjMDnqtPbIWBRE7vDdVGq, 2021-05-27 15:13:51, null, 0
<== Row: 39, jdj, 18380173524, null, null, $2a$10$YwH1sJESmeOi.kUBT6CkbexVaxGw95b/i7xyPPX3kKFKBslY7FQou, 2021-05-26 14:50:51, null, 0
<== Row: 38, ***, 15713811999, null, null, $2a$10$G3/ErENfZu.W9p9ZIIN.7.Z4WaJbcLpd3k1hn1V6TerhAVvuV4ocm, 2021-05-21 23:43:32, null, 0
<== Total: 5
多表联合查询
- 编写对应的实体类
- xml编写sql语句
- mapper层添加对应的方法
package com.example.mybaisplus.entity;
import com.example.mybaisplus.pojo.Orders;
import lombok.Data;
@Data
public class UserOrders extends Orders {
private String userName;
}
<select id="getOrders" resultType="com.example.mybaisplus.entity.UserOrders">
select o.id, o.order_num, o.pay_ano, o.user_id, o.shop_id, o.shop_name, o.commodity_nums,
u.name userName from orders o left join user_base_info u on o.user_id=u.id
where o.user_id=#{userId}
</select>
mapper
List<UserOrders> getOrders(Page page, @Param("userId") Long userId);
测试
@Test
void selectOrders(){
Page<UserOrders> page = new Page<>(1,5);
List<UserOrders> orders = ordersMapper.getOrders(page, 36l);
orders.forEach(System.out::println);
}
==> Preparing: SELECT COUNT(*) AS total FROM orders o WHERE o.user_id = ?
==> Parameters: 36(Long)
<== Columns: total
<== Row: 47
<== Total: 1
==> Preparing: select o.id, o.order_num, o.pay_ano, o.user_id, o.shop_id, o.shop_name, o.commodity_nums, u.name userName from orders o left join user_base_info u on o.user_id=u.id where o.user_id=? LIMIT ?
==> Parameters: 36(Long), 5(Long)
<== Columns: id, order_num, pay_ano, user_id, shop_id, shop_name, commodity_nums, userName
<== Row: 160, 4008332049fe0df846eaabd769399359, 4009554577f46cc54ee8ba69a3f0efe9, 36, 18, ****, 1, ****
<== Row: 161, 4224927db7983f524be7b2aca3419b30, 44021f84e3c769fd4a3d97650592468d, 36, 18, ****, 1, ****
<== Row: 165, 2804af08244a74654cf4ac33f03c1ce1, null, 36, 18, ****, 1, ****
<== Row: 166, 28295565280dbfb5487e8de7e6709d69, 2831d9449fc3e37f42ceb23a33d33676, 36, 18, ****, 1, ****
<== Row: 167, 29471651808793da42d19bf838d31ffd, 2948851ed40c2bf84b63a901927e98ce, 36, 18, ****, 1, ****
<== Total: 5