隨筆-51  評論-14  文章-0  trackbacks-0

          昨天用Spring寫DAO,有朋友說比較Hibernate還是麻煩一點(diǎn).所以今天來看一下Spring和Hibernate有多方便啦.

          我用的IDE是Eclipse2.1.2

          下面是要引入的JAR包
          <?xml version="1.0" encoding="UTF-8"?>
          <classpath>
              <classpathentry kind="src" path="src"/>
              <classpathentry kind="var" path="JRE_LIB" sourcepath="JRE_SRC"/>
              <classpathentry kind="lib" path="D:/classes/spring.jar"/>
              <classpathentry kind="lib" path="D:/classes/junit-3.8.1.jar"/>
              <classpathentry kind="lib" path="D:/classes/commons-logging-1.0.3.jar"/>
              <classpathentry kind="lib" path="D:/classes/spring-dao.jar"/>
              <classpathentry kind="lib" path="D:/classes/mysql-connector-java-3.0.9-stable-bin.jar"/>
              <classpathentry kind="lib" path="D:/classes/commons-dbcp-1.1.jar"/>
              <classpathentry kind="lib" path="D:/classes/commons-pool-1.1.jar"/>
              <classpathentry kind="lib" path="D:/classes/commons-collections.jar"/>
              <classpathentry kind="lib" path="D:/classes/commons-beanutils.jar"/>
              <classpathentry kind="lib" path="D:/classes/commons-lang-2.0.jar"/>
              <classpathentry kind="lib" path="D:/classes/hibernate2.jar"/>
              <classpathentry kind="lib" path="D:/classes/jta.jar"/>
              <classpathentry kind="lib" path="D:/classes/dom4j-1.4.jar"/>
              <classpathentry kind="lib" path="D:/classes/ehcache.jar"/>
              <classpathentry kind="lib" path="D:/classes/odmg.jar"/>
              <classpathentry kind="lib" path="D:/classes/cglib-2.0-rc2.jar"/>
              <classpathentry kind="output" path="bin"/>
          </classpath>

          今天還是先看看Spring的配置文件吧,Hibernate和Spring融合,大部分功能由配置文件搞定了.

          Hibernate-Context.xml文件

          <?xml version="1.0" encoding="UTF-8" ?>
          <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
          <beans>
          <description>Spring Quick Start</description>
          <!-- datasource -->
          <bean id="datasource"
                class="org.apache.commons.dbcp.BasicDataSource"
                destroy-method="close">
              <property name="driverClassName">
                  <value>com.mysql.jdbc.Driver</value>
              </property>
              <property name="url">
                  <value>jdbc:mysql://localhost/test</value>
              </property>
              <property name="username">
                  <value>root</value>
              </property>
              <property name="password">
                  <value></value>
              </property>
          </bean>
          <!-- hibernate support -->
          <bean id="sessionFactory"
                class="org.springframework.orm.hibernate.LocalSessionFactoryBean"
                >
              <property name="dataSource">
                  <ref local="datasource"/>
              </property>
              <property name="mappingResources">
                  <list>
                      <value>com/bcxy/dao/hibernate/Test.hbm.xml</value>
                  </list>
              </property>
              <property name="hibernateProperties">
                  <props>
                      <prop key="hibernate.dialect">
                          net.sf.hibernate.dialect.MySQLDialect
                      </prop>
                      <prop key="hibernate.show_sql">
                          true
                      </prop>
                  </props>
              </property>
          </bean>
          <!-- hibernate dao -->
          <bean id="hibernatedao"
                class="com.bcxy.spring.dao.TestDAO"
                >
              <property name="sessionFactory">
                  <ref local="sessionFactory"/>
              </property>
          </bean>

          Spring管理了Hibernate的Session,確實(shí)方便了很多.

          寫個接口先
          ITtestDAO.java文件

          package com.bcxy.spring.dao;

          import com.bcxy.dao.hibernate.Test;

          public interface ITestDAO {
           
           void insertTest(Test test);

          }

          TestDAO.java文件

          package com.bcxy.spring.dao;

          import org.springframework.orm.hibernate.support.HibernateDaoSupport;

          import com.bcxy.dao.hibernate.Test;

          public class TestDAO extends HibernateDaoSupport implements ITestDAO {

           public void insertTest(Test test) {
            //
            getHibernateTemplate().save(test);
           }

          }

          需要繼承HibernateDaoSupport類

          這么少的幾行代碼,能用嗎?來用JUnit測試一下吧.

          /*
           * Created on 2004-10-9
           *
           * To change the template for this generated file go to
           * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
           */
          package test;

          import java.io.FileInputStream;
          import java.io.FileNotFoundException;

          import junit.framework.TestCase;

          import org.springframework.beans.BeansException;
          import org.springframework.beans.factory.xml.XmlBeanFactory;

          import com.bcxy.dao.hibernate.Test;
          import com.bcxy.spring.dao.ITestDAO;

          public class TestDAOTest extends TestCase {

          .......
           public void testInsertTest() throws BeansException, FileNotFoundException {
            XmlBeanFactory beans = new XmlBeanFactory(new FileInputStream("Hibernate-Context.xml"));
            ITestDAO tests = (ITestDAO)beans.getBean("hibernatedao");
            Test test = new Test();
            test.setId(8);
            test.setUn("testtest");
            test.setPw("testtest");
            tests.insertTest(test);
           }
          ......
          }

          真的可以用啊,太厲害了--Spring!!!

          這段代碼似乎并沒有什么特殊,但有一個細(xì)微之處:
          ITestDAO tests = (ITestDAO)beans.getBean("hibernatedao");
          這里并沒有直接用UserDAO對獲得的Bean實(shí)例進(jìn)行強(qiáng)制轉(zhuǎn)型。這與上面
          JdbcTemplate的測試代碼不同。并非完全出自設(shè)計上的考慮,這里情況有些特殊,我們可
          以嘗試一下用TestDAO類對bean實(shí)例進(jìn)行強(qiáng)制轉(zhuǎn)型,不過將得到一個
          ClassCastException,程序異常中止。
          為什么會出現(xiàn)這樣的問題?是不是只有在使用Hibernate才會出現(xiàn)這樣的問題?事實(shí)
          并非如此,如果對上面基于JdbcTempate的TestDAO進(jìn)行改造,使之實(shí)現(xiàn)ITestDAO接口,
          同樣的問題也將會出現(xiàn)。ITestDAO接口本身非常簡單,顯然也不是導(dǎo)致異常的原因所在。
          原因在于Spring的AOP實(shí)現(xiàn)機(jī)制,前面曾經(jīng)提及,Spring中的事務(wù)管理實(shí)際上是基于
          動態(tài)AOP機(jī)制實(shí)現(xiàn),為了實(shí)現(xiàn)動態(tài)AOP,Spring在默認(rèn)情況下會使用Java Dynamic
          Proxy,但是,Dynamic Proxy要求其代理的對象必須實(shí)現(xiàn)一個接口,該接口定義了準(zhǔn)備
          進(jìn)行代理的方法。而對于沒有實(shí)現(xiàn)任何接口的Java Class,需要采用其他方式,Spring通
          過CGLib10實(shí)現(xiàn)這一功能。
          當(dāng)TestDAO沒有實(shí)現(xiàn)任何接口時(如JdbcTemplate示例中)。Spring通過CGLib對
          TestDAO進(jìn)行代理,此時getBean返回的是一個繼承自TestDAO類的子類實(shí)例,可以通
          過TestDAO對其強(qiáng)制轉(zhuǎn)型。而當(dāng)TestDAO實(shí)現(xiàn)了ITestDAO接口之后,Spring將通過Java
          Dynamic Proxy機(jī)制實(shí)現(xiàn)代理功能,此時返回的Bean,是通過
          java.lang.reflect.Proxy.newProxyInstance方法創(chuàng)建的ITestDAO接口的一個代理實(shí)
          現(xiàn),這個實(shí)例實(shí)現(xiàn)了ITestDAO接口,但與TestDAO類已經(jīng)沒有繼承關(guān)系,因此無法通過
          TestDAO強(qiáng)制轉(zhuǎn)型。

          參考: 夏昕--<Spring開發(fā)指南>

          有一個問題,就是什么時間,在什么地點(diǎn),如何生成可取得Bean對象的實(shí)例?
          下面有一個例子:

          /*
           * Created on Mar 12, 2004
           *
           * (c) 2004, Mark Eagle, meagle@meagle.com
           * relased under terms of the GNU public license
           * http://www.gnu.org/licenses/licenses.html#TOCGPL
           */
          package com.meagle.action;

          import javax.servlet.ServletContext;

          import org.apache.struts.action.Action;
          import org.apache.struts.action.ActionServlet;
          import org.springframework.web.context.WebApplicationContext;
          import org.springframework.web.context.support.WebApplicationContextUtils;

          import com.meagle.service.IOrderService;

          /**
           * @author meagle
           *
           * 
           */
          public abstract class BaseAction extends Action {

           private IOrderService orderService;

           public void setServlet(ActionServlet actionServlet) {
            super.setServlet(actionServlet);
            ServletContext servletContext = actionServlet.getServletContext();
            WebApplicationContext wac =
             WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
            this.orderService = (IOrderService) wac.getBean("orderService");
           }

           protected IOrderService getOrderService() {
            return orderService;
           }

          }

          請大家提示一下,還有什么方式呢?



          Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=248370

          posted on 2008-03-29 17:36 Hank1026 閱讀(277) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 山东省| 曲靖市| 九龙坡区| 多伦县| 石楼县| 贵定县| 阳东县| 陈巴尔虎旗| 宽甸| 任丘市| 寻乌县| 普宁市| 长白| 辉南县| 海门市| 台安县| 望都县| 博兴县| 江口县| 沙坪坝区| 平塘县| 壤塘县| 资源县| 奉化市| 邮箱| 新邵县| 调兵山市| 蓬莱市| 兴海县| 台东市| 舞钢市| 威宁| 峡江县| 禄丰县| 绥芬河市| 温泉县| 灌云县| 广德县| 盐边县| 碌曲县| 赞皇县|