Spring Hibernate Hello World Example 專案 之 XML Mapping 第2版 本範例實作說明: 本篇主要使用 Spring 及 Hibernate,做一個基本測試專案,     Spring 使用 Spring bean。 Hibernate 使用 XML Mapping。 本範例使用到 PostgreSQL 及 log4j 第2版 1、主要加入 DAO 架構 2、使用Spring 3 orm jar 裡的 HibernateDaoSupport Class。 (在Spring 4 以上就沒支援 HibernateDaoSupport) 一、範例開發準備工具   作業系統: Windows 7 開發工具: Eclipse Java EE IDE for Web Developers Juno Service Release2 JAVA JDK : JDK1.7.0_60 資料庫  : PostgreSQL 9.3 其它相關: Maven 4.0   Hibernate Version 3.5.6-Final   Spring Framework 3.2.2.RELEASE 二、新增Maven範例專案 範例專案名稱: SpringHibernateHelloWorldExample2 圖1 開啟Eclipse -> File -> New -> Maven Project   (如果沒看到Maven Project ,Eclipse -> File -> New -> Other.. ->)

圖2 選擇專案存放位置 use default Workspase location-> Next    選擇存放在預設的工作資料夾下(就是你開Eclipse時,選擇Workspase下)

圖3 使用 Maven 範本    本例選用: Group id : org.apache.maven.archetypes Artifact id : maven-archetype-quickstart Version : RELEASE    -> Next 註: Group id為公司名稱 or 群組分類名稱 Artifact Id 為專案標識符,就是專案名稱

圖4 範例專案 Group id : SpringHibernateHelloWorldExample2 Artifact id : SpringHibernateHelloWorldExample2 Version : 0.0.1-SNAPSHOT Package : com.levin       -> Finish

圖5 新增專案後,基本預設資料

三、使用相關jar檔 圖6 開啟 pom.xml

 

pom.xml內容:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>SpringHibernateHelloWorldExample2</groupId>
 <artifactId>SpringHibernateHelloWorldExample2</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>SpringHibernateHelloWorldExample2</name>
 <url>http://maven.apache.org</url>
 <properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <spring.version>3.2.2.RELEASE</spring.version>
  <hibernate.version>3.5.6-Final</hibernate.version>
  <jdk.version>1.7</jdk.version>
  <org.slf4j-version>1.6.1</org.slf4j-version>
  <junit.version>4.11</junit.version>
 </properties>

 <dependencies>
  <!-- Spring 3 dependencies -->
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context</artifactId>
   <version>${spring.version}</version>
  </dependency>
  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-orm</artifactId>
   <version>${spring.version}</version>
  </dependency>

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-tx</artifactId>
   <version>${spring.version}</version>
  </dependency>

  <dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>${spring.version}</version>
  </dependency>

  <!-- Hibernate framework -->
  <dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-core</artifactId>
   <version>${hibernate.version}</version>
  </dependency>
  <dependency>
   <groupId>javassist</groupId>
   <artifactId>javassist</artifactId>
   <version>3.12.1.GA</version>
  </dependency>

  <!-- postgresql database driver -->
  <dependency>
   <groupId>org.postgresql</groupId>
   <artifactId>postgresql</artifactId>
   <version>9.3-1100-jdbc41</version>
  </dependency>

  <!-- Junit -->
  <dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>${junit.version}</version>
   <scope>test</scope>
  </dependency>

  <!-- Logging -->
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-api</artifactId>
   <version>${org.slf4j-version}</version>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
   <version>${org.slf4j-version}</version>
   <scope>runtime</scope>
  </dependency>
  <dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.15</version>
   <exclusions>
    <exclusion>
     <groupId>javax.mail</groupId>
     <artifactId>mail</artifactId>
    </exclusion>
    <exclusion>
     <groupId>javax.jms</groupId>
     <artifactId>jms</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jdmk</groupId>
     <artifactId>jmxtools</artifactId>
    </exclusion>
    <exclusion>
     <groupId>com.sun.jmx</groupId>
     <artifactId>jmxri</artifactId>
    </exclusion>
   </exclusions>
   <scope>runtime</scope>
  </dependency>

 </dependencies>

 <build>
  <finalName>SpringHibernateHelloWorldExampleTest2</finalName>
  <plugins>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-eclipse-plugin</artifactId>
    <version>2.9</version>
    <configuration>
     <downloadSources>true</downloadSources>
     <downloadJavadocs>false</downloadJavadocs>
    </configuration>
   </plugin>
   <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
     <source>${jdk.version}</source>
     <target>${jdk.version}</target>
    </configuration>
   </plugin>
  </plugins>
 </build>
</project>

四、相關resources   建立resources 路徑 src/main/resources 圖7 建立相關 resources    將 resources 加入到 source folders on build path。    在專案按右鍵 -> Properties 進入Properties介面 -> Java Build Path -> Source -> Add Folder.. ->進入 Source Folder Selection介面 -> 選擇 打勾 resources    -> OK -> OK

圖8 建立設定檔

database/DataSource.xml database/hibernate.cfg.xml dbconfig/jdbc.postgresql.properties SpringBeans.xml log4j.properties 五、建立  hibernate.cfg.xml 路徑: src/main/resources/database 檔名:hibernate.cfg.xml 說明:hibernate相關主要設定,如:Hibernate session factory 、transaction 管理 。

hibernate.cfg.xml內容:
<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-3.0.xsd">

 <!-- Hibernate session factory -->
 <bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

 <!-- Hibernate session factory -->
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="dataSource" />
  </property>
  <property name="hibernateProperties">
   <props>

    <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
    <prop key="hibernate.show_sql">true</prop>
    <prop key="hibernate.format_sql">true</prop>
    
    <!-- hibernate 相關效能設定 -->
    <prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
    <prop key="hibernate.connection_pool_size">1</prop>
    <!--<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> -->
    <!-- validate | update | create | create-drop 如果沒要用 set value="none". -->
    <!-- validate 程式執行驗證資料對應表相關資料。 update 如果table已存在,就更新, 不存在則新增 create 每次執行就自動刪除所有對應的table,再新增所有對應的table 
     create-drop 新增所有對應的table , 程式關閉前刪除所有對應的table -->
    <prop key="hibernate.hbm2ddl.auto">create</prop>

   </props>
  </property>
  <property name="mappingResources">
   <list>
    <value>/com/levin/model/hbm/message.hbm.xml</value>
   </list>
  </property>
 </bean>

 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>

</beans>    

六、建立  DataSource.xml 路徑: src/main/resources/database 檔名:DataSource.xml 說明:資料庫設定檔,資料庫連線資訊等。

DataSource.xml內容:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
 
 <!--讀取 DataBase properties檔 -->
 <!--使用資料庫 相關設定 -->
 <!--連線資料 (url)、帳號(username)及密碼(password) -->
 <bean id="propertyConfigurer"
  class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
  p:location="classpath:/dbconfig/jdbc.postgresql.properties" />

 <!-- DataBase -->
 <bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
   <value>${jdbc.driverClassName}</value>
  </property>
  <property name="url">
   <value>${jdbc.url}</value>
  </property>
  <property name="username">
   <value>${jdbc.username}</value>
  </property>
  <property name="password">
   <value>${jdbc.password}</value>
  </property>
 </bean>

</beans>

七、建立  jdbc.postgresql.properties 路徑: src/main/resources/dbconfig 檔名:jdbc.postgresql.properties 說明:資料庫連線資訊等。 本例資料庫名稱: hibernateTest

jdbc.postgresql.properties內容:
jdbc.driverClassName= org.postgresql.Driver
jdbc.dialect=org.hibernate.dialect.PostgreSQLDialect
jdbc.url=jdbc:postgresql://127.0.0.1:5433/hibernateTest
jdbc.username=postgres
jdbc.password=postgres

八、建立 log4j.properties 路徑: src/main/resources 檔名:log4j.properties 說明:log4j 設定檔 ,記錄資訊用的,可不建此檔。

log4j.properties內容:
# Root logger option
log4j.rootLogger=INFO, stdout

# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

 
# Hibernate logging options (INFO only shows startup messages)
log4j.logger.org.hibernate=trace
 
# Log JDBC bind parameter runtime arguments
log4j.logger.org.hibernate.type=trace

九、建立 Spring bean檔 SpringBeans.xml 路徑: src/main/resources 檔名:SpringBeans.xml 說明:Spring Bean設定檔 。

SpringBeans.xml 內容:
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:p="http://www.springframework.org/schema/p"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

 <bean id="messageBean" class="com.levin.model.Message" />

 <bean id="messageDao" class="com.levin.dao.impl.MessageDaoImpl">
  <property name="hibernateTemplate" ref="hibernateTemplate" />
 </bean>

 <bean id="messageService" class="com.levin.service.impl.MessageService">
  <property name="messageDao" ref="messageDao" />
 </bean>
 
 <!-- Database Configuration -->
 <import resource="/database/DataSource.xml"/>
 <import resource="/database/hibernate.cfg.xml"/>

 

</beans>

十、建立table 對應檔 message.hbm.xml 及 Message.java 圖9

十一、建立 message.hbm.xml 路徑:src/main/java/com/levin/model/hbm/ 檔名:message.hbm.xml 說明:table 對應檔,設定table 名稱及欄位設定等。

message.hbm.xml內容:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="com.levin.model.Message" table="message">
        <id name="messageId" type="java.lang.Integer">
            <column name="MESSAGE_ID" />
            <generator class="identity" />
        </id>
        <property name="messageCode" type="string">
            <column name="MESSAGE_CODE" length="10" not-null="true" unique="true" />
        </property>
        <property name="messageName" type="string">
            <column name="MESSAGE_NAME" length="20" not-null="true" unique="true" />
        </property>
    </class>
</hibernate-mapping>

十二、建立 Message.java 路徑: src/main/java/com/levin/model 檔名:Message.java 說明:資料模型,裝table資料及存取資料。

Message.java 程式內容:
package com.levin.model;

/**
 * Model class for Message.java
 */
public class Message implements java.io.Serializable {

 private static final long serialVersionUID = 1L;

 private Integer messageId;
 private String messageCode;
 private String messageName;

 public Message() {
 }

 public Message(String messageCode, String messageName) {
  this.messageCode = messageCode;
  this.messageName = messageName;
 }

 public Integer getMessageId() {
  return messageId;
 }

 public void setMessageId(Integer messageId) {
  this.messageId = messageId;
 }

 public String getMessageCode() {
  return messageCode;
 }

 public void setMessageCode(String messageCode) {
  this.messageCode = messageCode;
 }

 public String getMessageName() {
  return messageName;
 }

 public void setMessageName(String messageName) {
  this.messageName = messageName;
 }
}

十三、建立 DAO 程式 1、路徑: src/main/java/com/levin/dao DAO(Data Access Object) 主要是資料庫 處理及操作 更為方便, 用來封裝資料庫持久層的操作。 圖10

2、建立 DAO Interface 路徑: src/main/java/com/levin/dao 名稱:MessageDao.java

MessageDao.java 程式內容:
  package com.levin.dao;

  import java.util.List;

  import com.levin.model.Message;

  public interface MessageDao {
   
   public void save(Message message);
   public List findAll();
   
  }
 

3、建立 DAO 實作 路徑: src/main/java/com/levin/dao/impl 名稱:MessageDaoImpl.java 註: 這裡有extends HibernateDaoSupport 記得 import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 主要可以自動使用交易管控。

MessageDaoImpl.java 程式內容:
  package com.levin.dao.impl;

  import java.util.List;

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

  import com.levin.dao.MessageDao;
  import com.levin.model.Message;

  public class MessageDaoImpl extends HibernateDaoSupport implements MessageDao{
   
   private static final String GETALLSTMT = "from Message order by messageId";
   
   public void save(Message message){
    getHibernateTemplate().save(message);
   }
   
   @SuppressWarnings("unchecked")
   public List findAll() {
    return  getHibernateTemplate().find(GETALLSTMT);
   }
  }

 

十四、建立 service 程式 1、路徑: src/main/java/com/levin/service 圖11 IMessageService.java 及 MessageService.java

2、建立 Service Interface 路徑: src/main/java/com/levin/service 名稱:IMessageService.java

IMessageService.java 程式內容:
  package com.levin.service;

  import java.util.List;

  import com.levin.model.Message;

  public interface IMessageService {
   public void insertMessage(String code,String name);
   public List findAll();
  }

 

3、建立 Service 實作 路徑: src/main/java/com/levin/service/impl 名稱:MessageService.java

MessageService.java 程式內容:
  package com.levin.service.impl;

  import java.util.List;

  import com.levin.dao.MessageDao;
  import com.levin.model.Message;
  import com.levin.service.IMessageService;

  public class MessageService implements IMessageService {

   private MessageDao messageDao;

   public void setMessageDao(MessageDao messageDao) {
    this.messageDao = messageDao;
   }

   @Override
   public void insertMessage(String code, String name) {
    messageDao.save(new Message(code,name));
   }

   @Override
   public List findAll() {
    return messageDao.findAll();
   }
  }


 

說明:對應SpringBeans.xml 的 bean name是messageService裡property name。

  private MessageDao messageDao;

  public void setMessageDao(MessageDao messageDao) {
   this.messageDao = messageDao;
  }
 

十五、建立主執行程式 路徑: src/main/java/com/levin/core 名稱:HibernateMain.java 圖12

HibernateMain.java 程式內容:
 package com.levin.core;

 import java.util.List;

 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.support.ClassPathXmlApplicationContext;

 import com.levin.model.Message;
 import com.levin.service.IMessageService;

 /**
  * Hibernate Hello world!
  * 
  */
 public class HibernateMain {
  private static Logger log = LoggerFactory.getLogger(HibernateMain.class);
  
  public static void main(String[] args) {
   log.info("Maven + Srping + Hibernate + PostgreSQL Hello World! ");
   ApplicationContext context = new ClassPathXmlApplicationContext("SpringBeans.xml");
   IMessageService messageService = (IMessageService) context.getBean("messageService");
   
   messageService.insertMessage("TEST_3", "Hello World TEST 3");
   messageService.insertMessage("TEST_4", "Hello World TEST 4");
   messageService.insertMessage("TEST_1", "Hello World TEST 1");
   messageService.insertMessage("TEST_2", "Hello World TEST 2");
   
   //查出所有資料
   List messageList = messageService.findAll();

   if (null != messageList) {
    for (Message message : messageList) {
     log.info("MessageId:" + message.getMessageId());
     log.info("MessageCode:" + message.getMessageCode());
     log.info("MessageName:" + message.getMessageName());
    }
   }

  }

 }

 

十五、執行測試 圖13 在專案按右鍵 -> Run As -> Java Application

        圖14 Console 執行結果

圖15 資料庫檢查

十六、參考第1版 Spring Hibernate Hello World Example 專案 之 XML Mapping 十七、其它參考 Struts + Spring + Hibernate 目錄 Spring Hello World Example 專案 Hibernate Hello World Example 專案 之 XML Mapping

其它文章

文章標籤
全站熱搜
創作者介紹
創作者 PG Levin Li 的頭像
PG Levin Li

程式開發學習之路

PG Levin Li 發表在 痞客邦 留言(0) 人氣(69)