目的
原本新增記錄那只能用foodId,我想改為能新增食物名稱、熱量、蛋白質、脂肪、碳水、 份量。
需要新建class Food、FoodDAO。
1.新增class
在dao資料夾新增class FoodDAO,在model資料夾新增class Food。
2.class Food
先宣告food表的欄位。
初始化物件,在建立物件時會自動被呼叫(一定要跟類別名一樣,且不會回傳)
寫每個欄位的getter、setter供外部程式讀取或修改。
3.FoodDAO
建立方法getOrCreateFoodIdByName,丟入前面宣告過的參數,丟出例外不在這執行。
int foodId = -1:初始化foodId為-1,找不到回傳-1。
SELECT food_id FROM food WHERE name=?:從food表找food_id,條件為name=?。
foodId = rs.getInt("food_id):從結果讀food_id的值,存在foodId變數。
Statement.RETURN_GENERATED_KEYS:在執行完INSERT後取得資料庫自動產生的主鍵值(food_id)。
ResultSet keys = insertStmt.getGeneratedKeys:從剛剛執行結果中,取出資料庫自動產生的主鍵。ResultSet是JDBC中查詢結果集的資料型態。
foodId=keys.getInt(1):取出結果中的第1個欄位的整數值(自動生成的主鍵)存入foodId。
最後回傳foodId。
4.FoodLogDAO
只放新增程式碼截圖。
step1:
addFoodLog:新加入calories、protein、fat、carb參數。
如果有讀到資料就代表食物已存在food資料表,將找到的food_id存入foodId。
沒有食物記錄就在food插入新資料,下面與前面講過的一樣。
step2:
這裡只改印出食物名稱、舊份量+份量=新份量。
5.Main
新增輸入食物名、熱量、、蛋白質、脂肪、碳水並加上錯誤處理。
double calories = Double.parseDouble(calStr):把字串轉成double型態的數值,並存進變數calories。
int foodId=food_dao.grtOrCreateFoodIdByName:呼叫方法,放入參數,如果資料庫原本就有這個食物會回傳那筆的id,沒有就會回傳新的id,將回傳的值存入變數foodId。
其他的程式碼之前有寫過。
6.結果