[JAVA] Vous pouvez éliminer @Param avec Kotlin 1.1 et MyBatis 3.4.1+! !!

Je pensais que "Customizer for Platform Transaction Manager sera ajouté à partir de Spring Boot 1.5" publié hier était la fin de cette année ... : sweat_smile: J'ai trouvé ce que je veux écrire, donc je poste vraiment le dernier post de l'année: wink:

En guise d'histoire ... Kotlin 1.1 devrait sortir en 2017 1Q (janvier à mars) et My Batis 3.4.1+ (lors de la compilation à l'aide de l'option -parameters ajoutée à partir de Java SE 8, le nom de l'argument de la méthode Mapper est lié. Si vous le combinez avec la version qui devient le nom de la variable), vous n'avez pas besoin d'utiliser @ Param.

Note:

2017/03/02 Kotlin 1.1 a été officiellement publié, nous avons donc apporté un correctif complet à la base de publication! !! (Le contenu est fondamentalement le même)

Et Kotlin 1.0?

Pour 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

J'ai dû spécifier @ Param. Si vous ne spécifiez pas «@ Param», le nom de la variable de liaison sera attribué mécaniquement en utilisant l'ordre des arguments, comme «pram1» ou «param2». (Je n'aime pas la commande ...)

De Kotlin 1.1?

Si vous spécifiez -java-parameters (équivalent à l'option -parameters ajoutée à partir de Java SE 8) comme option de compilation dans Kotlin 1.1 ...

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

Vous pouvez omettre la spécification de @ Param comme ceci: rire:

Note:

Ceci est pris en charge sur https://youtrack.jetbrains.com/issue/KT-8816 et publié dans Kotlin 1.1-M3.

Utilisons réellement Kotlin 1.1! !!

Voir c'est croire ... Alors vérifions-le en utilisant Kotlin 1.1 et MyBatis 3.4.1+. Dans cet article, j'expliquerai en me basant sur le "Utilisez mybatis-spring-boot-starter avec Kotlin".

Version de vérification de fonctionnement

Fixons la source

Tout d'abord, corrigez TodoMapper comme suit. Le but est d'avoir plusieurs arguments pour la méthode Mapper (car il n'y a pas de restrictions particulières sur le nom de la variable de liaison s'il n'y a qu'un seul argument, cela fonctionnera peu importe ce que vous spécifiez).

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

}

Ensuite, corrigeons l'appelant de la méthode Mapper.

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 = "soirée à boire"
        newTodo.details = "Ginza 19:00"

        todoMapper.insert(newTodo) //Insérer un nouveau Todo

-        val loadedTodo: Todo = todoMapper.select(newTodo.id)
+        val loadedTodo: Todo = todoMapper.select(id = newTodo.id) //Seul l'identifiant est spécifié, la valeur par défaut false est utilisée pour terminé
        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)
}

Essayez-le ... Essayons d'utiliser la commande Maven pour voir ce qui se passe lorsqu'elle est exécutée dans cet état.

$ ./mvnw clean spring-boot:run

La pile torres suivante s'affiche, et j'obtiens une erreur indiquant que la variable de liaison nommée ʻid` est introuvable.

...
        ... 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)
...

Exécution sur commande Maven

Tout d'abord, corrigeons le fichier POM comme suit.

<?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> <!--Modifié pour utiliser la dernière mise à jour au moment de la publication (la correction est facultative)-->
        <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.Correction pour utiliser la dernière de 1-->
    </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.En le mettant à 0, My Batis 3.4.2 est ajouté de manière transitoire aux artefacts dépendants-->
        </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.Soutenu par 1-java-Option Spécifier les paramètres-->
+                    </args>
+                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Si vous exécutez à nouveau la commande Maven après avoir modifié le fichier POM ...

$ ./mvnw clean spring-boot:run

Fonctionne maintenant bien: rire:

...
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    :soirée à boire
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:

Au fait ... Si vous compilez sans spécifier l'option -java-parameters ... le nom de l'argument sera quelque chose comme ʻarg0 ou ʻarg1, et cette valeur sera utilisée comme nom de la variable de liaison. L'erreur suivante se produira.

...
       ... 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)
...

Fonctionnement sur IntelliJ IDEA

J'ai pu confirmer que cela fonctionne en utilisant la commande Maven, mais ... Pendant le développement, il est courant de l'exécuter en utilisant les fonctions de l'EDI. Dans cet article, nous allons configurer Kotlin 1.1 pour être utilisé sur IntelliJ IDEA fourni par JetBrains, le développeur de Kotlin, et exécuter le programme modifié. (Il semble que le plugin Eclipse soit également disponible, mais je ne le gérerai pas cette fois)

Premièrement ... Mise à jour vers le plugin de support Kotlin 1.1. Sélectionnez "Outils-> Kotlin-> Configurer les mises à jour du plugin Kotlin" dans le menu de la fenêtre, sélectionnez "Stable", cliquez sur le bouton "Vérifier les mises à jour maintenant" et cliquez sur le bouton "Installer" s'il y a une cible de mise à jour pour installer le plug-in. Veuillez mettre à jour.

Ensuite, définissez la version du langage Kotlin et les options de compilation utilisées dans le projet. Après avoir sélectionné "Préférences-> Build, Execution, Deployment-> Compiler-> Kotlin Compiler" dans le menu de la fenêtre

Cliquez ensuite sur le bouton "OK".

kotlin11-compiler-settings.png

Après avoir modifié les paramètres, assurez-vous de sélectionner ** "Construire-> Rebuild Project" dans le menu de la fenêtre et reconstruire (compiler) avec les paramètres modifiés. (Si vous oubliez cela, cela peut ne pas fonctionner comme prévu ...)

Enfin ... Sélectionnez MybatisKotlinDemoApplication sur l'EDI et exécutez le programme et cela fonctionnera bien: rire:

...
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    :soirée à boire
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)
...

Résumé

Même si je ne peux pas migrer complètement de Java vers Kotlin, je pense personnellement que l'option d'utiliser Kotlin, qui ne prend en charge que les chaînes multilignes dans l'interface Mapper, est assez "fourmi". Je pensais que c'était dommage que le nom de l'argument réel ne puisse pas être traité comme un nom de variable de liaison dans Kotlin 1.0, mais comme il sera possible de le gérer parfaitement à partir de Kotlin 1.1, MyBatis est annoté (spécifiez SQL avec annotation). Je pense que cela vaut la peine d'essayer pour les utilisateurs utilisant).

Pour la méthode de compilation utilisant kotlin-maven-plugin lorsque Java et Kotlin coexistent, page de référence Kotlin .html # compiling-kotlin-and-java-sources).

Recommended Posts

Vous pouvez éliminer @Param avec Kotlin 1.1 et MyBatis 3.4.1+! !!
Bonjour tout le monde avec Kotlin et JavaFX
Bonjour tout le monde avec Kotlin et Tornado FX
[Bonne nouvelle] Vous pouvez toujours utiliser Java 8 !!
Avec Tomcat, vous pouvez utiliser des espaces réservés ($ {...}) dans web.xml.
Mettre à jour périodiquement la base de données avec Spring Batch et My Batis
Création d'un environnement où kotlin peut être compilé avec cli avec docker et exécuté avec java
Vous pouvez le faire avec une copie! Programmation orientée aspect (Android)
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Je veux faire des transitions d'écran avec kotlin et java!
Comment installer Gradle et Kotlin avec SDKMAN (Mac)