<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

    參考: 夏昕--<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 閱讀(279) 評論(0)  編輯  收藏

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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲综合一区国产精品| 亚洲精品tv久久久久久久久| 亚洲国产福利精品一区二区| 国产成人一区二区三区视频免费| 亚洲精品~无码抽插| 免费黄网站在线观看| 亚洲精品国产成人99久久| 亚欧免费无码aⅴ在线观看| 亚洲人成电影在线天堂| 最近免费中文在线视频| 亚洲一级片在线播放| 无码日韩人妻av一区免费| 亚洲乱妇老熟女爽到高潮的片| 成人免费毛片观看| 国产精品久久久久久亚洲小说| 夜色阁亚洲一区二区三区| 黄色网页在线免费观看| 亚洲国产人成在线观看69网站 | 国产一区二区三区免费看| 国产亚洲精品美女久久久久| 精品亚洲一区二区三区在线播放| 最近国语视频在线观看免费播放| 久久久久久久久亚洲| 国产精品色拉拉免费看| 无码天堂亚洲国产AV| 亚洲精品无码专区久久久 | 亚洲美国产亚洲AV| 亚洲Av无码乱码在线znlu| 日韩精品无码免费专区午夜不卡| 337p日本欧洲亚洲大胆精品555588 | 亚洲成AV人片在WWW色猫咪| 国产精品永久免费10000| 添bbb免费观看高清视频| 亚洲精品tv久久久久久久久| 2021国产精品成人免费视频| 小说专区亚洲春色校园| 国产亚洲精品一品区99热| 女人18毛片免费观看| 三年片免费高清版| 亚洲综合色一区二区三区| 亚洲线精品一区二区三区|