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)
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 ...)
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.
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".
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)
...
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 ʻarg0ou ʻ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) ...
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
1.1
" -java-parameters
"à" Paramètres de ligne de commande supplémentaires "Cliquez ensuite sur le bouton "OK".
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)
...
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