最近寫java代碼學到的一些point,主要是我在公司實習的時候,本身碰到的一些問題,總結一下。會持續更新。html
問題:日常寫java的都常常會有功能點:service.getElementByID(id),之前我在寫的時候,好比從前端接收到對象的list-》根據list中某個對象的id查詢數據庫的某張表的其餘屬性name-》第一反應是直接for循環遍歷獲取對象id,而後根據id調用service中的getnameByID方法。前端
這個作法其實是能夠的,可是若是數據量很大的狀況下,屢次訪問數據庫IO消耗巨大。
複製代碼
解決:先select * from 數據中的某張表A,獲取所有須要的數據,而後把你須要查找的一列name與ID一一對應存入map。而後for循環list中的id時,直接從map中查找。java
這樣操做的話就至關於只訪問了一次數據庫。同時由於map的get操做的時間複雜度在理想的狀況下爲O(1)。
複製代碼
代碼:程序員
//定義map list爲一次從數據庫獲取全部數據
Map<String,Object> map = new HashMap<>();
List<Object> lists = service.findAll();
if(lists!=null && !lists.isEmpty()){
//將list中全部數據存入map
lists.forEach(bean->{
map.put(bean.getID(),bean);
});
}
//在操做的時候,若是map中存在對應的key,直接get
if(map.containsKey(bean.getID()) ){
System.out.println(bean.getName());
}
複製代碼
異常關鍵字
1:try catch
try catch是這之間所包含的代碼若是出現異常時捕獲他,並進行處理的,若是代碼之間有錯誤,不會影響程序繼續執行下去,程序會繼續日後執行。
2:throw
是在程序中明確拋出引起的異常,好比throw new Exception();
3:throws
代表方法可能會引起異常,在方法內部並不處理這個異常,想要獲得異常的話,調用者使用try catch語句便可獲得
4:finally
無論有沒有異常程序段中都會被執行的代碼
複製代碼
問題:其實咱們在學校本身作項目的時候,幾乎不會去主動catch異常,不少異常狀況都不能很規範的考慮到。而在公司中業務則要求:某一個塊碰到什麼問題,必定要以日誌的形式打印出來,碰到什麼異常捕獲並返回jsonMap說明異常狀況。面試
解決:養成異常捕獲的習慣。數據庫
站在用戶的角度去思考業務,而不是站在代碼的角度。
複製代碼
咱們在寫一個業務的時候, 不要理所固然的以爲按照咱們的邏輯是不會出現問題的,可是用戶是小白,他們在操做的時候不徹底按照咱們的邏輯。json
代碼:後端
private Map<String,Object> getRes(String A) {
Map<String, Object> jsonMap = new HashMap<>();
try {
List<Object> a = service.getByA(A);//這個方法可能拋異常
Map<String, Object> map = new HashMap<>();
for(Object p:a){
if(StringUtils.isBlank(p.getBootStatus())){
continue;//過濾異常狀況,避免拋異常
}
if(StringUtils.isNotBlank(p.getId())&&StringUtils.isNotBlank(p.getIp())){
map.put(p.getName(),p.getIp());
}
}
jsonMap.put("success", true);
jsonMap.put("data",map);
} catch (Exception e) {
jsonMap.put("success", false);
jsonMap.put("errorMsg", "A = " + A + " 訪問 api 發生異常!");
log.error("exception:{} ",e);
}
return jsonMap;
}
複製代碼
備註:對於異常的處理,不少公司都會比較重視。api
對於我來講,常見的異常有NullPointerException,ArrayIndexOutOfBoundsException,SQLException,IOException。bash
偶然看到一段代碼是本身自定義的異常,不明白爲何須要本身定義異常而且拋異常?因此去查閱了一些資料。
爲何要自定義異常:
大的項目業務線比較多,不一樣功能模塊的異常類型不同,若是不自定義的區分的話,對於捕獲異常來就沒有區別性。全部通常業務中不一樣場景拋不一樣的異常,便於統一捕捉而且根據類型作進一步的處理。 可是自定義異常通常會增長工做量,須要本身權衡是否自定義異常類。
如何自定義異常類:
//1.自定義異常類:繼承RuntimeException(運行時異常) 或 Exception
public class MyException extends Exception {
private static final long serialVersionUID = 1L;
// 提供無參數的構造方法
public MyException() {
}
// 提供一個有參數的構造方法,可自動生成
public MyException(String message) {
super(message);// 把參數傳遞給Throwable的帶String參數的構造方法
}
}
//2.拋異常類
public class CheckScore {
// 檢查分數合法性的方法check() 若是定義的是運行時異常就不用拋異常了
public void check(int score) throws MyException {// 拋出本身的異常類
if (score > 120 || score < 0) {
// 分數不合法時拋出異常
throw new MyException("分數不合法,分數應該是0--120之間");// new一個本身的異常類
} else {
System.out.println("分數合法,你的分數是" + score);
}
}
}
//3.捕獲異常
import java.util.Scanner;
/*
* 自定義的異常測試類
*/
public class Student {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
CheckScore check = new CheckScore();
try {
check.check(score);
} catch (MyException e) {// 用本身的異常類來捕獲異常
e.printStackTrace();
}
}
}
複製代碼
備註: 異常分類方便捕捉不一樣的異常類型,並進行對應的操做。在稍微複雜的業務系統中,僅僅使用Java自身的異常類是不夠的,好比常見的NPE/IAE等。
參考連接:www.cnblogs.com/yanggb/p/10…
做用:讀取配置文件的屬性
註解方式:
定義(map類型):
property.key = {"A":"a","B":"b"}
使用:
@Value("#{${property.key}}")
private Map<String, String> propertykey;
propertykey.get(A);
複製代碼
這是一款逆向工程工具,針對數據庫表自動生成mybatis執行所須要的代碼,通常有三種用法:命令行,eclipse插件,maven插件。比較通用的就是maven插件。
具體使用方法比較常見:
(1)在pom.xml導入依賴的包
(2)generatorConfig.xml文件
(3)IDEA中直接點擊插件執行
至此,其中的pojo dao mapper xml等文件都會自動生成。
想起之前搭建框架的時候,每次都是手動建立
上手仍是很快的,對於接口測試很是有用
debug的一方面是爲了調試代碼,找到問題。另外一方面也能夠幫助咱們理解新代碼。
做爲一個實習生,剛到公司,每次寫一個業務以前,必定是要熟悉別人的代碼。而熟悉代碼最快路徑第一步是找一個接口測試這個功能點,第二步是在代碼中打斷點調試,看每一個函數調用的返回值的變化。
1.斷點儘可能打在有返回值的語句、if斷定條件語句
2.F9跳轉斷點,快捷。代碼修改以後,可重複發送請求繼續調試
3.80%的問題均可以用debug解決
複製代碼
這是一個很是實用的後端項目熱部署插件。由於idea沒有集成熱部署工具,因此只能安裝插件使用,可讓你效率加倍。衆所周知,Spring項目若是很大的話,每修改一點代碼就要重啓Tomcat,耗時長。