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é.