Maven (Spring + Hibernate)アノテーション MySqlの例
ダウンロードする – リンク://wp-content/uploads/2010/03/Spring-Hibernate-Annotation-Example.zip[Spring-Hibernate-Annotation-Example.zip]
リンク://spring/maven-spring-hibernate-mysql-example/[最後のチュートリアル]では、Mavenを使って簡単なJavaプロジェクト構造を作成し、SpringフレームワークでHibernateを使ってデータ操作を行う方法を示します、選択、更新、削除)することができます。このチュートリアルでは、SpringとHibernateアノテーションの方法で同じことをする方法を学びます。
前提条件
最終プロジェクトの構成
最終的なプロジェクトファイル構造は次のようになります。フォルダ構造の作成に迷ったら、ここでこのフォルダ構造を確認してください。

1.テーブルの作成
MySQLデータベースに「在庫」テーブルを作成します。次のようなSQL文を使用します。
CREATE TABLE `mkyong`.`stock` ( `STOCK__ID` int(10) unsigned NOT NULL AUTO__INCREMENT, `STOCK__CODE` varchar(10) NOT NULL, `STOCK__NAME` varchar(20) NOT NULL, PRIMARY KEY (`STOCK__ID`) USING BTREE, UNIQUE KEY `UNI__STOCK__NAME` (`STOCK__NAME`), UNIQUE KEY `UNI__STOCK__ID` (`STOCK__CODE`) USING BTREE ) ENGINE=InnoDB AUTO__INCREMENT=11 DEFAULT CHARSET=utf8;
2.プロジェクトのファイル構造
Mavenコマンド ‘
mvn archetype:generate
‘、
ここの例を参照
を使って、クイックプロジェクトファイル構造を作成します。 Eclipseプロジェクト(
mvn eclipse:eclipse
)に変換し、Eclipse IDEにインポートします。
E:\workspace>mvn archetype:generate[INFO]Scanning for projects... ... 番号を選択してください: (1/2/3 ....)15:15 ... groupId :: com.mkyong.commonの値を定義する artifactId :: HibernateExampleの値を定義する バージョン1.0の値を定義する - SNAPSHOT :: パッケージの値を定義する:com.mkyong.common :: com.mkyong.common[情報]dirで作成されたOldArchetype:E:\ workspace \ HibernateExample[情報]----------------------------------------------- -------------------------[情報]成功したビルド[情報]----------------------------------------------- -------------------------
3. Pom.xmlファイルの設定
Mavenのpom.xmlファイルにSpring、Hibernate、Annotation、MySQLとその依存関係を追加します。
<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/maven-v4__0__0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mkyong.common</groupId>
<artifactId>SpringExample</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringExample</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>JBoss repository</id>
<url>http://repository.jboss.com/maven2/</url>
</repository>
</repositories>
<dependencies>
<!-- JUnit testing framework -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
<!-- Spring AOP dependency -->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
<!-- MySQL database driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<!-- Hibernate framework -->
<dependency>
<groupId>hibernate</groupId>
<artifactId>hibernate3</artifactId>
<version>3.2.3.GA</version>
</dependency>
<!-- Hibernate annotation -->
<dependency>
<groupId>hibernate-annotations</groupId>
<artifactId>hibernate-annotations</artifactId>
<version>3.3.0.GA</version>
</dependency>
<dependency>
<groupId>hibernate-commons-annotations</groupId>
<artifactId>hibernate-commons-annotations</artifactId>
<version>3.0.0.GA</version>
</dependency>
<!-- Hibernate library dependecy start -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<!-- Hibernate library dependecy end -->
</dependencies>
</project>
4.モデル&BO&DAO
-
Model
、
Business Object
(BO)および
Data Access Object ** (DAO)パターンは、プロジェクト構造の混乱を避けるためにレイヤーをはっきりと識別するのに便利です。
ストックモデル(注釈)
ストックデータを格納するためのストックモデルアノテーションクラス。
package com.mkyong.stock.model;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import static javax.persistence.GenerationType.IDENTITY;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "stock", catalog = "mkyong", uniqueConstraints = {
@UniqueConstraint(columnNames = "STOCK__NAME"),
@UniqueConstraint(columnNames = "STOCK__CODE") })
public class Stock implements java.io.Serializable {
private Integer stockId;
private String stockCode;
private String stockName;
public Stock() {
}
public Stock(String stockCode, String stockName) {
this.stockCode = stockCode;
this.stockName = stockName;
}
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "STOCK__ID", unique = true, nullable = false)
public Integer getStockId() {
return this.stockId;
}
public void setStockId(Integer stockId) {
this.stockId = stockId;
}
@Column(name = "STOCK__CODE", unique = true, nullable = false, length = 10)
public String getStockCode() {
return this.stockCode;
}
public void setStockCode(String stockCode) {
this.stockCode = stockCode;
}
@Column(name = "STOCK__NAME", unique = true, nullable = false, length = 20)
public String getStockName() {
return this.stockName;
}
public void setStockName(String stockName) {
this.stockName = stockName;
}
@Override
public String toString() {
return "Stock[stockCode=" + stockCode + ", stockId=" + stockId
+ ", stockName=" + stockName + "]";
}
}
ストックビジネスオブジェクト(BO))
株式ビジネスオブジェクト(BO)のインターフェイスと実装、それはプロジェクトのビジネス関数を格納するために使用され、実際のデータベース操作(CRUD)はこのクラスに関与すべきではなく、代わりにDAO(StockDao)クラスがあります。
package com.mkyong.stock.bo;
import com.mkyong.stock.model.Stock;
public interface StockBo {
void save(Stock stock);
void update(Stock stock);
void delete(Stock stock);
Stock findByStockCode(String stockCode);
}
このクラスをSpring Iocコンテナのbean “stockBo”として作成し、在庫DAOクラスをautowireします。
package com.mkyong.stock.bo.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mkyong.stock.bo.StockBo;
import com.mkyong.stock.dao.StockDao;
import com.mkyong.stock.model.Stock;
@Service("stockBo")
public class StockBoImpl implements StockBo{
@Autowired
StockDao stockDao;
public void setStockDao(StockDao stockDao) {
this.stockDao = stockDao;
}
public void save(Stock stock){
stockDao.save(stock);
}
public void update(Stock stock){
stockDao.update(stock);
}
public void delete(Stock stock){
stockDao.delete(stock);
}
public Stock findByStockCode(String stockCode){
return stockDao.findByStockCode(stockCode);
}
}
ストックデータアクセスオブジェクト
Stock DAOインターフェースと実装。最後のチュートリアルでは、DAOクラスは直接
“HibernateDaoSupport
“を拡張していますが、DAOクラスからセッションファクトリBeanを自動配線する方法がないため、注釈モードではできません。この問題を回避するには、カスタムクラス(
CustomHibernateDaoSupport
)を作成し、 ”
HibernateDaoSupport
“を拡張し、セッションファクトリを自動配線し、DAOクラスでこのクラスを拡張します。
package com.mkyong.stock.dao;
import com.mkyong.stock.model.Stock;
public interface StockDao {
void save(Stock stock);
void update(Stock stock);
void delete(Stock stock);
Stock findByStockCode(String stockCode);
}
package com.mkyong.util;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public abstract class CustomHibernateDaoSupport extends HibernateDaoSupport
{
@Autowired
public void anyMethodName(SessionFactory sessionFactory)
{
setSessionFactory(sessionFactory);
}
}
package com.mkyong.stock.dao.impl;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.mkyong.stock.dao.StockDao;
import com.mkyong.stock.model.Stock;
import com.mkyong.util.CustomHibernateDaoSupport;
@Repository("stockDao")
public class StockDaoImpl extends CustomHibernateDaoSupport implements StockDao{
public void save(Stock stock){
getHibernateTemplate().save(stock);
}
public void update(Stock stock){
getHibernateTemplate().update(stock);
}
public void delete(Stock stock){
getHibernateTemplate().delete(stock);
}
public Stock findByStockCode(String stockCode){
List list = getHibernateTemplate().find(
"from Stock where stockCode=?",stockCode
);
return (Stock)list.get(0);
}
}
5.リソース設定
-
‘project__name/main/java/
‘の下に ‘
resources ** ‘フォルダを作成すると、Mavenはこのフォルダの下のすべてのファイルをリソースファイルとして扱います。 Spring、Hibernateなどの設定ファイルを格納するために使用されます。
春の設定
__データベース関連….
データベースの詳細についてプロパティファイル
(database.properties
)を作成し、 “resources/properties ** “フォルダに入れます。データベースの詳細とSpring Beanの設定を別々のファイルに分けるのは良い方法です。
-
database.properties **
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mkyong jdbc.username=root jdbc.password=password
データベースの “dataSource” Bean設定ファイル(
DataSource.xml
)を作成し、database.propertiesからプロパティをインポートして、
“resources/database
“フォルダに配置します。
-
DataSource.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-2.5.xsd">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>properties/database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
</beans>
Hibernate関連….
セッションファクトリBeanの設定ファイル
(Hibernate.xml
)を作成し、
“resources/database
“フォルダに入れます。アノテーションでは、
LocalSessionFactoryBean
の代わりに
AnnotationSessionFactoryBean
を使用し、 ‘
mappingResources
‘プロパティではなく ‘
annotatedClasses
‘プロパティでアノテーション付きモデルクラスを指定する必要があります。
-
Hibernate.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-2.5.xsd">
<!-- Hibernate session factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show__sql">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.mkyong.stock.model.Stock</value>
</list>
</property>
</bean>
</beans>
すべてのSpringのBean設定ファイルを1つのファイル(BeanLocations.xml)にインポートし、 ”
resources/config
“フォルダに配置します。
-
BeanLocations.xml ** + Springデータベースの設定をインポートし、Springの自動スキャン機能を有効にします。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!-- Database Configuration -->
<import resource="../database/DataSource.xml"/>
<import resource="../database/Hibernate.xml"/>
<!-- Auto scan the components -->
<context:component-scan
base-package="com.mkyong.stock"/>
</beans>
6.それを実行する
あなたはすべてのファイルと設定を持っていて、それを実行します。
package com.mkyong.common;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mkyong.stock.bo.StockBo;
import com.mkyong.stock.model.Stock;
public class App
{
public static void main( String[]args )
{
ApplicationContext appContext =
new ClassPathXmlApplicationContext("spring/config/BeanLocations.xml");
StockBo stockBo = (StockBo)appContext.getBean("stockBo");
/** ** insert ** ** / Stock stock = new Stock();
stock.setStockCode("7668");
stock.setStockName("HAIO");
stockBo.save(stock);
/** ** select ** ** / Stock stock2 = stockBo.findByStockCode("7668");
System.out.println(stock2);
/** ** update ** ** / stock2.setStockName("HAIO-1");
stockBo.update(stock2);
/** ** delete ** ** / stockBo.delete(stock2);
System.out.println("Done");
}
}
出力
Hibernate: insert into mkyong.stock (STOCK__CODE, STOCK__NAME) values (?, ?) Hibernate: select stock0__.STOCK__ID as STOCK1__0__, stock0__.STOCK__CODE as STOCK2__0__, stock0__.STOCK__NAME as STOCK3__0__ from mkyong.stock stock0__ where stock0__.STOCK__CODE=? Stock[stockCode=7668, stockId=11, stockName=HAIO]Hibernate: update mkyong.stock set STOCK__CODE=?, STOCK__NAME=? where STOCK__ID=? Hibernate: delete from mkyong.stock where STOCK__ID=? Done
結論
すべてのSpring、Hibernate関連のクラスと設定ファイルに注釈が付けられ、データベースの詳細がXMLファイルに残されました。データベース構成の詳細に注釈を付ける方法を知っていれば、教えてください。個人的には、私は上記の「HibernateDaoSupport」を ‘CustomHibernateDaoSupport’に拡張するなど、特定の状況に対して何らかの回避策が必要な場合があるため、注釈機能を使用することはありません。成熟したSpringとHibernateのXMLファイルを開発しました。より好ましくは、