MyBatis-Plus插件机制及通用Service新功能

目录
  • 1.高级(插件机制)
    • 1.1自动填充
      • 1.1.1 原理
      • 1.1.2 基本操作
    • 1.2乐观锁
      • 1.2.1 什么是乐观锁
      • 1.2.2. 实现
      • 1.2.3 注意事项
    • 1.3逻辑删除
      • 1.3.1 什么是逻辑删除
      • 1.3.2 实现
      • 1.3.3 注意
      • 1.3.4 全局配置
      • 1.3.5 恢复
  • 2.通用Service
    • 2.1分析 通用Service分析
    • 2.2基本使用 标准service:接口 + 实现
    • 2.3常见方法
  • 3.新功能
    • 3.1执行SQL分析打印
    • 3.2数据库安全保护

1.高级(插件机制)

1.1自动填充

项目中经常会遇到一些数据,每次都使用相同的方式填充,例如记录的创建时间,更新时间等。

我们可以使用MyBatis Plus的自动填充功能,完成这些字段的赋值工作:

1.1.1 原理

  • 实现元对象处理器接口:com.baomidou.mybatisplus.core.handlers.MetaObjectHandler,确定填充具体操作
  • 注解填充字段:@TableField(fill = ...) 确定字段填充的时机
  • FieldFill.INSERT:插入填充字段
  • FieldFill.UPDATE:更新填充字段
  • FieldFill.INSERT_UPDATE:插入和更新填充字段

1.1.2 基本操作

步骤一:修改表添加字段

alter table tmp_customer add column create_time date;
alter table tmp_customer add column update_time date;

步骤二:修改JavaBean

package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

import java.util.Date;

/**
 * Created by liangtong.
 */
@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;

    @TableField(value="create_time",fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(value="update_time",fill = FieldFill.UPDATE)
    private Date updateTime;

}

步骤三:编写处理类

package com.czxy.mp.handler;

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 {
    /**
     * 插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
    }

    /**
     * 更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

步骤四:测试

 @Test
    public void testInsert() {
        Customer customer = new Customer();
        customer.setCname("测试888");

        customerMapper.insert(customer);
    }

    @Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(11);
        customer.setTelephone("999");

        customerMapper.updateById(customer);
    }

1.2乐观锁

  • 基于数据库
  • 乐观锁:数据不同步不会发生。读锁。
  • 悲观锁:数据不同步肯定发生。写锁。

1.2.1 什么是乐观锁

  • 目的:数据必须同步。当要更新一条记录的时候,希望这条记录没有被别人更新
  • 乐观锁实现方式:

取出记录时,获取当前version

更新时,带上这个version

执行更新时, set version = newVersion where version = oldVersion

如果version不对,就更新失败

1.2.2. 实现

步骤:

  • 步骤1:环境准备(表version字段、JavaBean versoin属性、必须提供默认值)
  • 步骤2:使用乐观锁版本控制 @Version
  • 步骤3:开启乐观锁插件配置
  • 步骤一:修改表结构,添加version字段

  • 步骤二:修改JavaBean,添加version属性

package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

/**
 * Created by liangtong.
 */
@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;
}
  • 步骤三:元对象处理器接口添加version的insert默认值 (保证version有数据)

package com.czxy.mp.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by liangtong.
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);
    }

    /**
     * 更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

步骤四:修改 MybatisPlusConfig 开启乐观锁

package com.czxy.mp.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Created by liangtong.
 */
@Configuration
public class MybatisPlusConfig {
     */
    /**
     * 配置插件
     * @return
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){

        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 分页插件
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        // 乐观锁
        mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());

        return mybatisPlusInterceptor;
    }
}
  • 步骤五:测试

    • 先添加一条,保证version有数据
    • 在更新该条
 @Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(14);
        customer.setCname("测试999");
        // 与数据库中数据一致,将更新成功,否则返回失败。
        customer.setVersion(1);

        int i = customerMapper.updateById(customer);
        System.out.println(i);
    }

1.2.3 注意事项

支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime

整数类型下 newVersion = oldVersion + 1

newVersion 会回写到 entity

仅支持 updateById(id)update(entity, wrapper) 方法

update(entity, wrapper) 方法下, wrapper 不能复用!!!

数据库表的version字段,必须有默认值(SQL语句默认值、或MyBatisPlus自动填充)

在进行更新操作时,必须设置version值,否则无效。

1.3逻辑删除

1.3.1 什么是逻辑删除

逻辑删除,也称为假删除。就是在表中提供一个字段用于记录是否删除,实际该数据没有被删除。

1.3.2 实现

步骤:

步骤一:环境(表提供字段deleted、JavaBean属性 deleted、填充默认值0)

步骤二:修改JavaBean,添加注解 @TableLogic

步骤一:修改表结构添加deleted字段

步骤二:修改JavaBean,给deleted字段添加@TableLogic

package com.czxy.mp.domain;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

/**
 * Created by liangtong.
 */
@Data
@TableName("tmp_customer")
public class Customer {
    @TableId(type = IdType.AUTO)
    private Integer cid;
    private String cname;
    private String password;
    private String telephone;
    private String money;
    @Version
    @TableField(fill = FieldFill.INSERT)
    private Integer version;

    @TableLogic
    @TableField(fill = FieldFill.INSERT)
    private Integer deleted;
}

步骤三:添加数据时,设置默认“逻辑未删除值”

package com.czxy.mp.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * Created by liangtong.
 */
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    /**
     * 插入填充
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("version", 1, metaObject);
        this.setFieldValByName("deleted", 0, metaObject);
    }

    /**
     * 更新填充
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

步骤四:测试

  @Test
    public void testDelete() {
        // 删除时,必须保证deleted数据为“逻辑未删除值”
        int i = customerMapper.deleteById(12);
        System.out.println(i);
    }

1.3.3 注意

  • 如果使用逻辑删除,将delete语句,修改成了update,条件 where deleted=0
  • 同时,查询语句自动追加一个查询条件 WHERE deleted=0。如果查询没有数据,检查deleted字段的值。

1.3.4 全局配置

如果使用了全局配置,可以不使用注解@TableLogic

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted  # 局逻辑删除的实体字段名
      logic-delete-value: 1  # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

1.3.5 恢复

  • 问题:进行逻辑删除后的数据,如何恢复(recovery)?
  • 方案1:使用sql具有,更新deleted=0即可
UPDATE `tmp_customer` SET `deleted`='0' WHERE `cid`='13';

方案2:直接使用update语句,==不能==解决问题。

 @Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(13);
        customer.setDeleted(0);
        //更新
        customerMapper.updateById(customer);
    }

方案3:修改Mapper,添加 recoveryById 方法,进行数据恢复。

@Mapper
public interface CustomerMapper extends BaseMapper<Customer> {

    @Update("update tmp_customer set deleted = 0 where cid = #{cid}")
    public void recoveryById(@Param("cid") Integer cid);
}

2.通用Service

2.1分析 通用Service分析

2.2基本使用 标准service:接口 + 实现

service接口

package com.czxy.service;
  import com.baomidou.mybatisplus.extension.service.IService;
  import com.czxy.domain.Customer;
  public interface CustomerService extends IService<Customer> {
  }

service实现类

package com.czxy.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.czxy.domain.Customer;
import com.czxy.mapper.CustomerMapper;
import com.czxy.service.CustomerService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper,Customer> implements CustomerService {

}

2.3常见方法

  • 查询所有
  • 添加
  • 修改
  • 删除
package com.czxy.test;

import com.czxy.mp.Day62MybatisPlusApplication;
import com.czxy.mp.domain.Customer;
import com.czxy.mp.service.CustomerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Day62MybatisPlusApplication.class)
public class TestDay62CustomerService {

    @Resource
    private CustomerService customerService;

    @Test
    public void testSelectList() {
        List<Customer> list = customerService.list();
        list.forEach(System.out::println);
    }

    @Test
    public void testInsert() {
        Customer customer = new Customer();
        customer.setCname("张三");
        customer.setPassword("9999");
        // 添加
        customerService.save(customer);
    }

    @Test
    public void testUpdate() {
        Customer customer = new Customer();
        customer.setCid(14);
        customer.setCname("777");
        customer.setPassword("777");

        customerService.updateById(customer);
    }

    @Test
    public void testSaveOrUpdate() {
        Customer customer = new Customer();
        customer.setCid(15);
        customer.setCname("999");
        customer.setPassword("99");

        customerService.saveOrUpdate(customer);
    }

    @Test
    public void testDelete() {
        customerService.removeById(15);
    }
}

3.新功能

3.1执行SQL分析打印

该功能依赖 p6spy 组件,完美的输出打印 SQL 及执行时长

p6spy 依赖引入

<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.9.1</version>
</dependency>

核心yml配置

spring:
  datasource:
  	# p6spy 提供的驱动代理类,
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    # url 固定前缀为 jdbc:p6spy,跟着冒号为对应数据库连接地址
    url: jdbc:p6spy:mysql://127.0.0.1:3306...

spy.properties 配置

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

3.2数据库安全保护

为了保护数据库配置及数据安全,在一定的程度上控制开发人员流动导致敏感信息泄露

  • 步骤:
  • 步骤1:使用 AES 工具类,生成秘钥
  • 步骤2:使用 AES工具类,根据步骤1生成的秘钥对敏感信息进行加密
  • 步骤3:设置加密后的配置信息
  • 步骤4:启动服务时,使用秘钥

步骤1-2:使用工具类生成秘钥以及对敏感信息进行加密

package com.czxy;
import com.baomidou.mybatisplus.core.toolkit.AES;
import org.junit.Test;
public class TestAES {
    @Test
    public void testAes() {
        String randomKey = AES.generateRandomKey();

        String url =  "jdbc:p6spy:mysql://127.0.0.1:3306/zx_edu_teacher?useUnicode=true&characterEncoding=utf8";
        String username = "root";
        String password = "1234";

        String urlAES = AES.encrypt(url, randomKey);
        String usernameAES = AES.encrypt(username, randomKey);
        String passwordAES = AES.encrypt(password, randomKey);

        System.out.println("--mpw.key=" + randomKey);
        System.out.println("mpw:" + urlAES);
        System.out.println("mpw:" + usernameAES);
        System.out.println("mpw:" + passwordAES);
    }
}
// Jar 启动参数( idea 设置 Program arguments , 服务器可以设置为启动环境变量 )
//--mpw.key=fddd2b7a67460e16
//mpw:7kSEISvq3QWfnSh6vQZc2xgE+XF/sJ0WS/sgGkYpCOTQRjO1poLi3gfmGZNOwKzfqZUec0odiwAdmxcS7lfueENGIx8OmIe//d9imrGFpnkrf8jNSHdzfNPCUi3MbmUb
//mpw:qGbCMksqA90jjiGXXRr7lA==
//mpw:xKG9GABlywqar6CGPOSJKQ==

步骤3:配置加密信息

步骤4:使用秘钥启动服务

到此这篇关于MyBatis-Plus插件机制以及通用Service、新功能的文章就介绍到这了,更多相关MyBatis-Plus插件通用Service内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis-Plus分页插件不生效的解决方法

    描述 项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因了. 环境 <springboot.version>2.1.5.RELEASE</springboot.version> <mybatisplus.version>3.1.1</mybatisplus.version> 配置 1.自定义MybatisPlusConfig 配置分页插件 package com.eyela

  • MyBatis-Plus 通用IService使用详解

    一.引言 MP除了通用的Mapper还是通用的Servcie层,这也减少了相对应的代码工作量,把通用的接口提取到公共.其实按照MP的这种思想,可以自己也实现一些通用的Controller. 今天是周天,作为一名码农来说,这里小编提醒大家周末有空还是多出去运动一下. 生命在于运动,生命诚可贵. 二. 小编瞎扯 相信有和小编一样的朋友,在大城市独自漂泊,感觉就凭借自己内心那一点点的火苗,想要燃烧起来. 小编在上海这些年,不慌也不忙,从开始每天厌恶工作,到现在开开心心的上班,回顾自己的成长除了存款,其

  • Mybatis-Plus接口BaseMapper与Services使用详解

    最近在工作开发中遇到一个批量新增修改的处理,我使用的是 mybatis-plus,但是在用的 BaseMapper 接口里是没有这个方法的,后来发现 Service 接口里有这个方法,今天整理一下这2种用法. 一.使用 BaseMapper 接口 MyBatis Plus 提供了通用的 Mapper 接口(即 BaseMapper 接口),该接口对应我们的 DAO 层.在该接口中,定义了我们常见的方法签名,这样就可以方便我们对表进行操作.例如:查询(select).插入(insert).更新(u

  • mybatis-plus批处理IService的实现示例

    一.pom文件引入 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus

  • MyBatis-Plus通过插件将数据库表生成Entiry,Mapper.xml,Mapper.class的方式

    创建maven项目,修改pom.xml文件,如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://mave

  • 关于mybatis-plus插件使用时的一些问题小结

    目录 介绍 优点 我的感受 遇到的问题 返回的list只有数据库字段不含大写的属性 setDbColumnUnderline导致的字段不一致 总结 介绍 mybatis-plus是国内大牛在Mybatis3的基础上做了一些封装,简化了一些操作(分页,自动生成实体块等).是快速开发一个不错的工具插件. Mybatis 增强工具包 - 只做增强不做改变,简化CRUD操作 优点 纯正血统:完全继承原生 Mybatis 的所有特性最少依赖:仅仅依赖Mybatis以及Mybatis-Spring性能损耗小

  • Mybatis-plus配置分页插件返回统一结果集

    目录 一.MyBatisPlusConfig中配置分页插件 1. 分页实现的原理 二.统一结果集 1. 创建返回码定义类 2. 创建结果集类 三.编写分页接口 1. 先编写查询类 2. service层 3. controller层 4. 接口测试 总结 一.MyBatisPlusConfig中配置分页插件 /** * 配置分页插件 * @return page */ @Bean public PaginationInterceptor paginationInterceptor(){ Pagi

  • MyBatis-Plus插件机制及通用Service新功能

    目录 1.高级(插件机制) 1.1自动填充 1.1.1 原理 1.1.2 基本操作 1.2乐观锁 1.2.1 什么是乐观锁 1.2.2. 实现 1.2.3 注意事项 1.3逻辑删除 1.3.1 什么是逻辑删除 1.3.2 实现 1.3.3 注意 1.3.4 全局配置 1.3.5 恢复 2.通用Service 2.1分析 通用Service分析 2.2基本使用 标准service:接口 + 实现 2.3常见方法 3.新功能 3.1执行SQL分析打印 3.2数据库安全保护 1.高级(插件机制) 1.

  • MyBatis Plus插件机制与执行流程原理分析详解

    MyBatis Plus插件 MyBatis Plus提供了分页插件PaginationInterceptor.执行分析插件SqlExplainInterceptor.性能分析插件PerformanceInterceptor以及乐观锁插件OptimisticLockerInterceptor. Mybatis 通过插件 (Interceptor) 可以做到拦截四大对象相关方法的执行 ,根据需求完成相关数据的动态改变. 四大对象是: Executor StatementHandler Parame

  • mybatis的插件机制详解

    前言 Mybatis作为一个应用广泛的优秀的ORM框架,已经成了JavaWeb世界近乎标配的部分,这个框架具有强大的灵活性,在四大组件(Executor.StatementHandler.ParameterHandler.ResultSetHandler)处提供了简单易用的插件扩展机制.Mybatis对持久层的操作就是借助于四大核心对象.MyBatis支持用插件对四大核心对象进行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的动态代理实现的,换句话说

  • mybatis的插件机制示例详解

    前言 Mybatis作为一个应用广泛的优秀的ORM框架,已经成了JavaWeb世界近乎标配的部分,这个框架具有强大的灵活性,在四大组件(Executor.StatementHandler.ParameterHandler.ResultSetHandler)处提供了简单易用的插件扩展机制.Mybatis对持久层的操作就是借助于四大核心对象.MyBatis支持用插件对四大核心对象进行拦截,对mybatis来说插件就是拦截器,用来增强核心对象的功能,增强功能本质上是借助于底层的动态代理实现的,换句话说

  • MyBatis插件机制超详细讲解

    目录 MyBatis的插件机制 InterceptorChain MyBatis中的Plugin MyBatis插件开发 总结 MyBatis的插件机制 MyBatis 允许在已映射语句执行过程中的某一点进行拦截调用.默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) ParameterHandler(

  • 浅谈myBatis中的插件机制

    插件的配置与使用 在mybatis-config.xml配置文件中配置plugin结点,比如配置一个自定义的日志插件LogInterceptor和一个开源的分页插件PageInterceptor: <plugins> <plugin interceptor="com.crx.plugindemo.LogInterceptor"></plugin> <plugin interceptor="com.github.pagehelper.P

  • Android系统实现DroidPlugin插件机制

    360手机助手使用的 DroidPlugin,它是360手机助手团队在Android系统上实现了一种插件机制.它可以在无需安装.修改的情况下运行APK文件,此机制对改进大型APP的架构,实现多团队协作开发具有一定的好处. 它是一种新的插件机制,一种免安装的运行机制 github地址:https://github.com/DroidPluginTeam/DroidPlugin 参考博客:http://blog.csdn.net/hejjunlin/article/details/52124397

  • SSM使用mybatis分页插件pagehepler实现分页示例

    前几天在这里分享了手写 sql 分页查询实现分页,现在来看看使用 mybatis 分页插件 pagehepler 来实现分页 使用分页插件的原因,简化了sql代码的写法,实现较好的物理分页,比写一段完整的分页sql代码,也能减少了误差性. Mybatis分页插件 demo 项目地址:free-Mybatis_PageHelper_jb51.rar 我这里使用 maven 工程实现: 1.首先导入分页插件的依赖: <dependency> <groupId>com.github.pa

  • SpringBoot+Mybatis分页插件PageHelper实现分页效果

    目录 一.项目结构 二.插件引入 三.代码 四.测试: 最近刚入职新公司,项目是从零开始搭建的项目.我觉得是时候考验是驴还是千里马的时候.都是泪就不多说了. 附上一篇Mybatis常用的分页案例.这次要做的是最常见的分页效果,也是基础功能.但是很多人都做不好的.这次采用Mybatis分页插件PageHelper.   仅献给伸手党的大爷们.大爷们好!拿代码记得扣666!!小的在这给感谢了!! 一.项目结构 按照controller,service,mapper(也叫dao)来建立项目,utils

  • 解决mybatis分页插件PageHelper导致自定义拦截器失效

    目录 问题背景 mybatis拦截器使用 使用方法: 注解参数介绍: setProperties方法 bug内容: 自定义拦截器部分代码 PageInterceptor源码: 解决方法: 解决方案一 调整执行顺序 解决方案二 修改拦截器注解定义 问题背景 在最近的项目开发中遇到一个需求 需要对mysql做一些慢查询.大结果集等异常指标进行收集监控,从运维角度并没有对mysql进行统一的指标搜集,所以需要通过代码层面对指标进行收集,我采用的方法是通过mybatis的Interceptor拦截器进行

随机推荐