【ZeyFraのJavaEE开发小知识05】Mybatis-Plus & Axios
关于如何在Mybatis-Plus中添加SQL拦截器
之前ZeyFra在MyBatis-Plus【踩坑记录01】一文中提到过,使用Mybatis-Plus
时最好使用MybatisSqlSessionFactory
,而不是使用Mybatis
原生的SqlSessionFactory
,这也是官方文档的建议,也感兴趣的小伙伴可以自行前往查看。
业务需求
相信不少小伙伴在JavaEE的开发中会有这么一个需求,希望能够在执行insert
或update
的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;
/**
* Mybatis-Plus配置类
* @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
是作为请求主体被发送的数据,只适用于这些请求方法PUT
,POST
, 和PATCH