2015年2月24日 星期二

Spring Hibernate Hello World Example 專案 之 XML Mapping 第3版

Spring Hibernate Hello World Example 專案 之 XML Mapping 第3版



本範例實作說明:
本篇主要使用 Spring 及 Hibernate,做一個基本測試專案,
    Spring 使用 Spring bean。
Hibernate 使用 XML Mapping。
本範例使用到 PostgreSQL 及 log4j

第3版
1、使用 Spring 4 orm jar 裡的 hibernate4 HibernateTemplate Class。
2、使用 HibernateTransactionManager Class。
3、使用 HibernateTemplate.findByCriteria 方法來查詢table所有資料


一、範例開發準備工具
 
作業系統: 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 4.3.8.Final
  Spring Framework 4.1.1.RELEASE

二、新增Maven範例專案
範例專案名稱: SpringHibernateHelloWorldExample3


圖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 : SpringHibernateHelloWorldExample3
Artifact id : SpringHibernateHelloWorldExample3
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>SpringHibernateHelloWorldExample3</groupId>
  <artifactId>SpringHibernateHelloWorldExample3</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>SpringHibernateHelloWorldExample3</name>
  <url>http://maven.apache.org</url>

<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <spring.version>4.1.1.RELEASE</spring.version>
  <hibernate.version>4.3.8.Final</hibernate.version>
  <jdk.version>1.7</jdk.version>
  <junit.version>4.11</junit.version>
 </properties>

 <dependencies>
  <!-- Spring 4 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>
  

  <!-- 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>

 </dependencies>

 <build>
  <finalName>SpringHibernateHelloWorldExampleTest3</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

圖7-1進入Properties介面 -> Java Build Path
-> Source -> Add Folder..
->進入 Source Folder Selection介面
-> 選擇 打勾 resources
   -> OK -> OK


圖8 建立設定檔

database/DataSource.xml
database/hibernate.cfg.xml
database/Hibernate.xml
dbconfig/jdbc.postgresql.properties
SpringBeans.xml
log4j.properties

五、建立  hibernate.cfg.xml
路徑: src/main/resources/database
檔名:hibernate.cfg.xml
說明:hibernate相關主要設定,如:使用資料庫 相關設定及hibernate 相關效能設定 。
hibernate.cfg.xml內容:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
 <session-factory>
  <!--使用資料庫 相關設定 -->
  <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
  <!-- hibernate 相關效能設定 -->
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="connection_pool_size">1</property>

  <!-- validate | update | create | create-drop 如果沒要用 set value="none". -->
  <!-- 
   validate 程式執行驗證資料對應表相關資料。
   update   如果table已存在,就更新,不存在則新增 
   create   每次執行就自動刪除所有對應的table,再新增所有對應的table 
   create-drop 新增所有對應的table , 程式關閉前刪除所有對應的table 
  -->
  <property name="hbm2ddl.auto">create</property>
  <!-- 是否顯示所有執行的sql -->
  <property name="show_sql">true</property>
  <!-- 對應資料表 -->
  <mapping resource="com/levin/model/hbm/message.hbm.xml"></mapping>
 </session-factory>
</hibernate-configuration>



六、建立  Hibernate.xml
路徑: src/main/resources/database
檔名:Hibernate.xml
說明:hibernate相關主要設定,如:Hibernate session factory 、transaction 管理 。
Hibernate.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.hibernate4.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"></property>
 </bean>

 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="configLocation" value="classpath:database/hibernate.cfg.xml" />
 </bean>
 
 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.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">

 <!-- Database Configuration -->
 <import resource="/database/DataSource.xml" />
 <import resource="/database/Hibernate.xml" />

 <bean id="baseDao" class="com.levin.dao.impl.BaseDao" parent="hibernateTemplate">
  <property name="transactionManager" ref="transactionManager" />
 </bean>

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

 <bean id="messageDao" class="com.levin.dao.impl.MessageDaoImpl"
  parent="baseDao"/>

 <bean id="messageService" class="com.levin.service.impl.MessageService">
  <property name="messageDao" ref="messageDao" />
 </bean>

</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



建立三支程式
impl/BaseDao.java
impl/MessageDaoImpl.java
/MessageDao.java

2、建立 BaseDao
路徑: src/main/java/com/levin/dao/impl/
名稱:BaseDao.java
說明:
BaseDao extends HibernateTemplate ,
主要使用 HibernateTransactionManager 來自訂交易控管。
BaseDao.java 程式內容:
  package com.levin.dao.impl;

  import org.springframework.orm.hibernate4.HibernateTemplate;
  import org.springframework.orm.hibernate4.HibernateTransactionManager;

  public class BaseDao extends HibernateTemplate {
   public HibernateTransactionManager transactionManager;
   public void setTransactionManager(HibernateTransactionManager transactionManager) {
    this.transactionManager = transactionManager;
   }
  }
 


3、建立 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 {
   void save(Message message);
   public List findAll();
  }
 



4、建立 DAO 實作
路徑: src/main/java/com/levin/dao/impl
名稱:MessageDaoImpl.java
說明:MessageDaoImpl extends BaseDao implements MessageDao

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

  import java.util.List;

  import org.hibernate.criterion.DetachedCriteria;
  import org.hibernate.criterion.Order;
  import org.springframework.transaction.TransactionDefinition;
  import org.springframework.transaction.TransactionStatus;
  import org.springframework.transaction.support.DefaultTransactionDefinition;

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

  public class MessageDaoImpl extends BaseDao implements MessageDao {
   
   public void save(Message message) {
    DefaultTransactionDefinition def = new DefaultTransactionDefinition();
    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
    TransactionStatus status = transactionManager.getTransaction(def);
    try {
     getSessionFactory().getCurrentSession().save(message);
     transactionManager.commit(status);
    } catch (Exception ex) {
     System.out.println("rollback");
     transactionManager.rollback(status);
    }
   }
   
   
   public List findAll() {
    DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Message.class); 
    beautyCriteria.addOrder(Order.desc("messageId"));
    List  list = (List ) this.findByCriteria(beautyCriteria);
    return list;
   }
  }


 



十四、建立 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;
   }

   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.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 {
   
   public static void main(String[] args) {
    System.out.println("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) {
      System.out.println("MessageId:" + message.getMessageId());
      System.out.println("MessageCode:" + message.getMessageCode());
      System.out.println("MessageName:" + message.getMessageName());
     }
    }
   }
  }


 


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

圖14 Console 執行結果


圖15 資料庫檢查

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


參考第2版
        Spring Hibernate Hello World Example 專案 之 XML Mapping 第2版


其它參考
Struts + Spring + Hibernate 目錄


Spring Hello World Example 專案


Hibernate Hello World Example 專案 之 XML Mapping






















其它文章

標籤

Oracle (150) Oracle DB (144) Oracle_DB (143) Oracle SQL (135) JAVA (82) css-基本類 (65) MySQL (59) CSS Selector (58) jQuery (49) JavaScript-基本類 (39) JavaScript (37) JavaScript HTML DOM (37) JavaScript-HTML_DOM (36) CSS3 (30) JAVA-基本類 (28) jQuery UI (27) Apache (23) Oracle GROUP BY (20) datepicker (20) Android (18) Oracle Date (17) c (17) JAVA-lang套件 (16) Linux (16) Oracle Sub Query (16) Spring-基本類 (16) jQuery-基本類 (16) MySQL-進階系列教學 (15) Android基本類 (14) Grails (14) Oracle join (14) SQLite (13) Spring (13) WIN7-基本類 (13) grails-基本類 (13) linux cent os (13) CKEditor (12) JAVA-流程控制類 (12) JAVA_Spring (12) PHP (11) MySQL-基本系列教學 (10) SQLite for java (10) Windows (10) c/c++ (10) Notepad++ (9) eclipse (9) jQuery-Selector (9) sqldeveloper (9) DB_Toad (8) JAVA_IDE_Eclipse (8) JavaScript-String類 (8) MySQL DB Toad (8) MySQL-DATE相關 (8) MySQL-函式相關 (8) Spring Bean (8) Android Studio (7) HTML5 (7) Hibernate (7) JAVA-OCWCD (7) JavaScript-陣列類 (7) JAVA-程式分享 (6) JAVA.util套件 (6) JavaScript-數學類 (6) MinGw (6) MySQL-其它類 (6) Spring MVC (6) Apache_Tomcat (5) Apache套件_POI (5) CSS (5) JavaScript-Date物件 (5) JavaScript-其它類 (5) PostgreSQL (5) centos (5) httpd (5) log4j (5) 基本資訊 (5) CSS Properties (4) Dev-C++ (4) Oracle DDL (4) Servlet (4) Sublime (4) apache_Maven (4) Android NDK (3) Eclipse IDE for C/C++ (3) Hibernate-基本類 (3) JAVA-問題 (3) JAVA-綀習分享 (3) Linux 指令 (3) Proxy Server (3) Spring Mobile (3) Squid (3) VirtualBox (3) maven (3) zk (3) 生活其它 (3) Bootstrap (2) JAVA_IO (2) JAVA_其它_itext套件 (2) JBoss-問題 (2) Jboss (2) MySQL-語法快速查詢 (2) Spring AOP (2) Spring Batch (2) Spring Boot (2) Spring i18n (2) Subversive (2) Tomcat 8 (2) UML (2) c++ (2) c語言綀習題 (2) jQuery Mobile (2) jQuery-事件處理 (2) jQuery-套件類 (2) putty (2) svn (2) weblogic (2) Apache_JMeter (1) Apache套件_BeanUtils (1) Apache套件_StringUtils (1) Base64 (1) Google API (1) HTML5-基本類 (1) JAVA 7 (1) JAVA 日期 (1) JAVA-OCJP (1) JAVA-WEB (1) JAVA_IDE (1) JAVA其它 (1) JBoss Server (1) JMX (1) JSP (1) Java RMI (1) Java String (1) Joda Time (1) Linux_其它 (1) MySQL教學 (1) Oracle_VirtualBox (1) SQL Server (1) SWT (1) Session (1) Struts 2 (1) Tool (1) TortoiseSVN (1) ZK Studio (1) csv (1) grails-其它類 (1) jQuery-進階 (1) java mail (1) java web (1) jsoup (1) modules (1) tomcat (1) 其它類 (1) 圖片工具 (1) 模擬器 (1) 櫻桃鴨 (1) 泰山 (1) 聊天 (1) 聚餐 (1) 開發工具 (1) 開發資訊 (1) 霸王櫻桃鴨 (1)

精選文章

初學 Java 的 HelloWorld 程式

撰寫一個JAVA程式 public class HelloWorld{ public static void main(String[ ] args){ System.out.println("我第一支Java程式!!"); } } ...