【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM