Les trois éléments essentiels de myBatis
myBatis nécessite trois composants fondamentaux pour fonctionner :
- La source de données
- Les instructions SQL d'exécution
- L'opérateur (SqlSessionFactoryBuilder)
Première étape : analyse du fichier XML
Le fichier de configuration configuration constitue le point d'entrée principal.
001 Environnement d'exécution
L'élément environment permet de configurer la source de données :
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT"/>
<property name="username" value="admin"/>
<property name="password" value="mdp12345"/>
</dataSource>
</environment>
<environment id="production">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/db_production?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT"/>
<property name="username" value="admin"/>
<property name="password" value="mdp67890"/>
</dataSource>
</environment>
</environments>
</configuration>
MyBatis permet de configurer plusieurs environnements afin de s'adapter à différents contextes (développement, test, production) nécessitant des configurations distinctes.
L'appel s'effectue comme suit :
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"production");
Gestionnaire de transactions
<transactionManager type="JDBC"/>
002 Mappeurs (mappers)
Une fois le comportement de MyBatis configuré via les éléments précédents, il est nécessaire de définir les instructions SQL. Pour cela, il faut indiquer à MyBatis l'emplacement des fichiers de mappage.
Java ne proposant pas de solution optimale pour la recherche automatique des ressources, la meilleure approche consiste à spécifier directement le chemin des fichiers.
<!-- 001 Référence vers une ressource via le chemin relatif -->
<mappers>
<mapper resource="com/tech/dao/UserMapper.xml"/>
</mappers>
<!-- 002 Nom complet de la classe implémentant l'interface du mappeur -->
<mappers>
<mapper class="com.tech.dao.UserMapper"/>
</mappers>
<!-- 003 Enregistrement de tous les mappeurs d'un package -->
<mappers>
<package name="com.tech.dao"/>
</mappers>
<!-- 004 Utilisation d'une URL absolue -->
<mappers>
<mapper url="file:D://UserMapper.xml"/>
</mappers>
Attention : l'attribut class fonctionne uniquement avec les annotations. Les attributs resource et url concernent exclusivement les fichiers XML. L'attribut package s'utilise aussi bien avec les annotations qu'avec XML.
Un détail important : si vous utilisez class (annotations) tout en ayant un fichier XML correspondant dans le même répertoire, MyBatis générera une erreur au démarrage. Ce comportement constitue un problème connu.
003 Balise properties
Ces propriétés peuvent être configurées de manière externe et être remplacées dynamiquement. Elles se définissent soit dans un fichier Java properties classique, soit comme éléments enfants de properties.
<properties resource="database.properties">
<property name="username" value="admin"/>
<property name="jdbc_password" value="motdepasse"/>
</properties>
<dataSource type="POOLED">
<property name="driver" value="${jdbc_driverClassName}"/>
<property name="url" value="${jdbc_url}"/>
<property name="username" value="${jdbc_username}"/>
<property name="password" value="${jdbc_password}"/>
</dataSource>
# Contenu de database.properties
jdbc_driverClassName=com.mysql.cj.jdbc.Driver
jdbc_url=jdbc:mysql://127.0.0.1:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT
jdbc_username=admin
Lorsqu'une propriété est définie à plusieurs endroits, MyBatis respectel'ordre de priorité suivant :
- Propriétés définies directement dans l'élément
properties - Propriétés du fichier spécifié par l'attribut
resourceouurl(remplace les同名前) - Propriétés passées en paramètres de la méthode
build(priorité maximale)
Properties props = new Properties();
props.setProperty("jdbc_password","motdepasse");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream,"development",props);
004 Paramètres (settings)
Ces paramètres représentent des configurations cruciales qui modifient le comportement d'exécution de MyBatis.
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="defaultFetchSize" value="100"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
L'option cacheEnabled active ou désactive globalement tous les caches configurés dans les fichiers de mappage.
005 Alias de types (typeAliases) et package
Les alias de types permettent d'attribuer un nom abrégé aux types Java. Utilisés uniquement dans la configuration XML, ils réduisent la redondance des noms de classes complets.
<typeAliases>
<typeAlias alias="User" type="com.tech.entity.User"/>
</typeAliases>
<select id="findUser" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
# Alternative avec enregistrement par package
<typeAliases>
<package name="com.tech.entity"/>
</typeAliases>
<select id="findUser" resultType="user">
SELECT * FROM user WHERE id = #{id}
</select>
Chaque classe Java du package com.tech.entity utilise comme alias son nom de classe non qualification (en minuscules ou majuscules) en l'absence d'annotations. La sensibilité à la casse ne s'applique pas.
Il est également possible d'utiliser une annotation :
@Alias("utilisateur")
public class User {
private Integer id;
private String name;
}
<select id="findUser" resultType="utilisateur">
SELECT * FROM user WHERE id = #{id}
</select>