本範例實作說明:
本篇主要使用 Spring 及 Hibernate,做一個基本測試專案,
Spring 使用 Spring bean。
Hibernate 使用 XML Mapping。
本範例使用到 PostgreSQL 及 log4j
第4版
1、使用spring-tx 來交易管控。
例:用 @Transactional (Annotation Transactional)
一、範例開發準備工具
作業系統: 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範例專案
範例專案名稱: SpringHibernateHelloWorldExample4
圖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 : SpringHibernateHelloWorldExample4
Artifact id : SpringHibernateHelloWorldExample4
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>SpringHibernateHelloWorldExample4</groupId> <artifactId>SpringHibernateHelloWorldExample4</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>SpringHibernateHelloWorldExample4</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> <!-- <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.0</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>SpringHibernateHelloWorldExampleTest4</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" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <tx:annotation-driven /> <!-- 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> </beans>
註:
記得 xmlns 要宣告 tx 。
這是本文重點。
<tx:annotation-driven />
七、建立 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" 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="messageBean" class="com.levin.model.Message" /> <bean id="messageDao" class="com.levin.dao.impl.MessageDaoImpl"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <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/MessageDaoImpl.java
/MessageDao.java
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 { void save(Message message); public ListfindAll(); }
3、建立 DAO 實作
路徑: src/main/java/com/levin/dao/impl
名稱:MessageDaoImpl.java
說明:MessageDaoImpl implements MessageDao
方法加入 @Transactional
MessageDaoImpl.java 程式內容:
package com.levin.dao.impl; import java.util.List; import javax.transaction.Transactional; import org.hibernate.Criteria; import org.hibernate.SessionFactory; import com.levin.dao.MessageDao; import com.levin.model.Message; public class MessageDaoImpl implements MessageDao { private SessionFactory sessionFactory; public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Transactional public void save(Message message) { sessionFactory.getCurrentSession().save(message); } @SuppressWarnings("unchecked") @Transactional public ListfindAll() { return sessionFactory.getCurrentSession() .createCriteria(Message.class) .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) .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 ListfindAll(); }
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)); } public ListfindAll() { 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"); //查出所有資料 ListmessageList = 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版
參考第3版
Spring Hibernate Hello World Example 專案 之 XML Mapping 第3版
其它參考
Struts + Spring + Hibernate 目錄
Spring Hello World Example 專案
Hibernate Hello World Example 專案 之 XML Mapping
其它文章
沒有留言:
張貼留言