<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實例進行強制轉型。這與上面
    JdbcTemplate的測試代碼不同。并非完全出自設計上的考慮,這里情況有些特殊,我們可
    以嘗試一下用TestDAO類對bean實例進行強制轉型,不過將得到一個
    ClassCastException,程序異常中止。
    為什么會出現這樣的問題?是不是只有在使用Hibernate才會出現這樣的問題?事實
    并非如此,如果對上面基于JdbcTempate的TestDAO進行改造,使之實現ITestDAO接口,
    同樣的問題也將會出現。ITestDAO接口本身非常簡單,顯然也不是導致異常的原因所在。
    原因在于Spring的AOP實現機制,前面曾經提及,Spring中的事務管理實際上是基于
    動態AOP機制實現,為了實現動態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方法創建的ITestDAO接口的一個代理實
    現,這個實例實現了ITestDAO接口,但與TestDAO類已經沒有繼承關系,因此無法通過
    TestDAO強制轉型。

    參考: 夏昕--<Spring開發指南>

    有一個問題,就是什么時間,在什么地點,如何生成可取得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 閱讀(276) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: www亚洲精品少妇裸乳一区二区| 性做久久久久久久免费看| 亚洲AV无码成人精品区大在线| 国产亚洲福利在线视频| 成人免费淫片在线费观看 | 亚洲综合精品香蕉久久网97| 国产免费AV片在线观看 | 四虎永久免费地址在线网站 | 日本亚洲色大成网站www久久| 日韩在线不卡免费视频一区| 亚洲成在人天堂一区二区| 日韩精品在线免费观看| 久久夜色精品国产亚洲AV动态图| 99国产精品免费视频观看| 91亚洲自偷在线观看国产馆| 成人毛片免费视频| 色视频在线观看免费| 亚洲精品午夜无码电影网| 99久久人妻精品免费一区| 亚洲人成7777| avtt亚洲天堂| 精品免费tv久久久久久久| 亚洲国产精品成人综合色在线婷婷| 男人的好免费观看在线视频| 国产亚洲午夜精品| 精品亚洲永久免费精品| 亚洲人成免费电影| 色欲aⅴ亚洲情无码AV蜜桃| 亚洲国产综合精品中文字幕| 一级毛片免费视频| 蜜芽亚洲av无码一区二区三区| 一本久久a久久精品亚洲| 最近免费2019中文字幕大全| 亚洲国产成人无码AV在线| 亚洲精品无码午夜福利中文字幕| 在线a免费观看最新网站| 一级毛片在线免费视频| 亚洲天堂电影在线观看| 免费国产高清视频| 久久免费看黄a级毛片| 免费无码AV一区二区|