[JAVA] J'ai trouvé MyBatis utile, alors je l'ai écrit.

Résumons ce que nous avons appris dans la série sur le terrain (Introduction)

En l'état, c'est une série qui résume les outils etc. appris (utilisés) sur le terrain. Je l'écris avec le sentiment que c'est aussi pour moi et que ça devrait être pour quelqu'un. Nous attendons avec impatience vos suggestions et commentaires concernant les erreurs et les méthodes de description!

Modifier l'historique

Qu'est-ce que MyBatis?

Un cadre pour le mappage d'instructions et d'objets SQL à l'aide de XML ou d'annotations.

Sans parler du fonctionnement normal du CRUD Vous pouvez émettre du SQL dynamiquement en fonction de l'état des paramètres! Si une description peut être réutilisée plusieurs fois, elle peut être partagée et la quantité de description peut être réduite.

Dans cet article, j'expliquerai principalement la description de XML.

Description de base et utilisation

Quoi qu'il en soit, il est plus rapide de consulter la source, alors veuillez voir ci-dessous.

Sample.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="src.mapper.MybatisMapper">

  <select id="select" resultType="src.mapper.entity.TableEntity">
    select
        *
    from 
        table_name
  </select>

  <insert id="insert">
    insert into table_name (
      id,
      name,
      age,
      department
    ) values (
      #{id},
      #{name},
      #{age},
      #{department}
    )
  </insert>

</mapper>

MyBatisMepper.java


package src.mapper

//importation omise

public interface MyBatisMapper {
  TableEntity select();

  void insert(TableEntity entity);
}

TableEntity.java


package src.mapper.entity

//importation omise

public class TableEntity {
  private String id;
  private String name;
  private Integer age;
  private String department;

  public void setId(String id) {
    this.id = id;
  }

  public String getId() {
    return this.id;
  }

  //Getter, setter pour tous les domaines
}

Pour expliquer brièvement,

  1. Associez-le à /src/mapper/MybatisMapper.java avec <mapper namespane =" src.mapper.MybatisMapper ">.
  2. Select est exécuté en exécutant MybatisMapper.select () avec <select id =" select "resultType =" src.mapper.entity.TableEntity "> ~ </ select>, et le résultat est mappé à TableEntity. Sera fait.
  3. Si vous voulez passer un paramètre, vous pouvez le recevoir en écrivant # {id}. Dans ce qui précède, la valeur est passée en tant qu'objet, mais elle peut également être reçue en tant qu'argument de la classe Mapper en utilisant @ Param.

Il est très facile de se lier aux classes et méthodes java, donc c'est facile à comprendre intuitivement!

Comment passer des paramètres

Si vous pouvez préparer une classe de données comme décrit ci-dessus, vous pouvez mapper par nom de champ. (J'ai l'impression que ça aurait été inutile sans un getter) Cependant, pour diverses raisons, pour ceux qui veulent le passer comme argument de la classe mapper! Voici quelques moyens de le faire.

Définissez le paramètre XML sur # {param1}

SampleParam1.xml


  <select id="select" resultType="src.mapper.entity.TableEntity">
    select
        *
    from 
        table_name
    where
        id = #{param1}
        and name = #{param2}
  </select>

MyBatisMepper.java


package src.mapper

//importation omise

public interface MyBatisMapper {
  TableEntity select(String id, String name);
}

Si vous écrivez comme ceci, # {param1} aura le premier argument ʻid, Le deuxième argument, name, est mappé à # {param2}`! Il est difficile de comprendre personnellement la cartographie dans l'ordre des arguments, ce n'est donc pas recommandé.

Ajoutez @ Param à l'argument de la classe mapper

SampleParam2.xml


  <select id="select" resultType="src.mapper.entity.TableEntity">
    select
        *
    from 
        table_name
    where
        id = #{id}
        and name = #{name}
  </select>

MyBatisMepper.java


package src.mapper

//importation omise

public interface MyBatisMapper {
  TableEntity select(@Param("id") String id, @Param("name") String name);
}

En spécifiant un alias avec une chaîne de caractères dans l'argument de @ Param Vous pouvez mapper des paramètres en XML. Personnellement, c'est le plus simple à comprendre et à recommander!

Passer par carte

Comme créer une classe de données Ceci est une méthode pour créer une carte avec clé = nom de paramètre et valeur = valeur. [Cliquez ici pour plus de détails](https://qiita.com/opengl-8080/items/a9b5d4038f19d4813ee6#map-%E3%81%A7%E3%83%91%E3%83%A9%E3%83%A1%E3 Voir% 83% BC% E3% 82% BF% E3% 82% 92% E6% B8% A1% E3% 81% 99). (Si vous faites cela, je pense que ce serait plus facile à comprendre si vous créiez une classe de données.)

Ensuite, je vais vous présenter comment écrire du SQL dynamique!

SQL dynamique

Comme mentionné ci-dessus, le SQL dynamique signifie que le SQL émis par l'état du paramètre peut être modifié dynamiquement! Plus précisément, c'est comme suit!

if/choose/where,set,trim Par exemple, vous devez écrire plusieurs instructions SELECT similaires car les colonnes référencées sont les mêmes mais les conditions (clause WHERE) sont différentes. .. C'est dommage, non? ** if / choose / where, set, trim **, qui sera présenté ci-dessous, est une méthode de description pratique lorsque vous souhaitez modifier les conditions de la clause WHERE ou lorsque vous souhaitez unifier l'instruction UPDATE.

if

SampleIf.xml


  <update id="update">
    update table_name 
    set
      <if test="name != null">
        name = #{name},
      </if>
      age = #{age}
    where
      id = #{id}
  </update>

Selon la situation, j'aimerais choisir parmi plus de conditions que deux choix! Je pense qu'il y aura des cas comme celui-là. Dans ce cas, veuillez utiliser ** choose (quand, sinon) **. (Je ne l'ai pas tellement vu) choose(when,otherwise)

SampleChoose.xml


  <select id="select">
    select
      *
    from
      table_name
    where
      <choose>
        <when test="id != null">
          id = #{id}
        </when>
        <when test="name != null">
          name = #{name}
        </when>
        <otherwise>
          age = #{age}
        </otherwise>
      </choose>
  </select>

where,set,trim ** where, set, trim ** sont utiles lorsque vous voulez travailler avec un peu de SQL maladroit. Par exemple, prenez le SQL suivant.

Sample2.xml


  <select id="select2" resultType="src.mapper.entity.TableEntity">
    select
      *
    from
      table_name
    where
      <if test="id != null">
        id = #{id}
      </if>
      <if test="name != null">
        and name = #{name}
      </if>
      <if test="age != null">
        and age = #{age}
      </if>
  </update>

Si tous les if ne sont pas satisfaits, le code SQL select * from table_name where sera émis et une erreur de syntaxe se produira. De plus, si le paramètre .name n'est pas nul et que les paramètres .id et age sont nuls, alors select * from table_name where and name =? Se produira, ce qui entraînera également une erreur de syntaxe.

where Si vous utilisez <where> ~ </ where>, il n'insérera où que lorsque l'une des balises incluses renvoie un résultat. De plus, si le résultat de la balise contenue commence par «et» ou «ou», ils seront supprimés! Comme c'est pratique! .. ..

SampleWhere.xml


  <select id="select2" resultType="src.mapper.entity.TableEntity">
    select
      *
    from
      table_name
    <where>
      <if test="id != null">
        id = #{id}
      </if>
      <if test="name != null">
        and name = #{name}
      </if>
      <if test="age != null">
        and age = #{age}
      </if>
    </where>
  </select>

set Il s'agit de la version de clause set de where. Si vous utilisez <set> ~ </ set>, le supplément , sera supprimé.

SampleSet.xml


  <update id="update">
    update table_name 
    <set>
      <if test="name != null">
        name = #{name},
      </if>
      <if test="age != null">
        age = #{age},
      </if>
      <if test="department != null">
        department = #{department}
      </if>
    </set>
    where
      id = #{id}
  </update>

trim La personnalisation est possible en définissant le where et set décrit ci-dessus dans<trim> to </ trim>. Cela peut paraître subtil compte tenu de la lisibilité, mais je pense que cela vaut la peine de le savoir!

SampleTrim1.xml


  <select id="select2" resultType="src.mapper.entity.TableEntity">
    select
      *
    from
      table_name
    <trim prefix="WHERE" prefixOverrides="AND |OR ">
      <if test="id != null">
        id = #{id}
      </if>
      <if test="name != null">
        and name = #{name}
      </if>
      <if test="age != null">
        and age = #{age}
      </if>
    </trim>
  </select>

SampleTrim2.xml


  <update id="update">
    update table_name 
    <trim prefix="SET" suffixOverrides=",">
      <if test="name != null">
        name = #{name},
      </if>
      <if test="age != null">
        age = #{age},
      </if>
      <if test="department != null">
        department = #{department}
      </if>
    </trim>
    where
      id = #{id}
  </update>

sql,include Par exemple, si vous avez besoin d'une instruction SELECT pour l'acquisition et d'une instruction SELECT pour la mise à jour N'est-ce pas comme ça quand je l'ai écrit, il n'y avait qu'une différence avec ou sans «pour mise à jour» à la fin? Dans un tel cas, utiliser <sql> ~ <sql> et <include> ~ </ include> le rendra plus propre!

SampleSql.xml


  <sql id="selectBase">
    select
      *
    from
      table_name
    where
      id = #{id}
  </sql>

  <select id="select" resultType="src.mapper.entity.TableEntity">
    <include refid="selectBase" />
  </select>

  <select id="selectForUpdate" resultType="src.mapper.entity.TableEntity">
    <include refid="selectBase" />
    for update
  </select>

Comment rédiger des conseils

Je prendrai des notes d'un point de vue plus pratique!

Je veux écrire une clause LIKE

Dans MyBatis, il existe deux façons d'écrire des variables.

--# {param}… S'échapper et mettre entre guillemets simples. --$ {param}... Ne vous échappez pas.

Voici une façon courante d'écrire. (Si vous voulez faire correspondre le préfixe avec id)

SampleSql.xml


  <select id="select3" resultType="src.mapper.entity.TableEntity">
    select
      *
    from
      table_name
    where
      id like '${id}%'
  </select>

Cette façon d'écrire émettra toujours la bonne requête, Comme mentionné ci-dessus ** Il existe un risque d'injection SQL car elle ne s'échappe pas. ** **

Assurez-vous d'utiliser les ** jointures de chaîne fournies par chaque SQL. ** ** Ce qui suit est pour Oracle.

SampleSql.xml


  <select id="select3" resultType="src.mapper.entity.TableEntity">
    select
      *
    from
      table_name
    where
      id like #{id} || '%'
  </select>

Je veux utiliser l'inégalité

Puisque MyBatis est décrit en XML, le nombre d'inégalité <> est traité comme un méta caractère, La requête ne peut pas être lue normalement. Dans un tel cas, vous pouvez l'utiliser en le plaçant dans <![CDATA [...]]>!

SampleSql.xml


  <select id="select4" resultType="src.mapper.entity.TableEntity">
    <![CDATA[ 
    select
      *
    from
      table_name
    where
      create_at < #{date}
    ]]>
  </select>

Je pense qu'il est plus lisible de renfermer tout le SQL que de le placer avec des points précis. Je recommande personnellement le style d'écriture ci-dessus!

finalement

Quand j'essaye de sortir comme ça, J'ai une bonne idée de la façon dont je ** l'utilise et ne le comprends pas **. Je continuerai à publier des articles régulièrement, donc si vous avez une autre chance, merci. Jusqu'à la fin Merci d'avoir lu!

référence

MyBatis Official-Dynamic SQL MyBatis Official --XML File

Recommended Posts

J'ai trouvé MyBatis utile, alors je l'ai écrit.
J'ai trouvé Lombok utile alors je l'ai écrit
Méthodes que j'ai trouvées utiles dans Ruby
J'ai passé Ruby Silver (juin 2020), je vais donc le résumer.
firewalld est devenu fou, alors j'ai réussi à le réparer
J'ai écrit un test CRUD avec SpringBoot + MyBatis + DBUnit (Partie 1)
Parquet-tools donne java.lang.ExceptionInInitializerError, donc je l'ai fait fonctionner avec java8
Java SE 13 (JSR388) est sorti alors je l'ai essayé