MybatisPlus+Springboot的精简使用

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
多表联合查询
  1. 编写对应的实体类
  2. xml编写sql语句
  3. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值