- Présentation de MyBatis
- Configuration de l'environnement MyBatis
- Utilisation de la génération automatique basée sur SSM
- Exemple d'opérations CRUD avec MyBatis
Présenttaion de MyBatis
MyBatis est un framework de persistance performant qui permet de personnaliser les requêtes SQL, les procédures stockées et les mappings avancés.
MyBatis élimine presque tout le code JDBC manuel ainsi que la nécessité de configurer les paramètres et de récupérer les résultats.
MyBatis peut utiliser des fichiers XML simples ou des annotations pour configurer et mapper les informations natives, transformant les interfaces Java et les POJOs (Plain Ordinary Java Object) en enregistrements de base de données.
Configuration de l'environnement MyBatis
1. Création d'un projet Maven
2. Ajout des dépendances pom
3. Installasion des plugins MyBatis
- Free MyBatis Plugin
- MyBatis Generator
- MyBatis Tools
- Maven Helper
4. Cofniguration du fichier mybatis.cfg.xml
Dépendances Pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>module</artifactId>
<groupId>com.exemple</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<packaging>war</packaging>
<name>mybatis-demo</name>
<artifactId>mybatis-demo</artifactId>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>2.9.1</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>jdbc.properties</include>
<include>*.xml</include>
</includes>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.44</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
<plugin>
<groupId>org.mortbay.jetty</groupId>
<artifactId>maven-jetty-plugin</artifactId>
<version>6.1.7</version>
<configuration>
<connectors>
<connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
<port>8888</port>
<maxIdleTime>30000</maxIdleTime>
</connector>
</connectors>
<webAppSourceDirectory>${project.build.directory}/${pom.artifactId}-${pom.version}
</webAppSourceDirectory>
<contextPath>/</contextPath>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
Fichier jdbc.properties pour la connexion à la base de données
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ma_base?useUnicode=true&characterEncoding=UTF-8
jdbc.username=utilisateur
jdbc.password=mon_mot_de_passe
Installation des plugins recommandés
- Free MyBatis Plugin
- MyBatis Generator
- MyBatis Tools
- Maven Helper
Fichier mybatis.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties resource="jdbc.properties"/>
<settings>
<setting name="logImpl" value="LOG4J2"/>
</settings>
<typeAliases>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="jdbc"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<mappers>
</mappers>
</configuration>
Utilisation de la génération automatique SSM
Configuration du fichier generatorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<generatorConfiguration>
<properties resource="jdbc.properties"/>
<classPathEntry location="C:\Maven\repository\mysql\mysql-connector-java\5.1.44\mysql-connector-java-5.1.44.jar"/>
<context id="infoGuardian">
<commentGenerator>
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<javaModelGenerator targetPackage="com.exemple.model"
targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
<property name="constructorBased" value="true"/>
<property name="trimStrings" value="false"/>
<property name="immutable" value="false"/>
</javaModelGenerator>
<sqlMapGenerator targetPackage="com.exemple.mapper"
targetProject="src/main/java">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<javaClientGenerator targetPackage="com.exemple.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<table schema="" tableName="t_livre" domainObjectName="Livre"
enableCountByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" enableUpdateByExample="false">
</table>
</context>
</generatorConfiguration>
Configuration Maven pour exécuter le générateur
Exécuter la commande suivante dans Maven :
mybatis-generator:generate -e
Cliquer sur Exécuter pour générer automatiquement les fichiers.
Exemple d'opérations CRUD avec MyBatis
Classe SessionUtil.java
package com.exemple.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* Utilitaire pour gérer les sessions MyBatis
*/
public class SessionUtil {
private static SqlSessionFactory sessionFactory;
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
static {
sessionFactory = new SqlSessionFactoryBuilder()
.build(SessionUtil.class.getResourceAsStream("/mybatis.cfg.xml"));
}
public static SqlSession ouvrirSession() {
SqlSession session = threadLocal.get();
if (null == session) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public static void main(String[] args) {
SqlSession session = ouvrirSession();
System.out.println(session.getConnection());
session.close();
}
}
Interface LivreService.java
package com.exemple.service;
import com.exemple.model.Livre;
/**
* Service pour les opérations CRUD sur les livres
*/
public interface ServiceLivre {
int supprimerParCle(Integer id);
int inserer(Livre livre);
int insererSelective(Livre livre);
Livre selectionnerParCle(Integer id);
int mettreAJourSelective(Livre livre);
int mettreAJour(Livre livre);
}
Classe ImplServiceLivre.java
package com.exemple.service.impl;
import com.exemple.mapper.LivreMapper;
import com.exemple.model.Livre;
import com.exemple.service.ServiceLivre;
/**
* Implémentation du service livre
*/
public class ImplServiceLivre implements ServiceLivre {
private LivreMapper mapperLivre;
public LivreMapper getMapperLivre() {
return mapperLivre;
}
public void setMapperLivre(LivreMapper mapperLivre) {
this.mapperLivre = mapperLivre;
}
@Override
public int supprimerParCle(Integer id) {
return mapperLivre.deleteByPrimaryKey(id);
}
@Override
public int inserer(Livre livre) {
return mapperLivre.insert(livre);
}
@Override
public int insererSelective(Livre livre) {
return mapperLivre.insertSelective(livre);
}
@Override
public Livre selectionnerParCle(Integer id) {
return mapperLivre.selectByPrimaryKey(id);
}
@Override
public int mettreAJourSelective(Livre livre) {
return mapperLivre.updateByPrimaryKeySelective(livre);
}
@Override
public int mettreAJour(Livre livre) {
return mapperLivre.updateByPrimaryKey(livre);
}
}
Classe de test ImplServiceLivreTest.java
package com.exemple.test;
import com.exemple.mapper.LivreMapper;
import com.exemple.model.Livre;
import com.exemple.service.ServiceLivre;
import com.exemple.service.impl.ImplServiceLivre;
import com.exemple.util.SessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
/**
* Tests unitaires pour le service livre
*/
public class ImplServiceLivreTest {
private ServiceLivre serviceLivre;
private SqlSession sessionSql;
@Before
public void configuration() throws Exception {
ImplServiceLivre implService = new ImplServiceLivre();
sessionSql = SessionUtil.ouvrirSession();
implService.setMapperLivre(sessionSql.getMapper(LivreMapper.class));
this.serviceLivre = implService;
}
@After
public void nettoyage() throws Exception {
sessionSql.commit();
sessionSql.close();
}
@Test
public void testInserer() {
Livre livre = new Livre();
livre.setNom("Nouveau Livre");
livre.setPrix(19.99);
livre.setId(10);
int resultat = serviceLivre.inserer(livre);
System.out.println("Lignes affectées : " + resultat);
}
@Test
public void testSelectionnerParCle() {
Livre livre = this.serviceLivre.selectionnerParCle(1);
System.out.println(livre);
}
}
Résultats :
Requête SELECT
La méthode de sélection retourne l'objet trouvé ou null.
INSERT
L'insertion retourne le nombre de lignes affectées dans la base de données.