Maven + (Spring + Hibernate) Annotation + Exemple avec MySql

Maven + (Spring + Hibernate) Annotation + MySql Example

Téléchargez-le -Spring-Hibernate-Annotation-Example.zip

Danslast tutorial, vous utilisez Maven pour créer une structure de projet Java simple et montrez comment utiliser Hibernate dans Spring Framework pour effectuer les travaux de manipulation de données (insérer, sélectionner, mettre à jour et supprimer) dans la base de données MySQL. Dans ce didacticiel, vous apprendrez à faire la même chose de manière d'annotation Spring et Hibernate.

Condition préalable

- Installé et configuré Maven, MySQL, Eclipse IDE.

La bibliothèquejavaee.jar est également requise, vous pouvez l'obtenir à partir du SDK j2ee et l'inclure manuellement, il n'y a pas encore de version complète dejavaee.jar disponible dans aucun des référentiels Maven.

Structure finale du projet

La structure de votre fichier de projet final devrait ressembler exactement à la suivante, si vous vous perdez dans la création de la structure de dossiers, veuillez consulter cette structure de dossiers ici.

image

1. Création de table

Créez une table «stock» dans la base de données MySQL. Instruction SQL comme suit:

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. Structure du fichier de projet

Créez une structure de fichier de projet rapide avec la commande Maven ‘mvn archetype:generate’,see example here. Convertissez-le en projet Eclipse (mvn eclipse:eclipse) et importez-le dans Eclipse IDE.

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

Ajoutez Spring, Hibernate, Annotation et MySQL et leur dépendance dans le fichier pom.xml de Maven.


  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. Modèle & BO & DAO

Le motifModel,Business Object (BO) etData Access Object (DAO) est utile pour identifier clairement le calque pour éviter de gâcher la structure du projet.

Modèle de stock (annotation)

Une classe d'annotation de modèle de stock pour stocker les données de stock.

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 + "]";
    }
}
Objet commercial stock (BO))

Interface et implémentation de l’objet métier (BO), il est utilisé pour stocker la fonction métier du projet, les opérations réelles de la base de données (CRUD) ne devraient pas être impliquées dans cette classe, mais il a une classe DAO (StockDao) pour le faire.

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);
}

Faites de cette classe un «stockBo» de haricot dans le conteneur Spring Ioc, et câblez automatiquement la classe 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);
    }
}
Objet d'accès aux données de stock

Une interface et une implémentation Stock DAO. Dans le dernier tutoriel, vos classes DAO étendent directement les «HibernateDaoSupport», mais il n’est pas possible de le faire en mode annotation, car vous n’avez aucun moyen de câbler automatiquement le bean Factory de session à partir de votre classe DAO. La solution de contournement est de créer une classe personnalisée (CustomHibernateDaoSupport) et d'étendre les «HibernateDaoSupport» et de câbler automatiquement la fabrique de session, et vos classes DAO étendent cette classe.

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. Configuration des ressources

Créez un dossier «resources» sous‘project_name/main/java/ », Maven traitera tous les fichiers de ce dossier comme des fichiers de ressources. Il sera utilisé pour stocker le fichier de configuration Spring, Hibernate et autres.

Configuration du ressort

Lié à la base de données….

Créez un fichier de propriétés(database.properties) pour les détails de la base de données, placez-le dans le dossier «resources/properties». Il est recommandé de faire disparaître les détails de la base de données et la configuration du bean Spring dans différents fichiers.

database.properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/example
jdbc.username=root
jdbc.password=password

Créez un fichier de configuration de bean «dataSource» (DataSource.xml) pour votre base de données, et importez les propriétés de database.properties, placez-le dans le dossier“resources/database ».

DataSource.xml




    
        properties/database.properties
    



    
    
    
    


Hibernate lié….

Créez un fichier de configuration du bean de fabrique de session(Hibernate.xml), placez-le dans le dossier“resources/database ”. Dans l'annotation, vous devez utiliser leAnnotationSessionFactoryBean, au lieu deLocalSessionFactoryBean, et spécifier vos classes de modèle annotées dans la propriété «annotatedClasses» au lieu de la propriété «mappingResources».

Hibernate.xml






    
      
    

    
       
         org.hibernate.dialect.MySQLDialect
         true
       
    

    
    
        com.example.stock.model.Stock
    
    

    

Importez tous les fichiers de configuration des beans Spring dans un seul fichier (BeanLocations.xml), placez-le dans le dossier «resources/config».

BeanLocations.xml
Importez la configuration de la base de données Spring et activez la fonction d'analyse automatique de Spring.



    
    
    

    
    

6. Exécuter

Vous avez tous les fichiers et configurations, exécutez-le.

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");
    }
}

sortie

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

Conclusion

Toutes les classes et fichiers de configuration liés à Spring, Hibernate sont annotés, il a juste laissé les détails de la base de données dans un fichier XML. Si vous savez comment annoter les détails de configuration de la base de données, faites-le moi savoir. Personnellement, je n'utilise pas beaucoup la fonction d'annotation, car vous aurez peut-être besoin d'une solution de contournement pour certaines situations, comme «CustomHibernateDaoSupport» étend «HibernateDaoSupport» ci-dessus. Le fichier XML développé mature dans Spring et Hibernate. est plus préférablement.