JFinal 的 getModel 是從表單綁定資料到 Model 物件的核心方法,但官方文檔中關於「查詢用 dao 物件」與「資料承載用新物件」的區別,是新手最容易踩坑的地方。本文詳細記錄配置流程與避坑經驗。
在 JConfig.configPlugin 中設定資料庫連線與表映射:
public void configPlugin(Plugins me) {
C3p0Plugin cp = new C3p0Plugin(
"jdbc:mysql://localhost:3306/huaxuetang?useUnicode=true&characterEncoding=utf-8",
"root", "1234");
me.add(cp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
arp.setShowSql(true);
me.add(arp);
// 表映射:表名、主鍵、Model 類別
arp.addMapping("bse_user", "id", User.class);
arp.addMapping("grade_one_choice", "id", GOneQuestion.class);
}
public class GOneQuestion extends Model<GOneQuestion> {
private static final long serialVersionUID = 1L;
// 全域共享 dao 物件,僅供查詢使用
public final static GOneQuestion questiondao = new GOneQuestion();
}
表單欄位 name 屬性格式:modelName.attributeName(模型名首字母小寫)
<input type="text" name="gOneQuestion.A" class="required" maxlength="50" />
對應 Model 類別 GOneQuestion 的屬性 A。
GOneQuestion question = getModel(GOneQuestion.class);
官方文檔原文:User 中定義的 public static final User dao 物件是全域共享的,只能用於資料庫查詢,不能用於資料承載物件。資料承載需要使用 new User().set(…) 來實現。
錯誤寫法(會導致主鍵重複):
// 錯誤:使用靜態 dao 物件儲存
GOneQuestion.questiondao.set("book", question.getStr("book")).save();
正確寫法:
// 正確:new 新物件承載資料
new GOneQuestion()
.set("book", question.getStr("book"))
.save();
| 操作類型 | 使用物件 | 範例 |
|---|---|---|
| 查詢、刪除、更新 | 靜態 dao 物件 | GOneQuestion.questiondao.findById(id) |
| 新增儲存 | new Model() | new GOneQuestion().set(...).save() |
這個細節在官方文檔中雖有說明,但極易被忽略。實務上建議:查詢用靜態 dao,寫入用 new 實例,形成肌肉記憶。