1:get/load存取單條數據 sql
- public Teacher getTeacherById(Long id) {
- return (Teacher)this.hibernateTemplate.get(Teacher.class, id);
- }
-
- public Teacher getTeacherById(Long id) {
- return (Teacher)this.hibernateTemplate.load(Teacher.class, id);
- }
2:find/iterate查詢操做 數據庫
- public Iterator getTeachersByAge(int age) {
- Iterator iterator = null;
-
- //使用find方法
- List list = (List)this.hibernateTemplate().find("from Teacher t where t.age>?", new Integer(age));
- iterator = list.iterator();
-
- //使用iterator方法
- iterator = this.hibernateTemplate().iterate("from Teacher t where t.age>?", new Integer(age));
-
- return iterator;
- }
find和iterato的區別主要是iterate採用了N+1次查詢,對於大批量查詢,好比查詢10000條記錄,那麼iterate就要執行10000+1次查詢,find和iterate應根據具體的實際 緩存
狀況來使用,對於頻繁的寫操做對象,應使用find查詢,而對於一些只讀的數據對象,應使用iterate操做,由於iterate操做使用了Hibernate的緩存機制 session
3:save/update/saveOrUpdate/delete 保存/更新/刪除操做 app
- public void save(Teacher teacher) {
- this.hibernateTemplate.save(teacher);
- }
- public void update(Teacher teacher) {
- this.hibernateTemplate.update(teacher);
- }
- public void update(Teacher teacher) {
- this.hibernateTemplate.saveOrUpdate(teacher);
- }
- public void update(Teacher teacher) {
- this.hibernateTemplate.delete(teacher);
- }
4:bulkUpdate批量刪除或者更新 this
bulkUpdate提供了批量刪除和更新,直接轉換爲相應的update/delete SQL進行批量刪除和更新 spa
- public void batchDelete(String name, int age) {
- this.hibernateTemplate.bulkUpdate("delete Teacher where name=? and age = ?", new Object[]{name, age});
- }
- public void batchDelete(String name, String newName) {
- this.hibernateTemplate.bulkUpdate("update Teacher set name=? where name=?", new Object[]{newName, name});
- }
此時要注意的一個問題是,使用bulkUpdate操做,必須手工清除相關對象在Hibernate中的緩存(包括一級緩存和二級緩存)
5:execute核心方法 .net
- public Object execute(HibernateCallBack action, boolean exposeNativeSession) throws DataAccessException {
- //獲取一個Session
- Session session = getSession();
- //當前session是否在事務中
- boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
- FlushMode previousFlushMode = null;
-
- try {
- previousFlushMode = applyFlushMode(session, existingTransaction); //應用flush模式
- enableFilters(session);
-
- //暴露給action的session
- Session sessionToExpose = (exposeNativeSession? session: createSessionProxy(session));
- //執行action
- Object result = action.doInHibernate(sessionToExpose);
- flushIfNecessary(session, existingTransaction);
-
- return result;
-
- } catch(HibernateException ex) {
- throw convertHibernateAccessException(ex);
- } catch(SQLException ex) {
- throw convertJdbcAccessException(ex);
- } catch(RuntimeException ex) {
- throw ex;
- } finally {
- //若是session在事務中,則不關閉session
- if(existingTransaction) {
- disableFilters(session);
- if(previousFlushMode != null) {
- session.setFlushMode(previousFlushMode);
- }
- } else {
- //釋放session
- SessionFactoryUtils.releaseSession(session, getSessionFactory());
- }
- }
- }
*HibernateCallBack,通常用來實現特定的業務邏輯
*exposeNativeSession:是一個布爾值,要暴露給HibernateCallBack實際的session對象,而不是一個代理過的對象 hibernate
6:通常狀況下,只有HIberateTemplate提供的方法不能知足要求時才使用execute方法,它的使用狀況以下所示, 代理
- public void createDatabaseSchema() throws DataAccessException {
- HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
- //調用HibernateTempalte的execute方法
- hibernateTemplate.execute(new HibernateCallback() {
- public Object doInHibernate(Session session) throws HibernateException, SQLException { //實現HibernateCallback的doInHibernate方法
- //具體實現
- Connection conn = session.connection();
- final Dialect dialect = Dialect.getDialect(configuration.getProperties);
- String[] sql = configuration.generateSchemaCreationScript(dialect);
- executeSchemaScript(conn, sql);
- }
- });
- }
使用execute方法的重點是實現HibernateCallback的doInHibernate方法,它會傳遞一個Session實例,能夠使用此Session實例操做數據庫,由此看出execute方法的好處是應用程序不用關心session的建立和釋放,只須要處理關心的業務邏輯便可