[JAVA] Ich fand MyBatis nützlich, also habe ich es geschrieben.

Fassen wir zusammen, was wir in der Feldserie gelernt haben (Einführung)

So wie es ist, ist es eine Reihe, die die auf dem Gebiet erlernten (verwendeten) Werkzeuge usw. zusammenfasst. Ich schreibe es mit dem Gefühl, dass es auch für mich selbst ist und dass es für jemanden sein sollte. Wir freuen uns auf Ihre Vorschläge und Kommentare zu Fehlern und Beschreibungsmethoden!

Verlauf bearbeiten

Was ist MyBatis?

Ein Framework zum Zuordnen von SQL-Anweisungen und -Objekten mithilfe von XML oder Anmerkungen.

Ganz zu schweigen vom normalen CRUD-Betrieb Sie können SQL je nach Status der Parameter dynamisch ausgeben! Wenn es eine Beschreibung gibt, die viele Male wiederverwendet werden kann, kann sie geteilt und die Anzahl der Beschreibungen reduziert werden.

In diesem Artikel werde ich hauptsächlich die Beschreibung von XML erläutern.

Grundlegende Beschreibung und Verwendung

Wie auch immer, es ist schneller, einen Blick auf die Quelle zu werfen, siehe unten.

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

//Import weggelassen

public interface MyBatisMapper {
  TableEntity select();

  void insert(TableEntity entity);
}

TableEntity.java


package src.mapper.entity

//Import weggelassen

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 für alle Bereiche
}

Um es kurz zu erklären,

  1. Verknüpfen Sie /src/mapper/MybatisMapper.java mit <mapper namespane =" src.mapper.MybatisMapper ">.
  2. Select wird ausgeführt, indem MybatisMapper.select () mit <select id =" select "resultType =" src.mapper.entity.TableEntity "> ~ </ select> ausgeführt wird, und das Ergebnis wird TableEntity zugeordnet. Getan werden.
  3. Wenn Sie einen Parameter übergeben möchten, können Sie ihn erhalten, indem Sie "# {id}" schreiben. Oben wird der Wert als Objekt übergeben, kann aber auch als Argument der Mapper-Klasse mit @ Param empfangen werden.

Es ist sehr einfach, sich mit Java-Klassen und -Methoden zu verknüpfen, daher ist es intuitiv leicht zu verstehen!

So übergeben Sie Parameter

Wenn Sie eine Datenklasse wie oben beschrieben vorbereiten können, können Sie sie nach Feldnamen zuordnen. (Ich denke, es wäre ohne einen Getter nutzlos gewesen) Aus verschiedenen Gründen jedoch für diejenigen, die es als Argument der Mapper-Klasse weitergeben wollen! Hier sind einige Möglichkeiten, dies zu tun.

Setzen Sie den XML-Parameter auf "# {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

//Import weggelassen

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

Wenn Sie so schreiben, hat "# {param1}" das erste Argument "id". Das zweite Argument, name, ist # {param2} zugeordnet! Es ist schwierig, die persönliche Zuordnung in der Reihenfolge der Argumente zu verstehen, daher wird dies nicht empfohlen.

Fügen Sie dem Argument der Mapper-Klasse @ Param hinzu

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

//Import weggelassen

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

Durch Angabe eines Alias mit einer Zeichenfolge im Argument von "@ Param" Sie können Parameter in XML zuordnen. Persönlich ist es am einfachsten zu verstehen und zu empfehlen!

Fahren Sie an der Karte vorbei

Wie das Erstellen einer Datenklasse Dies ist eine Methode zum Erstellen einer Karte mit "Schlüssel = Parametername" und "Wert = Wert". [Klicken Sie hier für Details](https://qiita.com/opengl-8080/items/a9b5d4038f19d4813ee6#map-%E3%81%A7%E3%83%91%E3%83%A9%E3%83%A1%E3 Siehe% 83% BC% E3% 82% BF% E3% 82% 92% E6% B8% A1% E3% 81% 99). (Wenn Sie dies tun, ist es meiner Meinung nach einfacher zu verstehen, wenn Sie eine Datenklasse erstellt haben.)

Als nächstes werde ich vorstellen, wie man dynamisches SQL schreibt!

Dynamisches SQL

Wie oben erwähnt, bedeutet dynamisches SQL, dass das vom Status des Parameters ausgegebene SQL dynamisch geändert werden kann! Im Einzelnen ist es wie folgt!

if/choose/where,set,trim Beispielsweise müssen Sie mehrere ähnliche SELECT-Anweisungen schreiben, da die Spalten, auf die verwiesen wird, identisch sind, die Bedingungen (WHERE-Klausel) jedoch unterschiedlich sind. .. Das ist eine Schande, nicht wahr? ** if / select / where, set, trim **, das weiter unten vorgestellt wird, ist eine praktische Beschreibungsmethode, wenn Sie die Bedingungen der WHERE-Klausel ändern oder die UPDATE-Anweisung vereinheitlichen möchten.

if

SampleIf.xml


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

Je nach Situation möchte ich aus mehr als zwei Bedingungen wählen! Ich denke, dass es solche Fälle geben wird. In diesem Fall verwenden Sie bitte ** wählen (wenn, sonst) **. (Ich habe es nicht so oft gesehen) 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 ** sind nützlich, wenn Sie mit etwas umständlichem SQL arbeiten möchten. Nehmen Sie zum Beispiel das folgende SQL.

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>

Wenn nicht alle ifs erfüllt sind, wird die SQL-Auswahl select * from table_name where ausgegeben und ein Syntaxfehler tritt auf. Wenn der Parameter .name nicht null ist und die Parameter .id und age null sind, tritt select * from table_name where and name =? Auf, was ebenfalls zu einem Syntaxfehler führt.

where Wenn Sie <where> ~ </ where> verwenden, wird where nur eingefügt, wenn eines der enthaltenen Tags ein Ergebnis zurückgibt. Wenn das Ergebnis des enthaltenen Tags mit "und" oder "oder" beginnt, werden sie gelöscht! Wie bequem es ist! .. ..

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 Dies ist die Set-Klausel-Version von where. Wenn Sie "" </ set> "verwenden, wird das zusätzliche", "gelöscht.

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 Die Anpassung ist möglich, indem das oben unter " to </ trim>" beschriebene "where" und "set" definiert wird. In Anbetracht der Lesbarkeit mag es subtil erscheinen, aber ich denke, es lohnt sich zu wissen!

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 Zum Beispiel, wenn Sie eine SELECT-Anweisung zur Erfassung und eine SELECT-Anweisung zur Aktualisierung benötigen Ist es nicht so, als ich es schrieb, gab es am Ende nur einen Unterschied mit oder ohne "für Update"? In einem solchen Fall wird die Verwendung von "" und " ~ </ include>" sauberer!

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>

Wie schreibe ich Tipps?

Ich werde mir Notizen aus praktischer Sicht machen!

Ich möchte eine LIKE-Klausel schreiben

In MyBatis gibt es zwei Möglichkeiten, Variablen zu schreiben.

--# {param}… Escape und in einfache Anführungszeichen setzen. --$ {param}… Entkomme nicht.

Das Folgende ist eine gebräuchliche Schreibweise. (Wenn Sie das Präfix mit der ID abgleichen möchten)

SampleSql.xml


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

Diese Schreibweise gibt weiterhin die richtige Abfrage aus. Wie oben erwähnt ** Es besteht das Risiko einer SQL-Injection, da diese nicht entweicht. ** ** **

Stellen Sie sicher, dass Sie die von jedem SQL bereitgestellten ** String-Joins verwenden. ** ** ** Das Folgende ist für Oracle.

SampleSql.xml


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

Ich möchte die Ungleichung nutzen

Da MyBatis in XML beschrieben ist, wird die Ungleichungsnummer "<>" als Metazeichen behandelt. Die Abfrage kann nicht normal gelesen werden. In einem solchen Fall können Sie es verwenden, indem Sie es in <![CDATA [...]]>!

SampleSql.xml


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

Ich denke, es ist besser lesbar, die gesamte SQL einzuschließen, als sie mit Punkten zu versehen. Ich persönlich empfehle den obigen Schreibstil!

Schließlich

Wenn ich versuche, so auszugeben, Ich habe eine gute Vorstellung davon, wie ich es einfach benutze und nicht verstehe. Ich werde weiterhin regelmäßig Artikel veröffentlichen. Wenn Sie also eine weitere Chance haben, danke. Bis zum Ende Danke fürs Lesen!

Referenz

MyBatis Official-Dynamic SQL MyBatis Official --XML File

Recommended Posts

Ich fand MyBatis nützlich, also habe ich es geschrieben.
Ich fand Lombok nützlich, also schrieb ich es
Methoden, die ich in Ruby nützlich fand
Ich habe Ruby Silver (Juni 2020) bestanden, also werde ich es zusammenfassen.
firewalld wurde verrückt, also konnte ich es reparieren
Ich habe einen CRUD-Test mit SpringBoot + MyBatis + DBUnit geschrieben (Teil 1)
Parkett-Tools gibt java.lang.ExceptionInInitializerError, also habe ich es mit java8 funktionieren lassen
Java SE 13 (JSR388) wurde veröffentlicht, also habe ich es versucht