var code = „81563903-534d-4850-9d6a-a9fb0318f593“
In diesem Kurs wird umfassend die Verwendung des Mybatis-Frameworks erläutert, vom Schnellstart über die Prinzipanalyse bis hin zur praktischen Anwendung . Jeder Wissenspunkt hat einen Fall zum Demonstrieren und Lernen. Am Ende werden Sie ihn durch Lernen umfassend beherrschen und so die Entwicklung von Mybatis effizienter und systematischer lernen.
Durch die Entwicklung des Projekts sollten Sie feststellen, dass der CRUD-Funktionscode einer einzelnen Tabelle sehr repetitiv und nicht schwierig ist. Dieser Teil des Codes ist oft relativ umfangreich und zeitaufwändig zu entwickeln.
Daher werden derzeit in Unternehmen einige Komponenten verwendet, um die CRUD- Entwicklungsarbeit einer einzelnen Tabelle zu vereinfachen oder wegzulassen . Eine Komponente, die derzeit in China häufiger verwendet wird, ist MybatisPlus.
Die offizielle Website lautet wie folgt:
Natürlich vereinfacht MybatisPlus nicht nur Einzeltabellenoperationen, sondern bietet auch viele Erweiterungen der Funktionen von Mybatis . Es kann unsere Entwicklung einfacher und effizienter machen.
Durch die heutige Studie werden wir folgende Ziele erreichen:
- Kann MybatisPlus verwenden, um grundlegendes CRUD zu implementieren
- Verwendet die bedingte Konstruktion, um Abfragen zu erstellen und Anweisungen zu aktualisieren
- Verwendet allgemeine Anmerkungen in MybatisPlus
- Wird MybatisPlus verwenden, um Aufzählungs- und JSON-Typfelder zu verarbeiten
- Wird MybatisPlus verwenden, um Paging zu implementieren
1. Schnellstart
Um das Testen zu erleichtern, erstellen wir zunächst ein neues Projekt und bereiten einige Basisdaten vor.
1.1.Umgebungsvorbereitung
Kopieren Sie ein im Vorkursmaterial bereitgestelltes Projekt in Ihren Arbeitsbereich (ohne Leerzeichen oder Sonderzeichen):
Öffnen Sie es dann mit Ihrem IDEA-Tool. Die Projektstruktur ist wie folgt:
Achten Sie darauf, die JDK-Version des Projekts auf JDK11 zu konfigurieren. Klicken Sie zunächst auf die Projektstruktureinstellungen:
Konfigurieren Sie JDK im Popup-Fenster:
Als nächstes müssen wir zwei Tabellen importieren. Die SQL-Dateien wurden in den Materialien vor dem Unterricht bereitgestellt:
Die entsprechende Datenbanktabellenstruktur ist wie folgt:
Ändern Sie abschließend application.yaml
die JDBC-Parameter in Ihre eigenen Datenbankparameter:
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: MySQL123
logging:
level:
com.itheima: debug
pattern:
dateformat: HH:mm:ss
1.2. Schnellstart
Wenn wir beispielsweise CRUD für die Benutzertabelle implementieren möchten, benötigen wir nur die folgenden Schritte:
- Einführung der MybatisPlus-Abhängigkeit
- Mapper definieren
1.2.1Einführung von Abhängigkeiten
MybatisPlus bietet einen Starter zur Realisierung der automatischen Montagefunktion von Mybatis und MybatisPlus . Die Koordinaten lauten wie folgt:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
Da dieser Starter eine automatische Montage von Mybatis enthält, kann er den Starter von Mybatis vollständig ersetzen .
Letztendlich sind die Abhängigkeiten des Projekts wie folgt:
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2.2. Mapper definieren
Um Single-Table-CRUD zu vereinfachen, bietet MybatisPlus eine Basisschnittstelle BaseMapper
, die Single-Table-CRUD bereits implementiert hat:
Solange unser benutzerdefinierter Mapper dies implementiert BaseMapper
, besteht daher keine Notwendigkeit, CRUD für eine einzelne Tabelle selbst zu implementieren.
Ändern Sie die Schnittstelle com.itheima.mp.mapper
unter dem Paket in mp-demo UserMapper
, um es zu integrieren BaseMapper
:
1.2.3.Testen
Erstellen Sie eine neue Testklasse, schreiben Sie mehrere Komponententests und testen Sie grundlegende CRUD-Funktionen:
package com.itheima.mp.mapper;
import com.itheima.mp.domain.po.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.time.LocalDateTime;
import java.util.List;
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void testInsert() {
User user = new User();
user.setId(5L);
user.setUsername("Lucy");
user.setPassword("123");
user.setPhone("18688990011");
user.setBalance(200);
user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
user.setCreateTime(LocalDateTime.now());
user.setUpdateTime(LocalDateTime.now());
userMapper.insert(user);
}
@Test
void testSelectById() {
User user = userMapper.selectById(5L);
System.out.println("user = " + user);
}
@Test
void testSelectByIds() {
List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L, 5L));
users.forEach(System.out::println);
}
@Test
void testUpdateById() {
User user = new User();
user.setId(5L);
user.setBalance(20000);
userMapper.updateById(user);
}
@Test
void testDelete() {
userMapper.deleteById(5L);
}
}
Wie Sie sehen, ist das während des laufenden Prozesses gedruckte SQL-Protokoll sehr standardmäßig:
11:05:01 INFO 15524 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
11:05:02 INFO 15524 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
11:05:02 DEBUG 15524 --- [ main] c.i.mp.mapper.UserMapper.selectById : ==> Preparing: SELECT id,username,password,phone,info,status,balance,create_time,update_time FROM user WHERE id=?
11:05:02 DEBUG 15524 --- [ main] c.i.mp.mapper.UserMapper.selectById : ==> Parameters: 5(Long)
11:05:02 DEBUG 15524 --- [ main] c.i.mp.mapper.UserMapper.selectById : <== Total: 1
user = User(id=5, username=Lucy, password=123, phone=18688990011, info={"age": 21}, status=1, balance=20000, createTime=Fri Jun 30 11:02:30 CST 2023, updateTime=Fri Jun 30 11:02:30 CST 2023)
Sie müssen nur BaseMapper erben, um alle Einzeltabellen-CRUDs zu speichern . Ist das nicht sehr einfach?
1.3. Allgemeine Anmerkungen
Im Einführungsfall haben wir gerade nur Abhängigkeiten eingeführt und BaseMapper geerbt, um MybatisPlus verwenden zu können, was sehr einfach ist. Aber hier kommt das Problem:
Woher weiß MybatisPlus, welche Tabelle wir abfragen möchten? Welche Felder gibt es in der Tabelle?
Denken Sie daran, dass UserMapper beim Erben von BaseMapper einen generischen Wert angegeben hat:
Der Benutzer im generischen Typ ist der PO, der der Datenbank entspricht.
MybatisPlus leitet Tabelleninformationen basierend auf PO-Entitätsinformationen ab, um SQL zu generieren . standardmäßig:
- MybatisPlus wandelt den Klassennamen der PO-Entität in Camel Case um und unterstreicht ihn als Tabellennamen.
- MybatisPlus konvertiert alle Variablennamen der PO-Entität in Kamelbuchstaben, unterstreicht sie als Feldnamen der Tabelle und leitet den Feldtyp basierend auf dem Variablentyp ab.
- MybatisPlus verwendet das Feld mit dem Namen „id“ als Primärschlüssel
In vielen Fällen stimmt die Standardimplementierung jedoch nicht mit dem tatsächlichen Szenario überein . Daher stellt MybatisPlus einige Anmerkungen bereit, die uns die Deklaration von Tabelleninformationen erleichtern.
1.3.1.@Tabellenname
veranschaulichen:
Beschreibung: Tabellennamenanmerkung, die die Tabelle identifiziert, die der Entitätsklasse entspricht.
Verwendungsort: Entitätsklasse
Beispiel:
@TableName("user")
public class User {
private Long id;
private String name;
}
Neben der Angabe des Tabellennamens kann die TableName-Annotation auch viele andere Attribute angeben :
Attribute |
Typ |
Muss angegeben werden |
Standardwert |
beschreiben |
Wert |
Zeichenfolge |
NEIN |
„“ |
Tabellenname |
Schema |
Zeichenfolge |
NEIN |
„“ |
Schema |
keepGlobalPrefix |
Boolescher Wert |
NEIN |
FALSCH |
Ob der globale TablePrefix-Wert (Präfix) weiterhin verwendet werden soll (wenn der globale TablePrefix wirksam ist) |
resultMap |
Zeichenfolge |
NEIN |
„“ |
Die ID von resultMap in XML (wird verwendet, um bestimmte Arten der Objektbindung von Entitätsklassen zu erfüllen) |
autoResultMap |
Boolescher Wert |
NEIN |
FALSCH |
Ob resultMap automatisch erstellt und verwendet werden soll (wenn resultMap festgelegt ist, wird die automatische Erstellung und Injektion von resultMap nicht durchgeführt) |
ausschließenEigenschaft |
String[] |
NEIN |
{} |
Attributnamen , die seit 3.3.1 ausgeschlossen werden müssen |
1.3.2.@TableId
veranschaulichen:
Beschreibung: Primärschlüsselanmerkung, die das Primärschlüsselfeld in der Entitätsklasse identifiziert. Verwendungsort
: Primärschlüsselfeld der Entitätsklasse.
Beispiel:
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
}
TableId
Anmerkungen unterstützen zwei Eigenschaften:
Attribute |
Typ |
Muss angegeben werden |
Standardwert |
beschreiben |
Wert |
Zeichenfolge |
NEIN |
„“ |
Tabellenname |
Typ |
Aufzählung |
NEIN |
IdType.NONE |
Geben Sie den Primärschlüsseltyp an |
IdType
Unterstützte Typen sind:
Wert |
beschreiben |
AUTO |
Automatische Erhöhung der Datenbank-ID |
KEINER |
Zustandslos, dieser Typ hat keinen Primärschlüsselsatz (die Annotation entspricht dem Folgen von global , und das globale Rio entspricht ungefähr INPUT). |
EINGANG |
Legen Sie den Primärschlüsselwert vor dem Einfügen selbst fest |
ASSIGN_ID |
Weisen Sie eine ID zu (Primärschlüsseltyp ist Number (Long und Integer) oder String) (seit 3.3.0), verwenden Sie die Methode nextId der Schnittstelle IdentifierGenerator (die Standardimplementierungsklasse ist der Schneeflockenalgorithmus DefaultIdentifierGenerator ) |
ASSIGN_UUID |
Weisen Sie UUID zu , der Primärschlüsseltyp ist String (seit 3.3.0), verwenden Sie die Methode nextUUID der Schnittstelle IdentifierGenerator (Standardmethode). |
|
Verteilter global eindeutiger ID-Long-Integer-Typ (bitte ASSIGN_ID verwenden) |
|
32-Bit-UUID-Zeichenfolge (bitte ASSIGN_UUID verwenden) |
|
Verteilter global eindeutiger ID-String-Typ (bitte ASSIGN_ID verwenden) |
Hier gibt es drei gängige :
AUTO
: Verwenden Sie die Datenbank-ID, um automatisch zu wachsenINPUT
: ID manuell generierenASSIGN_ID
: Der Snowflake-Algorithmus generiertLong
eine global eindeutige ID für den Typ. Dies ist die Standard-ID-Strategie.
1.3.3.@TableField
veranschaulichen:
Beschreibung: Allgemeine Feldanmerkungen
Beispiel:
@TableName("user")
public class User {
@TableId
private Long id;
private String name;
private Integer age;
@TableField("isMarried")
private Boolean isMarried;
@TableField("`concat`")
private String concat;
}
Im Allgemeinen müssen wir @TableField
den Feldern keine Anmerkungen hinzufügen, außer in einigen besonderen Fällen:
- Der Name der Mitgliedsvariablen stimmt nicht
- Mitgliedsvariablen sind
isXXX
nach ihnen benannt und werden gemäßJavaBean
der SpezifikationMybatisPlus
beim Identifizieren von Feldernis
entfernt , was zu Inkonsistenzen mit der Datenbank führt. - Der Name der Mitgliedsvariablen stimmt mit der Datenbank überein, steht jedoch im Konflikt mit dem Schlüsselwort der Datenbank . Verwenden Sie
@TableField
Anmerkungen, um Feldnamen „Escapezeichen“ hinzuzufügen
Weitere unterstützte Attribute sind wie folgt:
Attribute |
Typ |
Erforderlich |
Standardwert |
beschreiben |
Wert |
Zeichenfolge |
NEIN |
„“ |
Name des Datenbankfelds |
existieren |
Boolescher Wert |
NEIN |
WAHR |
Ob es sich um ein Datenbanktabellenfeld |
Zustand |
Zeichenfolge |
NEIN |
„“ |
Feld , in dem die Entität die Vergleichsbedingung abfragt . Wenn ein Wert festgelegt ist, hat . Wenn nicht, wird der globale Standardwert %s=#{%s } verwendet. Weitere Informationen finden Sie unter (öffnet neues Fenster). |
aktualisieren |
Zeichenfolge |
NEIN |
„“ |
Der Feldaktualisierungssatz wird teilweise eingefügt. Beispiel: Wenn Sie update="%s+1" im Versionsfeld annotieren, wird angegeben, dass beim Aktualisieren version=version+1 festgelegt wird (dieses Attribut hat eine höhere Priorität als das el-Attribut). |
insertStrategy |
Aufzählung |
NEIN |
FieldStrategy.DEFAULT |
Beispiel: NOT_NULL In table_a(column) Werte einfügen (#{columnProperty}) |
updateStrategy |
Aufzählung |
NEIN |
FieldStrategy.DEFAULT |
Beispiel: IGNORIERT update table_a set columns=#{columnProperty} |
whereStrategie |
Aufzählung |
NEIN |
FieldStrategy.DEFAULT |
Beispiel: NOT_EMPTY wobei Column=#{columnProperty} |
füllen |
Aufzählung |
NEIN |
FieldFill.DEFAULT |
Strategie zum automatischen Ausfüllen von Feldern |
wählen |
Boolescher Wert |
NEIN |
WAHR |
Ob eine Auswahlabfrage durchgeführt werden soll |
keepGlobalFormat |
Boolescher Wert |
NEIN |
FALSCH |
Ob weiterhin das globale Format für die Verarbeitung verwendet werden soll |
jdbcType |
JdbcType |
NEIN |
JdbcType.UNDEFINED |
JDBC-Typ (dieser Standardwert bedeutet nicht, dass er gemäß diesem Wert wirksam wird) |
typeHandler( Typhandler ) |
TypeHander |
NEIN |
UnknownTypeHandler.class |
Typprozessor (Java-Spezialtypen und Datenbanktypkonvertierung) (Dieser Standardwert bedeutet nicht, dass er entsprechend diesem Wert wirksam wird .) |
numericScale |
Zeichenfolge |
NEIN |
„“ |
Geben Sie die Anzahl der Stellen an, die nach dem Dezimalpunkt beibehalten werden sollen |
1.4. Gemeinsame Konfigurationen
MybatisPlus unterstützt auch benutzerdefinierte Konfigurationen . Weitere Informationen finden Sie in der offiziellen Dokumentation:
Konfiguration verwenden | MyBatis-Plus
Die meisten Konfigurationen haben Standardwerte, sodass wir sie nicht konfigurieren müssen. Es gibt aber auch einige, die keinen Standardwert haben, wie zum Beispiel:
- Alias-Scanpaket für Entitätsklassen
- Globaler ID-Typ
mybatis-plus:
type-aliases-package: com.itheima.mp.domain.po
global-config:
db-config:
id-type: auto # 全局id类型为自增长
Es ist zu beachten, dass MyBatisPlus auch handgeschriebenes SQL unterstützt und die Leseadresse der Mapper-Datei selbst konfiguriert werden kann :
mybatis-plus:
mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,当前这个是默认值。
Sie können sehen, dass der Standardwert ist classpath*:/mapper/**/*.xml
. Dies bedeutet, dass die Datei „mapper.xml“ geladen wird, solange wir sie in diesem Verzeichnis ablegen .
Erstellen wir zum Beispiel eine neue UserMapper.xml
Datei:
Dann definieren Sie darin eine Methode:
<?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="com.itheima.mp.mapper.UserMapper">
<select id="queryById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
Testen Sie dann UserMapperTest
die Methode in der Testklasse:
@Test
void testQuery() {
User user = userMapper.queryById(1L);
System.out.println("user = " + user);
}