2019.11️

十一月,很快,已經實習一個多月了,感覺最近寫的業務還是挺多的,也學習到了許多東西,平時自己遇到了困難也會在這裏總結下,不過這個月偷懶了一把,沒利用空餘的時間去學習新的技術,不過最近開始看書了😂。

1. Spring中@RequestParam和@RequestBody區別

註解@RequestParam接收的參數是來自requestHeader中,即請求頭。通常用於GET請求,像POST、DELETE等其它類型的請求也可以使用。@RequestParam用來處理 Content-Type 爲 application/x-www-form-urlencoded 編碼的內容,Content-Type默認爲該屬性。

@RequestParam有三個配置參數:

  • required 表示是否必須,默認爲 true,必須。
  • defaultValue 可設置請求參數的默認值。
  • value 爲接收url的參數名(相當於key值)。

註解@RequestBody接收的參數是來自requestBody中,即請求體。一般用於處理非 Content-Type: application/x-www-form-urlencoded編碼格式的數據,比如:application/json、application/xml等類型的數據。通常用於接收POST、DELETE等類型的請求數據,GET類型也可以適用。

2.Array.asList()

發現在開發中還是比較常見到Arrays.asList()的,我們可以使用它將一個數組轉換爲一個List集合。

  • Arrays.asList()將數組轉換爲集合後,底層其實還是數組。

  • 使用時要注意:傳遞的數組必須是對象數組,而不是基本類型。Arrays.asList()是泛型方法,傳入的對象必須是對象數組。

  • 使用集合的修改方法:add()、remove()、clear()會拋出異常。Arrays.asList() 方法返回的並不是 java.util.ArrayList ,而是 java.util.Arrays 的一個內部類,這個內部類並沒有實現集合的修改方法或者說並沒有重寫這些方法。

  • 正確的將數組轉換爲ArrayList的方法:

  1. 直接轉
List list = new ArrayList<>(Arrays.asList(arr));
  1. 使用 Java8 的Stream:
List myList = Arrays.stream(arr).collect(Collectors.toList());

3. 數據庫表設計

  • 字段如果是字符的話,字符編碼必須使用utf8-mb4,要統一,不然會報錯。
  • 儘量不要以MySQL關鍵字作爲字段的命名,可參考官方文檔,不然做查詢語句的時候會出錯。
  • 每個數據表必須存在主鍵,除特殊情況外,應使用自增主鍵。
  • 除特殊情況外,所有字段必須設定默認值並且一定不可以出現NULL類型。

4.resultType和resultMap區別

官方文檔

  • resultType 從這條語句中返回的期望類型的類的完全限定名或別名。 注意如果返回的是集合,那應該設置爲集合包含的類型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。
  • resultMap 外部 resultMap 的命名引用。結果集的映射是 MyBatis 最強大的特性,如果你對其理解透徹,許多複雜映射的情形都能迎刃而解。可以使用 resultMap 或 resultType,但不能同時使用。

5.Spring中的事務機制

1、 Spring中事務的傳播行爲:

事務的傳播行爲是指,如果在開始當前事務之前,一個事務上下文已經存在,此時有若干選項可以指定一個事務性方法的執行行爲。在TransactionDefinition定義中包括瞭如下幾個表示傳播行爲的常量:

  • TransactionDefinition.PROPAGATION_REQUIRED:如果當前存在事務,則加入該事務;如果當前沒有事務,則創建一個新的事務。
  • TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續運行。
  • TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式運行,如果當前存在事務,則把當前事務掛起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事務方式運行,如果當前存在事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入該事務;如果當前沒有事務,則拋出異常。
  • TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個事務作爲當前事務的嵌套事務來運行;如果當前沒有事務,則該取值等價於TransactionDefinition.PROPAGATION_REQUIRED。

2、Spring事務種類
Spring中的事務一般分爲編程式事務和聲明式事務,由於編程式事務比較複雜,一般我們在項目中都是使用聲明式事務,也比較方便,而聲明式事務也有很多種類型來定義。
全面分析 Spring 的編程式事務管理及聲明式事務管理

  • 一種是在配置文件(xml)中做相關的事務規則聲明

  • 還有就是基於 @Transactional 的聲明式事務管理
    雖然 @Transactional 註解可以作用於接口、接口方法、類以及類方法上,但是 Spring 小組建議不要在接口或者接口方法上使用該註解,因爲這只有在使用基於接口的代理時它纔會生效。另外, @Transactional 註解應該只被應用到 public 方法上,這是由 Spring AOP 的本質決定的。如果你在 protected、private 或者默認可見性的方法上使用 @Transactional 註解,這將被忽略,也不會拋出任何異常。
    還有就是Spring 的 AOP 的自調用問題會導致 就算出現異常也不會回滾,需要注意!
    自調用問題就是說:同一個類中一個方法調用另一個方法有事務的方法,事務是不會起作用的。
    自調用問題
    透徹的掌握 Spring 中@transactional 的使用

6.Charles工具的使用

工欲善其事,必先利其器,好的工具讓你開發效率倍增。這款工具比起wireshark好用多了,也可以用來看手機APP的接口(要手機跟電腦連接同一網段)。

  • 截取 Http 和 Https 網絡封包。
  • 支持重發網絡請求,方便後端調試。
  • 支持修改網絡請求參數。
  • 支持網絡請求的截獲並動態修改。
  • 支持模擬慢速網絡。

其中使用Map也可以將遠程地址的接口轉發到本地,比如可以將測試環境或者生產環境的地址轉發到本地的地址,這個時候本地也要有一份跟測試環境一樣的數據庫,然後當你在線上操作測試環境時,實際上操作的就是你本地的數據庫。功能強大。還有一些Rewirte 和 Breakpoints 功能等,具體可以參考Charles 從入門到精通
在這裏插入圖片描述

7.Java8新特性

Java8的新特性,真的給開發者帶來了福音,在開發中也很實用,尤其是流Stream,Optional判斷空指針異常等,LocalDateTime代替Date,總的來說新特性有以下幾個:
這裏只做總結:不做具體功能,詳情可以參考相關博客,JavaGuide博主總結的太好了哈哈哈詳解Java8

  • Lambda表達式
  • 接口的默認方法(使用 default 關鍵字向接口添加非抽象方法實現)
  • 方法引用(::)
  • 流Stream(filter、sort、map、collect、reduce、count)IBM流詳解
  • Optional(可預防空指針)
  • LocalDateTime(以後儘量用這個代替Date)

8.JavaBean中用LocalDateTime 修飾 創建時間 報錯

谷歌了一下,是Mybatis-plus版本跟druid連接池版本衝突的問題,我曾創建一個新項目,其中用Mybatis-plus➕hikari 連接池,這樣使用LocalDateTime修飾created_at就不會報錯。

之前項目中用到的Mybatis-plus ➕ druid 就會出現報錯。參考

解決方法:

  • 1、使用Date類型修飾Bean
  • 2、換連接池,使用hikariCP

12月 TODO

  1. 加強SQL語句的編寫。
  2. 對Redis的熟練應用。
  3. 看一本書。
發佈了44 篇原創文章 · 獲贊 14 · 訪問量 6481
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章