Maven Spring Hibernate MySqlの例
この例ではMavenを使用して簡単なJavaプロジェクト構造を作成し、SpringフレームワークでHibernateを使用してMySQLデータベースでデータ操作(挿入、選択、更新、削除)を行う方法を示します。
最終プロジェクトの構成
最終的なプロジェクトファイル構造は次のようになります。フォルダ構造の作成に迷ったら、ここでこのフォルダ構造を確認してください。
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、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> <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 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.モデル
ストックモデル
後で在庫データを格納するStockモデルクラス。
package com.mkyong.stock.model; import java.io.Serializable; public class Stock implements Serializable { private static final long serialVersionUID = 1L; private Long stockId; private String stockCode; private String stockName; //getter and setter methods... }
ストックビジネスオブジェクト(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); }
package com.mkyong.stock.bo.impl; import com.mkyong.stock.bo.StockBo; import com.mkyong.stock.dao.StockDao; import com.mkyong.stock.model.Stock; public class StockBoImpl implements StockBo{ 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実装クラスはSpringの ”
HibernateDaoSupport
“を拡張し、SpringフレームワークでHibernateをサポートします。これで、
getHibernateTemplate()
を介してHibernate関数を実行することができます。
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.stock.dao.impl; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.mkyong.stock.dao.StockDao; import com.mkyong.stock.model.Stock; public class StockDaoImpl extends HibernateDaoSupport 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などの設定ファイルを格納するために使用されます。
Hibernateの設定
Stockテーブル用のHibernateマッピングファイル(
Stock.hbm.xml
)を作成し、 ”
resources/hibernate/
“フォルダの下に置きます。
<?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.mkyong.stock.model.Stock" table="stock" catalog="mkyong"> <id name="stockId" type="java.lang.Long"> <column name="STOCK__ID"/> <generator class="identity"/> </id> <property name="stockCode" type="string"> <column name="STOCK__CODE" length="10" not-null="true" unique="true"/> </property> <property name="stockName" type="string"> <column name="STOCK__NAME" length="20" not-null="true" unique="true"/> </property> </class> </hibernate-mapping>
春の設定
__データベース関連….
データベースの詳細についてプロパティファイル
(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
クラスは、Springアプリケーションコンテキストで共有Hibernate SessionFactoryを設定します。
-
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.LocalSessionFactoryBean"> <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="mappingResources"> <list> <value>/hibernate/Stock.hbm.xml</value> </list> </property> </bean> </beans>
__Spring beans関連….
BOとDAOクラスのBean構成ファイル(
Stock.xml
)を作成し、 ”
resources/spring
“フォルダーに入れます。依存関係は、dao(stockDao)beanをbo(stockBo)beanに挿入します。 sessionFactory BeanをstockDaoに追加します。
-
Stock.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"> <!-- Stock business object --> <bean id="stockBo" class="com.mkyong.stock.bo.impl.StockBoImpl" > <property name="stockDao" ref="stockDao"/> </bean> <!-- Stock Data Access Object --> <bean id="stockDao" class="com.mkyong.stock.dao.impl.StockDaoImpl" > <property name="sessionFactory" ref="sessionFactory"></property> </bean> </beans>
すべてのSpringのBean設定ファイルを1つのファイル(BeanLocations.xml)にインポートし、 ”
resources/config
“フォルダに配置します。
-
BeanLocations.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"> <!-- Database Configuration --> <import resource="../database/DataSource.xml"/> <import resource="../database/Hibernate.xml"/> <!-- Beans Declaration --> <import resource="../beans/Stock.xml"/> </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-Example.zip