Gestion des types CLOB et BLOB avec MyBatis et intégration de log4j

Configuration de la table pour les données volumineuses

Pour stocker des données binaires (BLOB) et des textes longs (CLOB), une table est créée dans MySQL. L'exemple utilise un schéma simplifié :

CREATE TABLE employe (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nom VARCHAR(20),
    age INT,
    photo LONGBLOB,
    notes LONGTEXT
)

Paramètres de connexion à la base de données

Un fichier de propriétés externalise les informations de connexion :

db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost:3306/projet_demo
db.user=admin
db.pass=secret123

Configuration de MyBatis

Le fichier de configuraton MyBatis charge les propriétés et définit les mappers :

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <properties resource="db.properties"/>
    <typeAliases>
        <package name="com.example.entity"/>
    </typeAliases>
    <environments default="prod">
        <environment id="prod">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${db.driver}"/>
                <property name="url" value="${db.url}"/>
                <property name="username" value="${db.user}"/>
                <property name="password" value="${db.pass}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.example.mapper"/>
    </mappers>
</configuration>

Définition de l'entité métier

La classe modèle associe les types Java aux colonnes de la table :

package com.example.entity;

public class Employe {
    private Integer identifiant;
    private String nomComplet;
    private Integer age;
    private byte[] image;
    private String commentaires;

    // Getters et setters modifiés
    public Integer getIdentifiant() { return identifiant; }
    public void setIdentifiant(Integer id) { this.identifiant = id; }
    public String getNomComplet() { return nomComplet; }
    public void setNomComplet(String nom) { this.nomComplet = nom; }
    public Integer getAge() { return age; }
    public void setAge(Integer a) { this.age = a; }
    public byte[] getImage() { return image; }
    public void setImage(byte[] img) { this.image = img; }
    public String getCommentaires() { return commentaires; }
    public void setCommentaires(String com) { this.commentaires = com; }

    @Override
    public String toString() {
        return "Employe [id=" + identifiant + ", nom=" + nomComplet + "]";
    }
}

Utilitaire pour obtenir une session MyBatis

Une classe utilitaire gère la création de la session MyBatis :

package com.example.util;

import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class SessionManager {
    private static SqlSessionFactory factory;

    public static SqlSessionFactory creerFactory() {
        if (factory == null) {
            try (InputStream flux = Resources.getResourceAsStream("mybatis.xml")) {
                factory = new SqlSessionFactoryBuilder().build(flux);
            } catch (IOException e) {
                throw new RuntimeException("Erreur de configuration MyBatis", e);
            }
        }
        return factory;
    }

    public static SqlSession ouvrirSession() {
        return creerFactory().openSession();
    }
}

Mapper pour les opérations CRUD

L'interface mapper définit les méthodes d'accès aux données :

package com.example.mapper;

import com.example.entity.Employe;

public interface EmployeMapper {
    int insererEmploye(Employe emp);
    Employe recupererParId(Integer id);
}

Le fichier XML correspondant spécifie les requêtes SQL :

<?xml version="1.0" encoding="UTF-8" ?>
<mapper namespace="com.example.mapper.EmployeMapper">
    <insert id="insererEmploye" parameterType="Employe">
        INSERT INTO employe VALUES(NULL, #{nomComplet}, #{age}, #{image}, #{commentaires})
    </insert>
    <select id="recupererParId" parameterType="Integer" resultType="Employe">
        SELECT * FROM employe WHERE id=#{id}
    </select>
</mapper>

Code de test pour l'insertion et la récupération

Un test unitaire démontre l'utilisation des flux pour les données binaires et textuelles :

package com.example.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.example.mapper.EmployeMapper;
import com.example.entity.Employe;
import com.example.util.SessionManager;

public class EmployeTest {
    private SqlSession session;
    private EmployeMapper mapper;

    @Before
    public void initialiser() {
        session = SessionManager.ouvrirSession();
        mapper = session.getMapper(EmployeMapper.class);
    }

    @After
    public void fermer() {
        session.close();
    }

    @Test
    public void testInsertion() throws Exception {
        Employe emp = new Employe();
        emp.setNomComplet("Marie Dupont");
        emp.setAge(30);
        emp.setCommentaires("Texte long et détaillé...");
        byte[] donneesImage;
        try (InputStream entree = new FileInputStream(new File("chemin/vers/image.png"))) {
            donneesImage = new byte[entree.available()];
            entree.read(donneesImage);
        }
        emp.setImage(donneesImage);
        mapper.insererEmploye(emp);
        session.commit();
    }

    @Test
    public void testRecuperation() throws Exception {
        Employe emp = mapper.recupererParId(1);
        byte[] imageRecuperee = emp.getImage();
        try (OutputStream sortie = new FileOutputStream(new File("sortie/image.png"))) {
            sortie.write(imageRecuperee);
        }
    }
}

Intégration de log4j pour la journalisation

Pour ajouter la journalisation, un fichier de configuration log4j.properties est requis :

log4j.rootLogger=DEBUG, console, fichier
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n
log4j.appender.fichier=org.apache.log4j.FileAppender
log4j.appender.fichier.File=logs/app.log
log4j.appender.fichier.layout=org.apache.log4j.PatternLayout
log4j.appender.fichier.layout.ConversionPattern=%d{ISO8601} [%t] %-5p %c - %m%n

Un exemple de test utilisant le logger :

package com.example.test;

import org.apache.log4j.Logger;
import org.junit.Test;

public class JournalTest {
    private static final Logger journal = Logger.getLogger(JournalTest.class);

    @Test
    public void testerJournal() {
        journal.info("Test de journalisation avec log4j...");
        journal.debug("Message de débogage");
    }
}

Lors de l'exécution, les mesages sont affichés dans la console et enregistrés dans le fichier spécifié.

Étiquettes: MyBatis CLOB BLOB Java MySQL

Publié le 25 juillet à 04h13