Maven (Spring + Hibernate)アノテーション MySqlの例

Maven +(Spring + Hibernate)アノテーション+ MySqlの例

ダウンロード–Spring-Hibernate-Annotation-Example.zip

last tutorialでは、Mavenを使用して単純なJavaプロジェクト構造を作成し、SpringフレームワークでHibernateを使用してMySQLデータベースでデータ操作作業(挿入、選択、更新、削除)を行う方法を示します。 このチュートリアルでは、SpringとHibernateアノテーションの方法で同じことを行う方法を学びます。

前提条件

– Maven、MySQL、Eclipse IDEをインストールおよび構成しました。

javaee.jarライブラリも必要です。j2eeSDKから取得し、手動で含めることができます。どのMavenリポジトリでもjavaee.jarのフルバージョンはまだ利用できません。

最終プロジェクト構造

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

image

1. テーブル作成

MySQLデータベースに「ストック」テーブルを作成します。 次のようなSQLステートメント:

CREATE TABLE  `example`.`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‘、see example hereを使用して、簡単なプロジェクトファイル構造を作成します。 それをEclipseプロジェクト(mvn eclipse:eclipse)に変換し、EclipseIDEにインポートします。

E:\workspace>mvn archetype:generate
[INFO] Scanning for projects...
...
Choose a number:
(1/2/3....) 15: : 15
...
Define value for groupId: : com.example.common
Define value for artifactId: : HibernateExample
Define value for version:  1.0-SNAPSHOT: :
Define value for package:  com.example.common: : com.example.common
[INFO] OldArchetype created in dir: E:\workspace\HibernateExample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------

3. Pom.xml file configuration

Mavenのpom.xmlファイルにSpring、Hibernate、Annotation、MySQL、およびそれらの依存関係を追加します。


  4.0.0
  com.example.common
  SpringExample
  jar
  1.0-SNAPSHOT
  SpringExample
  http://maven.apache.org

  
    
      JBoss repository
      http://repository.jboss.com/maven2/
    
  

  

        
        
                junit
                junit
                3.8.1
                test
        

        
    
        org.springframework
        spring
        2.5.6
    

        
        
                cglib
        cglib
        2.2
    

        
    
        mysql
        mysql-connector-java
        5.1.9
    

    
    
        hibernate
        hibernate3
        3.2.3.GA
    

    
    
        hibernate-annotations
        hibernate-annotations
        3.3.0.GA
    

    
        hibernate-commons-annotations
        hibernate-commons-annotations
        3.0.0.GA
    

    
    
        dom4j
        dom4j
        1.6.1
    

    
        commons-logging
        commons-logging
        1.1.1
    

    
        commons-collections
        commons-collections
        3.2.1
    

    
        antlr
        antlr
        2.7.7
    
    

  

4. モデル&BO&DAO

ModelBusiness Object(BO)、およびData Access Object(DAO)パターンは、プロジェクト構造の混乱を避けるためにレイヤーを明確に識別するのに役立ちます。

ストックモデル(注釈)

株式データを保存する株式モデル注釈クラス。

package com.example.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 = "example", 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.example.stock.bo;

import com.example.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」として作成し、stock daoクラスを自動配線します。

package com.example.stock.bo.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.stock.bo.StockBo;
import com.example.stock.dao.StockDao;
import com.example.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.example.stock.dao;

import com.example.stock.model.Stock;

public interface StockDao {

    void save(Stock stock);
    void update(Stock stock);
    void delete(Stock stock);
    Stock findByStockCode(String stockCode);

}
package com.example.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.example.stock.dao.impl;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.example.stock.dao.StockDao;
import com.example.stock.model.Stock;
import com.example.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/example
jdbc.username=root
jdbc.password=password

データベースの「dataSource」Bean構成ファイル(DataSource.xml)を作成し、database.propertiesからプロパティをインポートして、「“resources/database」フォルダーに配置します。

DataSource.xml




    
        properties/database.properties
    



    
    
    
    


休止状態関連…。

セッションファクトリBean構成ファイル(Hibernate.xml)を作成し、“resources/database”フォルダに配置します。 アノテーションでは、LocalSessionFactoryBeanではなくAnnotationSessionFactoryBeanを使用し、 ‘mappingResources‘プロパティではなく ‘annotatedClasses‘プロパティでアノテーション付きモデルクラスを指定する必要があります。

Hibernate.xml






    
      
    

    
       
         org.hibernate.dialect.MySQLDialect
         true
       
    

    
    
        com.example.stock.model.Stock
    
    

    

すべてのSpringのBean構成ファイルを単一のファイル(BeanLocations.xml)にインポートし、それを「resources/config」フォルダーに配置します。

BeanLocations.xml
Springデータベース構成をインポートし、Springの自動スキャン機能を有効にします。



    
    
    

    
    

6. それを実行します

すべてのファイルと構成があり、実行します。

package com.example.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.example.stock.bo.StockBo;
import com.example.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 example.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 example.stock stock0_ where stock0_.STOCK_CODE=?
Stock [stockCode=7668, stockId=11, stockName=HAIO]
Hibernate: update example.stock set STOCK_CODE=?, STOCK_NAME=? where STOCK_ID=?
Hibernate: delete from example.stock where STOCK_ID=?
Done

結論

Spring、Hibernateに関連するすべてのクラスおよび構成ファイルに注釈が付けられ、データベースの詳細がXMLファイルに残されています。 データベース構成の詳細に注釈を付ける方法を知っている場合は、お知らせください。 個人的には、注釈機能をあまり使用しません。「CustomHibernateDaoSupport」が上記の「HibernateDaoSupport」を拡張するなど、特定の状況で何らかの回避策が必要になる場合があるためです。 SpringおよびHibernateで開発された成熟したXMLファイル。 より好ましい。