1. 程式人生 > >關於DAO層的sessionFactory注入和是否繼承HibernateDAOSupport

關於DAO層的sessionFactory注入和是否繼承HibernateDAOSupport

這個標題被我描述的太亂太雜了,其實要講的主要是關於怎麼得到用來操作資料層所使用的hibernateTemplate(另一個種方法是通過jdbcTemplate,但推薦使用第一種)。而hibernateTemplate是通過sessionFactory得到的,sessionFactory存在於hibernateDAOSupport來得到。(一切都是spring給我們封裝好的)

這裡的關鍵是怎麼通過spring對DAO的操作得到我們要的hibernateTemplate

我們先看spring中的一段原始碼。

public final void setSessionFactory(SessionFactory sessionFactory) {
  if (this.hibernateTemplate == null || sessionFactory != this.hibernateTemplate.getSessionFactory()) {
   this.hibernateTemplate = createHibernateTemplate(sessionFactory);
  }
 }
還有一個final方法
public final HiberanteTemplate getHibernateTemplate()。。。。
也就是要得到hibernateTemplate就要先保證sessionFactory不是NULL,但是又因為這兩個方法都是final所以,DAO層繼承了這個hibernateDAOSupport之後不能重寫,所以這裡就出現了下面幾種可以得到hibernateTemplate的方法

①採用通過spring注入sessionFactory,前提是讓DAO層繼承hibernateDAOSupport,這樣DAO類也就有了sessionFactory,然後通過在xml中編寫進行注入。

這樣使用起來的確是很方便(詳情見後面程式碼)但是有不好的地方。其一你這個DAO層繼承了hibernateDAOSupport之後,由於Java只能繼承一個父類,便失去了繼承其他的可能性。其二,這回增加耦合度,讓程式碼至少不那麼“乾淨透明”

②採用通過我不繼承hibernateDAOSupport,而是直接給我的DAO層注入一個hibernateTemplate(因為我們的最終目標就是這個hibernateTemplate,我們注入sessionFactory是一個不得不為的行為,spring給我們的就是通過只要給spring一個sessionFactory,spring就還你一個hibernateTemplate)

這樣的話每一個DAO層中都有一個對hibernateTemplate的set方法(為了注入),這樣的確不用再去繼承hibernateDAOSupport,可DAO層的程式碼中會多和關鍵操作無關的程式碼,如上面的set

還是看程式碼直接清晰,如下

採用第一種方法:

<!-- 以下為使用者管理的依賴注入 -->
	<bean id="UserDao" class="org.nbu.lab1220.daoImpl.UserDaoImpl">
		<property name="sessionFactory">
			<ref local="sessionFactory" />
		</property>
	</bean>
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {

	 
	public ArrayList<User> loginVaild(String userAccount, String password) {
		 
		return (ArrayList<User>) getHibernateTemplate().find("from User p where p.userAccount=? and p.password=?",new Object[]{userAccount,password});
	}}                                                                                                                                               


採用第二種方法:
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  		<property name="sessionFactory" ref="sessionFactory"></property>
 	</bean>
<bean id="UserDao" class="org.nbu.lab1220.daoImpl.UserDaoImpl">
 		<property name="hibernateTemplate" ref="hibernateTemplate"></property>
</bean>

public class UserDaoImpl   implements UserDao{
	
	private HibernateTemplate hibernateTemplate;
	public HibernateTemplate getHibernateTemplate() {
		return hibernateTemplate;
	}

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
	
	
	@SuppressWarnings("unchecked")
	public ArrayList<User> loginVaild(String userAccount, String password) {
		 
		return (ArrayList<User>) this.hibernateTemplate.find("from User p where p.userAccount=? and p.password=?",new Object[]{userAccount,password});
	}}




----------------------------------------------------------------------------------------------------------------------

今天意外發現

spring3.1裡已經不提供hibernatedaosupport,hibernateTemplete了,只能用hibernate原生的session

相關推薦

關於DAOsessionFactory注入是否繼承HibernateDAOSupport

這個標題被我描述的太亂太雜了,其實要講的主要是關於怎麼得到用來操作資料層所使用的hibernateTemplate(另一個種方法是通過jdbcTemplate,但推薦使用第一種)。而hibernateTemplate是通過sessionFactory得到的,sessionF

Spring通過XML配置c3p0連線池dao註解注入使用 jdbcTemplate

Spring通過註解配置c3p0連線池和dao使用 jdbcTemplate 1.Spring配置c3p0連線池 第一步:匯入c3p0的jar包 第二步:建立Spring配置檔案,配置連線池 平常我們寫c3p0連線池時是這樣寫的:

JavaWeb中Dao的介面基本功能簡單抽取技巧

在dao層書寫具體實現類的時候會將dao層功能抽取到介面中,然後去實現該介面,實現具體方法,書寫具體功能程式碼。 抽取如圖:   但是這種抽取不是很友好,由圖可以看出,每個實現類中都要書寫共同的增刪改查方法,這樣就是使得程式碼存再冗餘,重複程式碼多次書寫。此時就需要

spring data jpa 裡 Dao中RepositoryJpaSpecificationExecutor的一個小坑

public interface LabelRepository extends Repository<Label, Lon

spring quartzy的spring注入問題(daoservice

許久沒有寫博文了,今天來寫寫,畢業設計中遇到的某個小問題,及解決方法。 畢業設計中涉及到spring的定時器quartzy的使用, 遇到的問題是:quartzy中不能使用spring注入的方式注入dao層和service層,原因是spring在載入的時候先載入quarzy,後加載bean

繼承hibernateDaoSupport之後通過註解方式注入SessionFactory

因為hibernateDaoSupport中setSessionFactory()方式是final的, 不能被重寫 ,  但是可以在繼承hibernateDaoSupport的子類中加入一個方法為SessionFactory注入值 程式碼如下: @Resource(name

java中Action、ServiceDao的功能區分

封裝 滿足 ont 事務管理 簡單 聲明式 所在 框架搭建 調用接口 Action/Service/DAO簡介:Action是管理業務(Service)調度和管理跳轉的。Service是管理具體的功能的。Action只負責管理,而Service負責實施。DAO只完成增刪改查

Spring boot的dao繼承jpa啟動報錯

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'xxxController': Unsatisfied dependency expressed thro

使用mybatis外掛generator生成實體類,daomapper對映

    本文主要講如何使用generator外掛自動生成我們所需要的實體類,Dao層和對應的mapper對映檔案,首先講一下命令列下用本地jar包使用,然後再講專案中整合進generator外掛進行生成。現在教程開始(Mysql資料庫為例) 一  本

JavaWeb三架構中ServiceDao物件單例化可行性

宣告:以下個人觀點,僅作參考;    閱讀正文的前提知識:   一. 單例模式:   單例概念(百度): 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中,應用該模式的類一個類

工具類中如何注入DaoBean

@Component public class UserRequest { @Autowired private SysUserDao sysUserDao; private static UserRequest UserRequest; @PostConstruct pub

SSM框架下,spring中servicedao的關係

【部分轉載】 1、java web 中dao 層和service層都使用介面,是否是為使用介面而使用介面? 一個dao或者一個service都是一個介面,然後再一個類去實現,為什麼不直接使用一個類呢?在入門級(單表)的SSM+maven程式碼裡面,我們甚至可以看到dao和service的介面

Action、ServiceDao的功能區分

Action/Service/DAO簡介: Action是管理業務(Service)排程和管理跳轉的。 Service是管理具體的功能的。 Action只負責管理,而Service負責實施。 DAO只完成增刪改查,雖然可以1-n,n-n,1-1關聯,模糊、動態、子查詢都可以。但是無論多麼複雜的查詢,dao只是

使用MyBatis Generator自動生成實體、mapperdao

本人使用: 整合開發環境:idea 專案管理工具:maven 資料庫:oracle 框架:Spring+SpringMVC+myBatis 主要步驟: 在pom.xml中加入外掛依賴 寫mbgConfiguration.xml檔案,jdbc.propertie

spring的一個事務管理,在controllerdao都可以用

import org.springframework.transaction.support.DefaultTransactionDefinition; public PlatformTransactionManager getTransactionManager() { re

jdbc的daoJDBCUtils

DAO層的實現: package com.qyl.dao; public class Dept { private Integer id; private String name; public Integer getId() { return id; }

JAVA中Action, Service ,modle Dao的功能區分

首先這是現在最基本的分層方式,結合了SSH架構。modle層就是對應的資料庫表的實體類。Dao層是使用了hibernate連線資料庫、操作資料庫(增刪改查)。Service層:引用對應的Dao資料庫操作,在這裡可以編寫自己需要的程式碼(比如簡單的判斷)。Action層:引用

SpringMVC Dao注入到Service,Service注入到controller及相關XML

1 本人新手,剛開始學習SringMVC框架,需要各個層之間的注入。 舉個例子: 最初,在dao層實現service的方式是,new出來一個(每個方法都要new一次)。 IServiceImpl service =new IServiceImpl(); service.fill();

框架學習(1)——servicedaoservice實現類進行資料庫操作

最近也是比較忙,也只能忙裡偷閒地抓緊時間接著學習一下技術,自從上次學習了maven之後,越來越對框架產生了興趣,下了好多的spring視屏,聽著老師的建議,最近也萌生了看別人的程式碼進行學習的想法,然後就上了知乎搜了搜優秀的java框架,發現了一個比較感興趣的,

Spring配置事務在DaoService

【轉載自http://www.blogjava.net/hk2000c/archive/2007/11/01/157508.html】 【感謝原作者:hk2000c】 Spring通過AOP實現宣告式事務管理。通常通過TransactionProxyFactoryBean設