1. 程式人生 > >【ZeyFraのJavaEE開發小知識05】Mybatis-Plus & Axios

【ZeyFraのJavaEE開發小知識05】Mybatis-Plus & Axios

# 關於如何在Mybatis-Plus中新增SQL攔截器 之前ZeyFra在[MyBatis-Plus【踩坑記錄01】](https://www.cnblogs.com/zeyfra/p/ZeyFra-MyBatis-Plus-01.html)一文中提到過,使用`Mybatis-Plus`時最好使用`MybatisSqlSessionFactory`,而不是使用`Mybatis`原生的`SqlSessionFactory`,這也是官方文件的建議,也感興趣的小夥伴可以自行前往檢視。 ## 業務需求 相信不少小夥伴在JavaEE的開發中會有這麼一個需求,希望能夠在執行`insert`或`update`的sql語句時程式能夠自動的為我們在相應的欄位上新增相應的時間,及通過SQL攔截器實現對`insert`語句和`update`語句新增相應的建立時間和更新時間 ## 解決方案 **1、首先在實體類新增相應的註解** ```java 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; /** *

* 使用者表 *

* * @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、編寫相應的處理器處理註解** ```java 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`的小夥伴可以跳過此步驟) ```java 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的官方文件的請求配置](http://www.axios-js.com/zh-cn/docs/#%E8%AF%B7%E6%B1%82%E9%85%8D%E7%BD%AE) ## 解決方案: - `pramas`是即將與請求一起傳送的 `URL` 引數,任何請求方法都可使用,但必須是一個`無格式物件(plain object)`或`URLSearchParams物件`,相應的`Controller`在接收時可將對應的Params封裝成相應的物件,但不可用`@RequestBody`註解`,否則會接收不到引數並有相應的警告 - `data`是作為請求主體被髮送的資料,只適用於這些請求方法 `PUT`,`POST`, 和