关于如何在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. How to use JavaScript to implement precise setTimeout and setInterval

    How to use JavaScript to implement precise setTimeout and setInterval 如何使用 JavaScript 实现精确的 setTimeo ...

  2. Paint Tool SAI

    Paint Tool SAI PC 绘画工具 https://en.wikipedia.org/wiki/Paint_Tool_SAI refs https://www.systemax.jp/en/ ...

  3. Web Components & HTML5 & template & slot

    Web Components & HTML5 & template & slot https://developer.mozilla.org/en-US/docs/Web/HT ...

  4. flutter sqlite持久化数据

    dependencies: path: sqflite: sqflite_common_ffi: import 'dart:io'; import 'package:flutter/material. ...

  5. uniapp scroll-view

    https://uniapp.dcloud.io/component/scroll-view <view class="flex1"> <scroll-view ...

  6. qt char与code的相互转换

    QString str = "A"; QChar c = str.at(0); // int v_latin = c.toLatin1(); // 不能转中文 int v_lati ...

  7. Python3网络爬虫-- 使用代理,轮换使用各种IP访问

    # proxy_list 代理列表 run_times = 100000 for i in range(run_times): for item in proxy_list: proxies = { ...

  8. Java自学第10期——File类与IO流(输入输出流、处理流、转换流、缓冲流、Properties集合、打印流)

    1.IO简介 IO(输入输出)通过java.io包下的类和接口来支持,包下包括输入.输出两种IO流,每种输入输出流又可分为字符流和字节流两大类. 2.File类 File类是io包下与平台无关的文件和 ...

  9. nginx反向代理理解

    实际开发中,会有不同的环境: - 开发环境:自己的电脑- 测试环境:提供给测试人员使用的环境- 预发布环境:数据是和生成环境的数据一致,运行最新的项目代码进去测试- 生产环境:项目最终发布上线的环境 ...

  10. Oracle VM VirtualBox安装CentOS7

    安装VirtualBox6.0 下载地址:https://www.virtualbox.org/ 新建虚拟机 类型:Linux 版本:Other Linux(64-bit)----如果没有出现64-b ...