Intégration de MyBatis avec Spring via SqlSessionTemplate

L'utilisation de MyBatis au sein d'un écosystème Spring nécessite une gestion rigoureuse des sessions SQL. L'approche basée sur SqlSessionTemplate est une méthode robuste qui permet de déléguer la gestion du cycle de vie de la session (ouverture, fermeture, gestion des exceptions) directement au conteneur Spring.

Configuraton des dépendances

Pour mettre en œuvre cette intégration, assurez-vous d'inclure les bibliothèques suivantes dans votre projet :

  • mybatis-spring : Le pont entre les deux frameworks.
  • spring-jdbc : Pour la gestion des sources de données et des transactions.
  • mybatis : Le moteur ORM.
  • mysql-connector-java : Le pilote JDBC pour la base de données.

Configuration du contexte Spring

Le fichier de configuration XML (par exemple applicationContext.xml) doit orchestrer la création de la SqlSessionFactory et du SqlSessionTemplate.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Chargement des propriétés de la base de données -->
    <context:property-placeholder location="classpath:datasource.properties"/>

    <!-- Définition de la Source de Données -->
    <bean id="appDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${db.driver}"/>
        <property name="url" value="${db.url}"/>
        <property name="username" value="${db.user}"/>
        <property name="password" value="${db.password}"/>
    </bean>

    <!-- Création de la SqlSessionFactory -->
    <bean id="factorySession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="appDataSource"/>
        <property name="mapperLocations" value="classpath:fr/dev/repository/*.xml"/>
    </bean>

    <!-- Instance de SqlSessionTemplate (thread-safe) -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="factorySession"/>
    </bean>

    <!-- Injection du template dans le DAO -->
    <bean id="productMapper" class="fr.dev.repository.ProductMapperImpl">
        <property name="template" ref="sqlSession"/>
    </bean>

</beans>

Implémentation de la couche DAO

L'implémentation de l'interface d'accès aux données utilise le SqlSessionTemplate injecté pour exécuter les opérations CRUD.

package fr.dev.repository;

import org.mybatis.spring.SqlSessionTemplate;
import fr.dev.model.Product;

public class ProductMapperImpl implements ProductMapper {
    
    private SqlSessionTemplate template;

    public void setTemplate(SqlSessionTemplate template) {
        this.template = template;
    }

    @Override
    public Product findProductById(int id) {
        ProductMapper mapper = template.getMapper(ProductMapper.class);
        return mapper.findProductById(id);
    }
}

Utilisation dans la couche Service

Le service peut ensuite appeler l'implémentation DAO via l'injection de dépendances standard de Spring.

@Service
public class ProductServiceImpl implements ProductService {
    
    @Autowired
    private ProductMapper productMapper;

    @Override
    public Product getDetails(int id) {
        return productMapper.findProductById(id);
    }
}

Alternative optimisée : SqlSessionDaoSupport

Pour simplifier le code Java, MyBatis-Spring propose la classe SqlSessionDaoSupport. Cette approche permet de supprimer la déclaration explicite du SqlSessionTemplate dans le fichier XML si vous injectez directement la SqlSessionFactory.

1. Mise à jour du DAO

public class ProductMapperImpl extends SqlSessionDaoSupport implements ProductMapper {
    @Override
    public Product findProductById(int id) {
        return getSqlSession().getMapper(ProductMapper.class).findProductById(id);
    }
}

2. Ajustement du XML

Dans cette version, on injecte la fabrique de session directement dans le mapper, et MyBatis-Spring gère la création interne du template.

<bean id="productMapper" class="fr.dev.repository.ProductMapperImpl">
    <property name="sqlSessionFactory" ref="factorySession"/>
</bean>

Cette méthode réduit la verbosité de la configuration XML en supprimant le bean SqlSessionTemplate si celui-ci n'est pas utilisé ailleurs de manière spécifique.

Étiquettes: MyBatis Spring Framework Java SqlSessionTemplate ORM

Publié le 24 juillet à 03h51