2011年4月12日 星期二

Spring 教學 - Spring 整合 Hibernate

Spring 除了對 JDBC 進行了封裝之外,也對於目前眾多的 ORM 工具提供了集成

而目前較流行的 ORM 解決方案大概就是 Hibernate 了,所以來看看如何用Spring來整合吧

首先以下的測試環境為 Eclipse 一般的 Java Application,並搭配 DBCP 連接池

專案建立好後  在 src 目錄下先來建立一下測試用的映射文件以及 DAO ((model 省略...

注意一點的是 映射文件和 model 盡量放在同一目錄下


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="org.pojo.Good" table="goods" >
      <id name="id" column="id">
          <generator class="native" />
      </id>
      <property name="viewpic" column="viewpic" />
      <property name="name" column="name" />
      <property name="price" column="price" />
      <property name="storenum" column="storenum" />
      <property name="maaker" column="maker" />
      <property name="info" column="info" />
      <property name="uptime" column="uptime" />
  </class>
</hibernate-mapping>


package org.dao;

import java.util.List;

import org.pojo.Good;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

/*** 在 Spring 框架中,將自定義的 DAO 繼承 
org.springframework.orm.hibernate3.support.HibernateDaoSupport ***/
public class GoodDao extends HibernateDaoSupport  //繼承 HibernateDaoSupport  
{
    public void insert(Good good){
        getHibernateTemplate().save(good);  
    } 
    
    public Good findById(int id){
        Good good = null;
        good = (Good)getHibernateTemplate().get(Good.class, id);
        return good;
    }
    public List findAll(){
        List list = getHibernateTemplate().find("FROM Good");
        return list;
    }
}


接下來在 src 目錄下配置一下 ApplicationContext.xml,程式大致如下

以下有一段跟配置DBCP連接持的做法一樣

可參考這篇文章 http://programer-learn.blogspot.com/2011/03/spring-dbcp.html


<?xml version="1.0" encoding="UTF-8"?>
<beans
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/shopcar"/>
    <property name="username" value="root"/>
    <property name="password" value="ooxxooxx"/>
    </bean>
   
    //命名為 sessionFactory 的 bean, 代表hibernate的sessionFactory
    //需將 dataSource 注入給它
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource">
         <ref bean="dataSource" />
    </property>
   
    //以下是 Hibernate 配置文件中常見的 很眼熟吧
    <property name="hibernateProperties">
         <props>
             <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
             <prop key="hibernate.show_sql">true</prop>
             <prop key="hibernate.format_sql">true</prop>
         </props>
    </property>
   
    //這裡註冊了 Hibernate 的映射文件
    <property name="mappingResources">
         <list>
             <value>org/pojo/Good.hbm.xml</value>
         </list>
    </property>
    </bean>
   
    //將 sessionFactory 注入到操作資料庫的dao
    <bean id="GoodDao" class="org.dao.GoodDao">
    <property name="sessionFactory">
         <ref local="sessionFactory"/>
    </property>
    </bean>
</beans>


最後寫點測試程式測試一下吧!!

package org.test;

import java.util.List;
import java.util.Map;
import org.dao.GoodDao;
import org.pojo.Good;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class testDemo {
    public static void main(String[] args)
    {
  ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
  GoodDao dao = (GoodDao)context.getBean("GoodDao");
  
  Good g = new Good();
  g.setInfo("耐磨耐打");
  g.setName("abc籃球");
  g.setMaaker("NIKE");
  g.setPrice(900);
  g.setStorenum(100);
  g.setUptime(new java.util.Date());
  g.setViewpic("goods/good20.jpg");
  dao.insert(g);
  
  List list = (List)dao.findAll();
  
  for(int i=0;i<list.size();i++){
   Good good = (Good)list.get(i);
   System.out.println(good.getName());
  }
 }
}

沒有留言:

張貼留言