Mybatis-Plus-快速整合

Mybatis-Plus

依赖
  • 依赖选择

    <!-- 最新版本 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.5</version>
    </dependency>
    
配置
分页
  • 分页拦截器配置

    @Configuration
    @MapperScan("scan.your.mapper.package")
    public class MybatisPlusConfig {
    
        /**
         * 添加分页插件
         */
        @Bean
        public MybatisPlusInterceptor mybatisPlusInterceptor() {
            MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
            interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加
            //interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbType
            return interceptor;
        }
    }
    
连接
  • 连接配置

    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/redis_api?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&useServerPrepStmts=true
        username: root
        password: root 
    
    # mybatis-plus 配置
    mybatis-plus:
      global-config:
        db-config:
          table-underline: false
      configuration:
        map-underscore-to-camel-case: true
        log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
      type-aliases-package: com.example.redisapi.domain
      mapper-locations: classpath:com/example/redisapi/mapper/*Mapper.xml
    
    
自动填充
  • 实现

    @Slf4j
    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
    
        @Override
        public void insertFill(MetaObject metaObject) {
            log.info("start insert fill ....");
            // 或者
            this.strictInsertFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)   
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            log.info("start update fill ....");
          this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class); // 起始版本 3.3.3(推荐)  
        }
    }
    
  • 实体类字段配置

    @TableName("sys_user")
    public class User {
        @TableId(value="id",type=IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
        @TableField(.. fill = FieldFill.INSERT_UPDATE)
        private LocalDateTime createTime;
        @TableField(.. fill = FieldFill.INSERT)
        private LocalDateTime updateTime;
    }
    
  • 框架自带,用于说明

    public enum FieldFill {
        /**
         * 默认不处理
         */
        DEFAULT,
        /**
         * 插入填充字段
         */
        INSERT,
        /**
         * 更新填充字段
         */
        UPDATE,
        /**
         * 插入和更新填充字段
         */
        INSERT_UPDATE
    }
    
Mapper
  • 实现方式

    public interface UserMapper extends BaseMapper<User> {
    
    }
    
Service
  • 接口

    public interface LoginService {
        ResultVO<String> login(String username, String password) throws JsonProcessingException;
    }
    
    
  • 实现类方式

    @Service
    public class LoginServiceImpl extends ServiceImpl<LoginMapper, Login>
            implements LoginService {
        
    }
    
主键自增配置
  • 在实体类的id列标注

    @TableName("sys_user")
    public class User {
        @TableId(value="id",type=IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
    }
    

    注意: 如果出现配置了数据库的自动增长,出现一段很长的数据时,需要通过show create table xxx,先备份原有的数据,这时,在表结构上可能会出现自增的起始id值,只要将这个值删除即可,就会按照数据库表中的最后一个值进行数据自增。

逻辑删除
  • 数据库字段id_deleted

  • 实体类字段通过注解映射

    @TableName("sys_user")
    public class User {
        @TableId(value="id",type=IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        private String email;
        @TableLogic
        @TableField("is_deleted")
        private Integer deleted;
    }
    
分页实现
  • 自定义mapper方法实现分页

    • mapper

      IPage<UserVo> selectPageVo(IPage<?> page, Integer state);
      // or (class MyPage extends Ipage<UserVo>{ private Integer state; })
      MyPage selectPageVo(MyPage page);
      // or
      List<UserVo> selectPageVo(IPage<UserVo> page, Integer state);
      
    • xml

      <!-- 根据mapper 的返回,会自动拼接 limit -->
      <select id="selectPageVo" resultType="xxx.xxx.xxx.UserVo">
          SELECT id,name FROM user WHERE state=#{state}
      </select>
      
  • 调用方法

    @Override
    public ResultVO listProducts(ProductVO productVO) {
        LambdaQueryWrapper<Products> queryWrapper = new LambdaQueryWrapper<>();
        // 1: 名称
        queryWrapper.like(productVO.getName() != null, Products::getName, productVO.getName());
        queryWrapper.orderByAsc(Products::getPrice);
        
        // 这两部是实现分页的核心
        Page<Products> productsPage = new Page<>(productVO.getPageNum(), productVO.getPageSize());
        // pageInfo 是分页后的结果,用于直接返回到前端
        IPage<Products> pageInfo = productsMapper.selectPage(productsPage, queryWrapper);
        
        
        if (pageInfo != null) {
            return ResultVO.success("商品列表获取成功", pageInfo);
        }
        return ResultVO.fail("获取商品列表失败");
    }
    
  • 28
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值