Spring-MVC/ステップ・バイ・ステップ

2008/04/07からのアクセス回数 15681

データベースの準備

今回は、Mac版のPostgreSQLを使います。 (残念ながらPostgreX は、Leopardには対応していません)

Mac OSX用のPkgインストーラが以下のサイトにあります。 http://www.magic3.org/postgrex/

をダウンロードし、インストールしてください。

Windowsの場合には、PgAdmin Ⅲ が便利です。

ユーザ、データベースの作成

Magic Postgreを起動し、ユーザspringを作成します。

次に、データベースを作成します。

ライブラリの追加

Daoは、HibernateSupportDaoを継承しますので、MVNREPOSITORYから

を検索します。

以下のdependecyタグをpom.xmlに追加します。

    <dependency>
      <groupId>org.hibernate</groupId>
      <artifactId>hibernate</artifactId>
      <version>3.1</version>
    </dependency>
    <dependency>
      <groupId>postgresql</groupId>
      <artifactId>postgresql</artifactId>
      <version>8.1-408.jdbc3</version>
    </dependency>

また、Genericsを使うためには、バージョン5以降のコンパイラーを使用する必要がありますのでbuildのpluginsに以下のpluginタグを 追加します。

	  <plugin>
		  <artifactId>maven-compiler-plugin</artifactId>
		  <configuration>
			  <encoding>Shift_JIS</encoding>
			  <source>1.5</source>
			  <target>1.5</target>
		  </configuration>
	  </plugin>

クラスパスの変更

以下のコマンドを実行して.project, .classpathファイルを更新します。

$ rm .project .classpath
$ mvn eclipse:eclipse -DdownloadSources=true

ここで、以下の警告がでます。

Downloading: http://repo1.maven.org/maven2/javax/transaction/jta/1.0.1B/jta-1.0.1B.jar
[WARNING] An error occurred during dependency resolution.
    Failed to retrieve javax.transaction:jta-1.0.1B
Caused by: Unable to download the artifact from any repository

Try downloading the file manually from: 
    http://java.sun.com/products/jta

Then, install it using the command: 
    mvn install:install-file -DgroupId=javax.transaction -DartifactId=jta 
    -Dversion=1.0.1B -Dpackaging=jar -Dfile=/path/to/file

Alternatively, if you host your own repository you can deploy the file there: 
    mvn deploy:deploy-file -DgroupId=javax.transaction -DartifactId=jta 
    -Dversion=1.0.1B -Dpackaging=jar -Dfile=/path/to/file -Durl=[url] -DrepositoryId=[id]

Path to dependency: 
        1) spring.example.web:mvc-convention:war:0.0.1
        2) org.hibernate:hibernate:jar:3.1
        3) javax.transaction:jta:jar:1.0.1B


  javax.transaction:jta:jar:1.0.1B

from the specified remote repositories:
  central (http://repo1.maven.org/maven2)

これは、sun等がライセンス付きで提供しているライブラリを勝手にMVN Repositoryに登録できない ため、ユーザがsunのサイトからjarファイルをダウンロードし、install_fileプラグインを使って ローカルのリポジトリに登録しなくてはなりません。

http://java.sun.com/products/jta/ からjta-1_0_1B-classes.zipファイルをダウンロードしてください。

filejta-1_0_1B-classes.zip

次に以下のコマンドでローカルのリポジトリに登録してください。

$ mvn install:install-file \
 -Dfile=./jta-1_0_1B-classes.zip \
 -DgroupId=javax.transaction \
 -DartifactId=jta \
 -Dversion=1.0.1B \
 -Dpackaging=jar

テーブルの作成

以下のSQL文を実行して、t_recipeテーブルを作成し、テストデータを 挿入します。(私は、DbEditを使いました)

CREATE TABLE t_recipe (
	id integer NOT NULL PRIMARY KEY,
	name varchar (255) );

INSERT INTO t_recipe (id, name) values (1, 'Goats Cheese with beetroot sauce');
INSERT INTO t_recipe (id, name) values (2, 'Bucket of MaccyDeez chicken de Harrop');
INSERT INTO t_recipe (id, name) values (3, 'Deep fried battered Hershey bar');

Genericsを使ってDaoを作る

きのさいと を参考にGenericsを使ってDaoインタフェースとDaoを作成します。

Generic Daoインタフェース

Daoインタフェースでは、レコードの挿入(C)、読み込み(R)、更新(U)、削除(D)を記述します。

import java.io.Serializable;
import java.util.List;

public interface IGenericDao<T, PK extends Serializable> {
	void 	saveOrUpdate(T obj);
	void	delete(T obj);
	T 	findById(Long id);
	List<T>	findAll();;
}

saveOrUpdateは、挿入または、更新の両方をサポートするメソッドです。

Generic Dao

Generic Daoは、HibernateDaoSupportのサブクラスとして以下のように作成します。

import java.io.Serializable;
import java.util.List;

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

public class GenericHibernateDao<T, PK extends Serializable> extends HibernateDaoSupport
implements IGenericDao<T, PK> {
	private Class<T> type;
	
	public GenericHibernateDao(Class<T> type) {
		this.type = type;
	}
	
	public void delete(Object obj) {
		getHibernateTemplate().delete(obj);
	}

	public List<T> findAll() {
		return (List<T>)getHibernateTemplate().loadAll(type);
	}

	public T findById(PK id) {
		return (T) getHibernateTemplate().get(type, id);
	}

	public void saveOrUpdate(Object obj) {
		getHibernateTemplate().saveOrUpdate(obj);
	}

}

Recipe Daoインタフェース

Generic Daoインタフェースを使って、RecipeオブジェクトへのCRUDを行う Daoインタフェースは以下のように簡潔に記述できます。

import org.springframework.showcase.coverc.domain.Recipe;

public interface IRecipeDao extends IGenericDao<Recipe, Long> {
}

Recipe Dao

Recipe Daoインタフェースと同様にRecipe Daoも、以下のように簡潔に記述します。

import org.springframework.showcase.coverc.domain.Recipe;

public class RecipeDao extends GenericHibernateDao<Recipe, Long> implements IRecipeDao {
	public RecipeDao(Class<Recipe> type) {
		super(type);
	}
}

StubRecipeManagerの変更について

StubRecipeMangerを直接変更してもよいのですが、Bean定義ファイルの変更で元に戻せるように そのまま残し、代わりにStubRecipeDaoManagerを作成することにします。

StubRecipeDaoManagerは、非常に簡単になりました。

import org.springframework.showcase.coverc.domain.Recipe;

public class StubRecipeDaoManager extends RecipeDao implements RecipeManager {
	public StubRecipeDaoManager() {
		super(Recipe.class);
	}
	
	public void save(Recipe user) {
		super.saveOrUpdate(user);
	}
}

Hibernateのhbm定義ファイル

Hibernateのhbm定義ファイルをRecipeクラスを同じ場所に定義します。

Recipe.hbm.xmlの内容は以下の通りです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class 
		name="org.springframework.showcase.coverc.domain.Recipe"
		table="T_RECIPE">
		<id name="id">
			<generator class="increment"/>
		</id>
		<property name="name"/>
	</class>
</hibernate-mapping>

Bean定義ファイルの変更

最後にBean定義ファイルを変更します。

applicationContext.xml

applicationContext.xmlのrecipeManagerを以下のように変更します。

	<bean id="recipeManager" class="org.springframework.showcase.coverc.service.StubRecipeDaoManager">
		<property name="sessionFactory" ref="sessionFactory" /> 
	</bean>

以下のデータベースBean定義をapplicationContext.xmlに追加します。

	<bean id="dataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>org.postgresql.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:postgresql://localhost/springdb</value>
		</property>
		<property name="username">
			<value>spring</value>
		</property>
		<property name="password">
			<value>spring</value>
		</property>
		<property name="initialSize" value="5"/>
		<property name="maxActive" value="10"/>
	</bean>
	<bean id="sessionFactory" 
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="hibernateProperties">
			<props>
			<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
			</props>
		</property>
		<property name="mappingDirectoryLocations">
			<list>
				<value>classpath:/org/springframework/showcase/coverc/domain</value>
			</list>
		</property>
		<property name="dataSource">
			<ref bean="dataSource"/>
		</property>
	</bean>	

コメント

この記事は、

選択肢 投票
おもしろかった 11  
そうでもない 2  
わかりずらい 8  

皆様のご意見、ご希望をお待ちしております。


(Input image string)

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc