この例ではMavenを使用して簡単なJavaプロジェクト構造を作成し、SpringフレームワークでHibernateを使用してMySQLデータベースでデータ操作(挿入、選択、更新、削除)を行う方法を示します。

最終プロジェクトの構成

最終的なプロジェクトファイル構造は次のようになります。フォルダ構造の作成に迷ったら、ここでこのフォルダ構造を確認してください。


image、title = "mavan-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