【ZeyFraのJavaEE开发小知识05】Mybatis-Plus & Axios

关于如何在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;

/**
 * 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是作为请求主体被发送的数据,只适用于这些请求方法 PUTPOST, 和 PATCH

给TA买糖
共{{data.count}}人
人已赞赏
经验教程

别只知道策略模式+简单工厂,试试更香的策略模式+抽象工厂!

2021-3-16 20:20:00

经验教程

动态规划系列之九找零钱

2021-3-16 22:48:00

⚠️
免责声明:根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。 本站为个人博客非盈利性站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途,网站会员捐赠是您喜欢本站而产生的赞助支持行为,仅为维持服务器的开支与维护,全凭自愿无任何强求。本站部份代码及教程来源于互联网,仅供网友学习交流,若您喜欢本文可附上原文链接随意转载。
无意侵害您的权益,请发送邮件至 momeis6@qq.com 或点击右侧 私信:momeis 反馈,我们将尽快处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
有新私信 私信列表
搜索