[JAVA] Sie können @Param mit Kotlin 1.1 und MyBatis 3.4.1+ eliminieren! !!

Ich dachte, dass "Customizer für Platform Transaction Manager wird ab Spring Boot 1.5 hinzugefügt", das gestern veröffentlicht wurde, das Ende dieses Jahres war ... : heat_smile: Ich habe gefunden, was ich schreiben möchte, also poste ich wirklich den letzten Beitrag des Jahres: wink:

Als Geschichte ... Kotlin 1.1 soll 2017 1Q (Januar bis März) und My Batis 3.4.1+ veröffentlicht werden (Beim Kompilieren mit der aus Java SE 8 hinzugefügten Option -parameters ist der Argumentname der Mapper-Methode gebunden. Wenn Sie es mit der Version kombinieren, die zum Variablennamen wird, müssen Sie @ Param nicht verwenden.

Note:

2017/03/02 Kotlin 1.1 wurde offiziell veröffentlicht, daher haben wir eine vollständige Korrektur für die Release-Basis vorgenommen! !! (Der Inhalt ist grundsätzlich der gleiche)

Was ist mit Kotlin 1.0?

Für Kotlin 1.0.x ...

@Select("""
    SELECT
        id, title, details, finished
    FROM
        todo
    WHERE
        id = #{id}
    AND
        finished = #{finished}
""")
fun select(@Param("id") id: Int, @Param("finished") finished: Boolean = false): Todo

Ich musste "@ Param" angeben. Wenn Sie nicht "@ Param" angeben, wird der Name der Bindevariablen mechanisch in der Reihenfolge der Argumente wie "pram1" oder "param2" zugewiesen. (Ich mag die Bestellung nicht ...)

Von Kotlin 1.1?

Wenn Sie in Kotlin 1.1 als Kompilierungsoption -java-parameters (entspricht der aus Java SE 8 hinzugefügten Option -parameters) angeben ...

@Select("""
    SELECT
        id, title, details, finished
    FROM
        todo
    WHERE
        id = #{id}
    AND
        finished = #{finished}
""")
fun select(id: Int, finished: Boolean = false): Todo // @Param kann weggelassen werden! !!

Sie können die Spezifikation von @ Param wie folgt weglassen: lachen:

Note:

Dies wird unter https://youtrack.jetbrains.com/issue/KT-8816 behandelt und in Kotlin 1.1-M3 veröffentlicht.

Verwenden wir eigentlich Kotlin 1.1! !!

Sehen ist Glauben ... Also lasst es uns tatsächlich mit Kotlin 1.1 und MyBatis 3.4.1+ überprüfen. In diesem Beitrag werde ich anhand des zuvor veröffentlichten Beitrags "Mybatis-Spring-Boot-Starter mit Kotlin verwenden" erläutern.

Version zur Überprüfung des Betriebs

Lassen Sie uns die Quelle reparieren

Korrigieren Sie zuerst "TodoMapper" wie folgt. Es geht darum, mehrere Argumente für die Mapper-Methode zu haben (da der Name der Bindevariablen keine besonderen Einschränkungen aufweist, wenn nur ein Argument vorhanden ist, funktioniert dies unabhängig von Ihrer Angabe).

src/main/kotlin/com/example/mapper/TodoMapper.kt


@Mapper
interface TodoMapper {

    @Insert("""
        INSERT INTO todo
            (title, details, finished)
        VALUES
            (#{title}, #{details}, #{finished})
    """)
    @Options(useGeneratedKeys = true)
    fun insert(todo: Todo)

    @Select("""
        SELECT
            id, title, details, finished
        FROM
            todo
        WHERE
            id = #{id}
+        AND
+            finished = #{finished}
    """)
-    fun select(id: Int): Todo
+    fun select(id: Int, finished: Boolean = false): Todo

}

Als nächstes korrigieren wir den Aufrufer der Mapper-Methode.

src/main/kotlin/com/example/MybatisKotlinDemoApplication.kt


@SpringBootApplication
open class MybatisKotlinDemoApplication : CommandLineRunner {

    @Autowired
    lateinit var todoMapper: TodoMapper

    @Transactional
    override fun run(vararg args: String?) {
        val newTodo: Todo = Todo()
        newTodo.title = "Trinkparty"
        newTodo.details = "Ginza 19:00"

        todoMapper.insert(newTodo) //Fügen Sie einen neuen Todo ein

-        val loadedTodo: Todo = todoMapper.select(newTodo.id)
+        val loadedTodo: Todo = todoMapper.select(id = newTodo.id) //Es wird nur id angegeben, der Standardwert false wird für beendet verwendet
        println("ID       : " + loadedTodo.id)
        println("TITLE    : " + loadedTodo.title)
        println("DETAILS  : " + loadedTodo.details)
        println("FINISHED : " + loadedTodo.finished)
    }

}

fun main(args: Array<String>) {
    SpringApplication.run(MybatisKotlinDemoApplication::class.java, *args)
}

Probieren Sie es aus ... Versuchen wir, mit dem Befehl Maven zu sehen, was passiert, wenn er in diesem Zustand ausgeführt wird.

$ ./mvnw clean spring-boot:run

Die folgenden Stack-Torres werden angezeigt, und es wird eine Fehlermeldung angezeigt, dass die Bindevariable mit dem Namen "id" nicht gefunden werden kann.

...
        ... 12 more
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [0, 1, param1, param2]
        at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:186)
...

Ausführung auf Befehl Maven

Korrigieren wir zunächst die POM-Datei wie folgt.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>mybatis-kotlin-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>mybatis-kotlin-demo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
-        <version>1.4.1.RELEASE</version>
+        <version>1.5.1.RELEASE</version> <!--Geändert, um den neuesten Stand zum Zeitpunkt der Aktualisierung der Veröffentlichung zu verwenden (Korrektur ist optional)-->
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
-        <kotlin.version>1.0.3</kotlin.version>
+        <kotlin.version>1.1.0</kotlin.version> <!-- 1.Es wurde ein Fehler behoben, der die neueste von 1 verwendete-->
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jetbrains.kotlin</groupId>
            <artifactId>kotlin-stdlib</artifactId>
            <version>${kotlin.version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
-            <version>1.1.1</version>
+            <version>1.2.0</version> <!-- 1.2.Durch Setzen auf 0, My Batis 3.4.2 wird vorübergehend zu abhängigen Artefakten hinzugefügt-->
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>

    </dependencies>

    <build>
        <sourceDirectory>${project.basedir}/src/main/kotlin</sourceDirectory>
        <testSourceDirectory>${project.basedir}/src/test/kotlin</testSourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>kotlin-maven-plugin</artifactId>
                <groupId>org.jetbrains.kotlin</groupId>
                <version>${kotlin.version}</version>
                <executions>
                    <execution>
                        <id>compile</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>compile</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>test-compile</id>
                        <phase>test-compile</phase>
                        <goals>
                            <goal>test-compile</goal>
                        </goals>
                    </execution>
                </executions>
+                <configuration>
+                    <args>
+                        <arg>-java-parameters</arg> <!-- Kotlin 1.Unterstützt von 1-java-Geben Sie die Option Parameter an-->
+                    </args>
+                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Wenn Sie den Maven-Befehl nach dem Ändern der POM-Datei erneut ausführen ...

$ ./mvnw clean spring-boot:run

Funktioniert jetzt gut: Lachen:

...
2017-03-02 22:00:55.855  INFO 85743 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
ID       : 1
TITLE    :Trinkparty
DETAILS  :Ginza 19:00
FINISHED : false
2017-03-02 22:00:55.932  INFO 85743 --- [           main] c.e.MybatisKotlinDemoApplicationKt       : Started MybatisKotlinDemoApplicationKt in 1.84 seconds (JVM running for 9.21)
...

Note:

Übrigens ... Wenn Sie kompilieren, ohne die Option "-java-parameters" anzugeben ... sieht der Argumentname wie "arg0" oder "arg1" aus, und dieser Wert wird als Name der Bindevariablen verwendet. Der folgende Fehler wird auftreten.

...
       ... 12 more
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]
       at org.apache.ibatis.binding.MapperMethod$ParamMap.get(MapperMethod.java:195)
...

Laufen auf IntelliJ IDEA

Ich konnte bestätigen, dass es mit dem Befehl Maven funktioniert, aber ... Während der Entwicklung ist es üblich, es mit den Funktionen der IDE auszuführen. In diesem Beitrag konfigurieren wir Kotlin 1.1 für die Verwendung in IntelliJ IDEA, das von JetBrains, dem Entwickler von Kotlin, bereitgestellt wird, und führen das geänderte Programm aus. (Es scheint, dass das Eclipse-Plugin ebenfalls verfügbar ist, aber ich werde diesmal nicht damit umgehen.)

Zuerst ... Update auf Kotlin 1.1 Support Plugin. Wählen Sie im Fenstermenü "Extras-> Kotlin-> Kotlin-Plugin-Updates konfigurieren", wählen Sie "Stabil", klicken Sie auf die Schaltfläche "Jetzt nach Updates suchen" und klicken Sie auf die Schaltfläche "Installieren", wenn ein Update-Ziel für die Installation des Plug-Ins vorhanden ist. Bitte aktualisieren.

Legen Sie als Nächstes die Kotlin-Sprachversion und die im Projekt verwendeten Kompilierungsoptionen fest. Nach Auswahl von "Einstellungen-> Erstellen, Ausführen, Bereitstellen-> Compiler-> Kotlin-Compiler" aus dem Fenstermenü

Klicken Sie dann auf die Schaltfläche "OK".

kotlin11-compiler-settings.png

Stellen Sie nach dem Ändern der Einstellungen sicher, dass Sie im Fenstermenü ** "Erstellen-> Projekt neu erstellen" auswählen und mit den geänderten Einstellungen neu erstellen (kompilieren). (Wenn Sie dies vergessen, funktioniert es möglicherweise nicht wie erwartet ...)

Schließlich ... Wählen Sie in der IDE "MybatisKotlinDemoApplication" aus und führen Sie das Programm aus. Es wird einwandfrei funktionieren: Lachen:

...
2017-03-02 22:37:28.315  INFO 86040 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
ID       : 1
TITLE    :Trinkparty
DETAILS  :Ginza 19:00
FINISHED : false
2017-03-02 22:37:28.390  INFO 86040 --- [           main] c.e.MybatisKotlinDemoApplicationKt       : Started MybatisKotlinDemoApplicationKt in 2.282 seconds (JVM running for 2.677)
...

Zusammenfassung

Auch wenn ich nicht vollständig von Java nach Kotlin migrieren kann, denke ich persönlich, dass die Option, Kotlin zu verwenden, das nur mehrzeilige Zeichenfolgen in der Mapper-Oberfläche unterstützt, ziemlich "ant" ist. Ich fand es schade, dass der tatsächliche Argumentname in Kotlin 1.0 nicht als Bindevariablenname behandelt werden konnte, aber da es in Kotlin 1.1 möglich sein wird, ihn perfekt zu handhaben, ist MyBatis mit Anmerkungen versehen (SQL mit Anmerkung angeben). Ich denke, es ist einen Versuch wert für Benutzer, die) verwenden.

Für die Kompilierungsmethode mit dem Kotlin-Maven-Plugin bei gleichzeitiger Existenz von Java und Kotlin Kotlin-Referenzseite .html # Kompilieren von Kotlin- und Java-Quellen).

Recommended Posts

Sie können @Param mit Kotlin 1.1 und MyBatis 3.4.1+ eliminieren! !!
Hallo Welt mit Kotlin und JavaFX
Hallo Welt mit Kotlin und Tornado FX
[Gute Nachrichten] Sie können immer noch mit Java 8 gehen !!
Mit Tomcat können Sie Platzhalter ($ {...}) in web.xml verwenden.
Aktualisieren Sie die Datenbank regelmäßig mit Spring Batch und My Batis
Erstellt eine Umgebung, in der Kotlin mit Docker mit CLI kompiliert und mit Java ausgeführt werden kann
Sie können es mit Kopie tun! Aspektorientierte Programmierung (Android)
Wenn Sie Mockito mit Kotlin verwenden möchten, verwenden Sie Mockito-Kotlin
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
So installieren Sie Gradle und Kotlin mit SDKMAN (Mac)