Hibernate 的核心價值在於簡化數據庫操作。以下代碼演示了最基礎的增、刪、改、查流程:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
// 1. 新增
User user = new User();
user.setName("chenyan");
session.save(user); // 執行 INSERT
tx.commit();
// 2. 立即查詢(get 會立即發 SQL)
user = (User) session.get(User.class, user.getId());
System.out.println(user.getAge()); // 輸出 null(age 未設置)
// 3. 更新
user.setAge(24);
tx = session.beginTransaction();
session.update(user); // 執行 UPDATE
tx.commit();
// 4. 載入
user = (User) session.load(User.class, user.getId());
System.out.println(user.getAge()); // 輸出 24
// 5. 刪除
tx = session.beginTransaction();
session.delete(user); // 執行 DELETE
tx.commit();
dynamic-insert 與 dynamic-update在類映射上啟用這兩個屬性,能讓 Hibernate 根據對象屬性值動態生成 SQL,提升性能並減少無效字段更新:
<class name="com.hb3.pack_01.model.User" table="user"
dynamic-insert="true"
dynamic-update="true">
效果對比:
insert into user (name, age) values (?, ?) —— 即使 age 為 null 也包含在內insert into user (name) values (?) —— 僅插入非空字段同理,dynamic-update="true" 會使 UPDATE 語句僅包含真正被修改的字段(如 update user set age=? where id=?),避免覆蓋未變更的列。
Criteria criteria = session.createCriteria(User.class);
// 查詢所有
List users = criteria.list();
// 條件查詢:name = 'shenbin'
// 注意:Hibernate 3.3+ 建議用 Restrictions 替代舊版 Expression
criteria.add(Restrictions.eq("name", "shenbin"));
users = criteria.list();
// 簡單查詢
Query query = session.createQuery("from User");
users = query.list();
// 參數綁定查詢
query = session.createQuery("from User user where user.name like ?");
query.setParameter(0, "shenbin"); // 位置參數,從 0 開始
users = query.list();
在 Hibernate 3.3 及以上版本,
org.hibernate.Expression類已廢棄,請統一使用org.hibernate.criterion.Restrictions構建條件,確保代碼向後兼容。
掌握 save/update/delete/get/load 五大核心方法,善用 dynamic-insert/update 優化 SQL,並熟練運用 Criteria 與 HQL 兩大查詢風格,即可應對絕大多數業務場景。下一篇將重點講解容易出錯的 saveOrUpdate() 方法。