首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Spring HibernateTemplate 查詢用戶代碼詳解:us.find() 執行流程

     編輯:程式設計綜合問答

代碼片段

@Resource private HibernateTemplate us;
public List<User> queryUser(String username, String password) {
    List<User> users = us.find("from User u where u.username = '" + username + "' and u.password = '" + password + "'");
    return users;
}

執行流程詳解

  1. HQL 解析:"from User u where u.username = '...' and u.password = '...'" 是 Hibernate Query Language (HQL),面向**持久化類** User 而非數據庫表。
  2. Session 獲取:HibernateTemplate 內部調用 sessionFactory.getCurrentSession() 獲取當前事務綁定的 Session。
  3. Query 創建:session.createQuery(hql) 生成 Query 對象。
  4. 參數綁定 (隱患):代碼直接拼接字符串,**存在 SQL/HQL 注入風險**。正確做法用命名參數:
// 安全寫法
String hql = "from User u where u.username = :un and u.password = :pwd";
List<User> users = us.findByNamedParam(hql, new String[]{"un", "pwd"}, new Object[]{username, password});
  1. 執行查詢:query.list() 發送 SQL 到數據庫,將結果集映射為 User 對象列表(自動調用 Getter/Setter 填充屬性)。
  2. 事務管理:若方法在 @Transactional 環境下,Session 由 Spring 管理,查詢參與當前事務(只讀優化)。

持久化類與表映射

// User.hbm.xml 或 @Entity
class User {
    private Long id;
    private String username, password;
    // getter/setter
}
// 對應數據庫表 user (id, username, password)

核心優勢

  • **面向對象查詢**:無需寫 SQL,自動處理對象關聯、繼承、多態。
  • **自動映射**:結果集自動轉為 List,無需手寫 ResultSet 解析。
  • **緩存支持**:一級緩存 (Session) 自動生效,二級緩存可配置。

安全警示

**絕不在生產代碼中拼接 HQL/SQL 參數!** 必須使用參數綁定 (setParameter, findByNamedParam, findByValue) 防止注入攻擊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved