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

          昨天用Spring寫DAO,有朋友說比較Hibernate還是麻煩一點.所以今天來看一下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,確實方便了很多.

          寫個接口先
          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!!!

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

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

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

          /*
           * 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ā)表評論。


          網站導航:
           
          主站蜘蛛池模板: 德格县| 平顺县| 凌源市| 墨玉县| 图木舒克市| 北宁市| 韩城市| 泸定县| 长顺县| 同心县| 五常市| 南汇区| 浦江县| 同江市| 大城县| 昔阳县| 包头市| 兴海县| 杂多县| 个旧市| 洞口县| 扶余县| 融水| 且末县| 贵州省| 德化县| 武功县| 宁津县| 固安县| 谷城县| 榆社县| 西平县| 蒙自县| 黔西| 南京市| 当涂县| 汝城县| 托克逊县| 襄樊市| 大田县| 新泰市|