关于如何在Mybatis-Plus中添加SQL拦截器

之前ZeyFra在MyBatis-Plus【踩坑记录01】一文中提到过,使用Mybatis-Plus时最好使用MybatisSqlSessionFactory,而不是使用Mybatis原生的SqlSessionFactory,这也是官方文档的建议,也感兴趣的小伙伴可以自行前往查看。

业务需求

相信不少小伙伴在JavaEE的开发中会有这么一个需求,希望能够在执行insertupdate的sql语句时程序能够自动的为我们在相应的字段上添加相应的时间,及通过SQL拦截器实现对insert语句和update语句添加相应的创建时间和更新时间

解决方案

1、首先在实体类添加相应的注解

package zeyfra.com.modules.system.user.entity;

import com.baomidou.mybatisplus.annotation.*;

import java.util.Date;

import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat; /**
* <p>
* 用户表
* </p>
*
* @author ZeyFra
* @since 2021-02-16
*/
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="User对象", description="用户表")
public class User implements Serializable { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "用户编号")
@TableId(value = "user_id", type = IdType.AUTO)
private Integer userId; @ApiModelProperty(value = "用户账号名")
private String userName; @ApiModelProperty(value = "用户密码")
private String password; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
@ApiModelProperty(value = "创建时间")
@TableField(fill = FieldFill.INSERT)
private Date createdTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
@ApiModelProperty(value = "更新时间")
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
}

2、编写相应的处理器处理注解

package zeyfra.com.aspect.mybatis_plus;

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.util.Date; /**
* @author ZeyFra
* @date 2021/3/16 14:55
*/
@Component
@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler { /**
* 重写插入时候的填充策略
* @param metaObject
*/
@Override
public void insertFill(MetaObject metaObject) { log.info("start insert fill ....");
/**
* 注意:
* 1、以下三种方法任选其一
* 2、this.setFieldValByName()方法已过时不再推荐使用
*/
// 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
// 起始版本 3.3.3(推荐)
this.strictUpdateFill(metaObject, "createTime", () -> LocalDateTime.now(), LocalDateTime.class);
// 也可以使用(3.3.0 该方法有bug)
this.fillStrategy(metaObject, "createTime", LocalDateTime.now()); } /**
* 重写修改时候的填充策略
* @param metaObject
*/
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ...");
/**
* 注意:
* 1、以下三种方法任选其一
* 2、this.setFieldValByName()方法已过时不再推荐使用
*/
// 起始版本 3.3.0(推荐使用)
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
// 起始版本 3.3.3(推荐)
this.strictUpdateFill(metaObject, "updateTime", () -> LocalDateTime.now(), LocalDateTime.class);
// 也可以使用(3.3.0 该方法有bug)
this.fillStrategy(metaObject, "updateTime", LocalDateTime.now());
} }

3、若以使用MybatisSqlSessionFactory,应在相应配置中添加处理器(未使将Mybatis原生SqlSessionFactoryBean替换成MybatisSqlSessionFactory的小伙伴可以跳过此步骤)

package zeyfra.com.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import zeyfra.com.aspect.mybatis_plus.MyMetaObjectHandler; import javax.sql.DataSource; /**
* Shiro配置类
* @author ZeyFra
* @date 2021/2/16 13:27
*/
@Configuration
@EnableTransactionManagement
@MapperScan("zeyfra.com.modules.**.mapper")
public class MybatisPlusConfig { @Bean("sqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Autowired @Qualifier("dataSource") DataSource dataSource) throws Exception { // 创建MybatisConfiguration
MybatisConfiguration mybatisConfiguration = new MybatisConfiguration(); // MybatisPlus内部过滤器
// 将自动分页插件设置DB类型
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 添加自定义拦截器
mybatisConfiguration.addInterceptor(mybatisPlusInterceptor); // 开启缓存
mybatisConfiguration.setCacheEnabled(true); //创建MybatisSqlSessionFactoryBean
MybatisSqlSessionFactoryBean sqlSessionFactoryBean = new MybatisSqlSessionFactoryBean(); // 设置数据源
sqlSessionFactoryBean.setDataSource(dataSource); // 在GlobalConfig中添加sql拦截器,即相应的注解处理器
GlobalConfig globalConfig = new GlobalConfig();
globalConfig.setMetaObjectHandler(new MyMetaObjectHandler()); // 添加在GlobalConfig中添加sql拦截器
sqlSessionFactoryBean.setGlobalConfig(globalConfig); // 添加MybatisConfiguration
sqlSessionFactoryBean.setConfiguration(mybatisConfiguration); // 设置mapper相应的xml路径
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath:zeyfra/com/modules/**/*.xml")); // 返回MybatisSqlSessionFactoryBean从而替代原生的sqlSessionFactory
return sqlSessionFactoryBean.getObject(); } }

关于Axios请求中携带参数的问题

问题描述:

最近开发的时候脑溢血了,最基本的东西给忘了,我在get方法的请求中使用了data,还一直纳闷为啥Controller无法接受到参数,我也是服了我自己,更详细的内容可参考Axios的官方文档的请求配置

解决方案:

  • pramas是即将与请求一起发送的 URL 参数,任何请求方法都可使用,但必须是一个无格式对象(plain object)URLSearchParams对象,相应的Controller在接收时可将对应的Params封装成相应的对象,但不可用@RequestBody注解`,否则会接收不到参数并有相应的警告

  • data是作为请求主体被发送的数据,只适用于这些请求方法 PUTPOST, 和 PATCH

【ZeyFraのJavaEE开发小知识05】Mybatis-Plus & Axios的更多相关文章

  1. 【ZeyFraのJavaEE开发小知识01】@DateTimeFomat和@JsonFormat

    @DateTimeFormat 所在包:org.springframework.format.annotation.DateTimeFormat springframework的注解,一般用来对Dat ...

  2. 【ZeyFraのJavaEE开发小知识02】MybatisPlus&ElementUI

    1.关于如何获得Mybatis-Plus在插入对应为自增长主键但并未对该主键赋值的实体类之后其主键值 对应数据库中某张表并未设置主键值,但其主键为自增长类型的实体类,在使用Mybatis-Plus做i ...

  3. 【ZeyFraのJavaEE开发小知识03】@DateTimeFomat和@JsonFormat

    关于在Element UI的el-dialog组件中使用echarts的问题 问题描述: "Cannot read property 'getAttribute' of null" ...

  4. React Native环境配置、初始化项目、打包安装到手机,以及开发小知识

    1.前言 环境:Win10 + Android 已经在Windows电脑上安装好 Node(v14+).Git.Yarn. JDK(v11) javac -version javac 11.0.15. ...

  5. bootstrap学习笔记(网页开发小知识)

    这是我在学习Boostrap网页开发时遇到的主要知识点: 1.导航条navbar 添加.navbar-fixed-top类可以让导航条固定在顶部,固定的导航条会遮住页面上的其他内容,除非给<bo ...

  6. Python接口开发小知识

    关于数据库设计 接口开发多学习数据库表操作,这是要点 不存在删除数据,每个可能被删除数据的表加一个is_active属性 不同的表可以有多个相同的字段,字段属性少用禁止非空 不要设置太多主外键(高内聚 ...

  7. JSP+Ajax站点开发小知识

    一.JSP基础 1.<select  name="love"  size="3">当中的size属性指定了列表框显示选项的条数.假设全部选项多于这个 ...

  8. Android开发小知识

    修改Android app图标(Android Studio) 1.  res\drawable 放置icon.png(此图片是你需要修改的图标); 2.  修改AndroidManifest.xml ...

  9. web开发小知识

    session共享机制:f5刷新是再次提交之前的数据请求 地址栏回车属于不同的请求 不同浏览器获取不到之前数据 同一浏览器可以获取同步数据 session注销:session.invalidate() ...

随机推荐

  1. JavaScript DOM操作之查找元素节点

    概要: 编程接口 可通过 JavaScript 对 HTML DOM 进行访问. 所有 HTML 元素被定义为对象,而编程接口则是对象方法和对象属性. 方法是您能够执行的动作(比如添加或修改元素). ...

  2. springboot(五)Scheduling demo

    在项目开发过程中,经常会使用到定时任务(跑批),springboot默认已经实现了,只需要添加相应的注解就可以实现 在启动类上加入注解,开启定时任务 @SpringBootApplication @E ...

  3. Dos简单命令及CMD打开方式

    打开CMD方式 开始+系统+命令提示符 WIN健+R 输入cmd打开控制台(推荐使用) 在任意文件夹下面,按住shift+鼠标右击,进入powershell 资源管理器的地址栏路径最前面+cmd+空格 ...

  4. JSON-LD & SEO

    JSON-LD & SEO https://json-ld.org/ https://en.wikipedia.org/wiki/JSON-LD Google Search structure ...

  5. css animation & animation-fill-mode

    css animation & animation-fill-mode css animation effect https://developer.mozilla.org/en-US/doc ...

  6. HOC in Depth

    HOC in Depth Higher-Order Components https://reactjs.org/docs/higher-order-components.html 1. wrappe ...

  7. 人物传记-BILL RAY:低谷时的信念,决定你能走多远

    自2018年全球经济危机以来,以工作为重的成年人们一直备受打击.尤其是2020年,全球贸易争端使得经济下滑严重,很多公司倒闭破产,有些人甚至从富豪变成了负债者,走向了人生低谷.其实,每个人都会遇到人生 ...

  8. C++算法代码——标题统计

    题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=2327 题目描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意: ...

  9. 深入理解Java内存模型JMM

    本文转载自深入理解Java内存模型JMM JMM基础与happens-before 并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执 ...

  10. springcloud alibaba-nacos配置中心

    nacos除了充当注册中心外,还能作为配置中心,下面进行演示. 1. 创建 模块,用于读取 nacos配置中心的统一配置 2. 添加依赖 <dependencies> <!-- na ...