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!
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.
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,
<mapper namespane =" src.mapper.MybatisMapper ">
.<select id =" select "resultType =" src.mapper.entity.TableEntity "> ~ </ select>
ausgeführt wird, und das Ergebnis wird TableEntity zugeordnet. Getan werden.@ Param
empfangen werden.Es ist sehr einfach, sich mit Java-Klassen und -Methoden zu verknüpfen, daher ist es intuitiv leicht zu verstehen!
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.
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.
@ Param
hinzuSampleParam2.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!
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!
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>
update table_name set age =? Where id =?
update table_name set name =?, Age =? Where id =?
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>
select * from table_name where id =?
Wählen Sie * aus Tabellenname, wobei Alter =?
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 "
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 "
<where> ~ </ where>
durch ** trim ** ersetzt wirdSampleTrim1.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>
<set> ~ </ set>
durch ** trim ** ersetzt wirdSampleTrim2.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 "
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>
Ich werde mir Notizen aus praktischer Sicht machen!
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>
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!
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!
MyBatis Official-Dynamic SQL MyBatis Official --XML File
Recommended Posts