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
<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 管理 。
<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
說明:資料庫設定檔,資料庫連線資訊等。
<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.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 設定檔 ,記錄資訊用的,可不建此檔。
# 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設定檔 。
<?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 名稱及欄位設定等。
<?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資料及存取資料。
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
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;
主要可以自動使用交易管控。
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
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
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
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
- 首頁
- JAVA 目錄
- JAVA WEB 目錄
- JAVA 其他未分類 目錄
- Grails目錄
- jQuery 目錄
- Apache 目錄
- JavaScript 目錄
- Spring + Hibernate 目錄
- Hibernate 目錄
- Linux 目錄
- 程式開發工具目錄
- MySQL 目錄
- PHP目錄
- C/C++ 目錄
- Google App Engine 目錄
- HTML5/CSS3
- 程式開發基本資訊
- Android
- Oracle 目錄
- Struts 目錄
留言列表