Connessione a MariaDB in Spring Boot con Kotlin e MyBatis
MyBatis è un framework di persistenza che si "frappone" tra strumenti completi come Hibernate, e l'usare JDBC e scrivere tutto da zero.
In sostanza ci leva alcune operazioni che dovremmo fare usando JDBC, ma ci lascia un pò più di flessibilità rispetto ad Hibernate.
Oggi vediamo un esempio di utilizzo in Kotlin e Spring Boot, con un db MariaDB.
Queste le mie dipendenze in gradle:
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
// MyBatis
implementation("org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3")
// MariaDB Driver
implementation("org.mariadb.jdbc:mariadb-java-client:3.3.0")
}
Questo il mio application.properties:
spring.application.name=test_spring_kotlin
# Database Configuration
spring.datasource.url=jdbc:mariadb://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=9211
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
# MyBatis Configuration
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.spring.kotlin
mybatis.configuration.map-underscore-to-camel-case=true
# Logging (opzionale, per debug)
logging.level.com.example.demo.mapper=DEBUG
Poi create resources/mapper/PersonaMapper.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="com.spring.kotlin.mapper.PersonaMapper">
<resultMap id="PersonaResultMap" type="com.spring.kotlin.model.Persona">
<id property="id" column="id"/>
<result property="email" column="email"/>
</resultMap>
<select id="findAll" resultMap="PersonaResultMap">
SELECT id, email FROM persone
</select>
<select id="findById" parameterType="long" resultMap="PersonaResultMap">
SELECT id, email FROM persone WHERE id = #{id}
</select>
<insert id="insert" parameterType="com.spring.kotlin.model.Persona"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO persone (email) VALUES (#{email})
</insert>
<update id="update" parameterType="com.spring.kotlin.model.Persona">
UPDATE persone SET email = #{email} WHERE id = #{id}
</update>
<delete id="deleteById" parameterType="long">
DELETE FROM persone WHERE id = #{id}
</delete>
</mapper>
Questo il model/Persona:
package com.spring.kotlin.model
data class Persona(
val id: Long? = null,
val email: String
)
Poi mapper/PersonaMapper:
package com.spring.kotlin.mapper
import com.spring.kotlin.model.Persona
import org.apache.ibatis.annotations.Mapper
@Mapper
interface PersonaMapper {
fun findAll(): List<Persona>
fun findById(id: Long): Persona?
fun insert(persona: Persona): Int
fun update(persona: Persona): Int
fun deleteById(id: Long): Int
}
Il controller:
package com.spring.kotlin
import com.spring.kotlin.mapper.PersonaMapper
import com.spring.kotlin.model.Persona
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class RootController(private val personaMapper: PersonaMapper) {
@GetMapping("/")
fun root(): List<Persona> {
return personaMapper.findAll()
}
}
E vi posto il main:
package com.spring.kotlin
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.scheduling.annotation.EnableScheduling
@SpringBootApplication
class TestSpringKotlinApplication
fun main(args: Array<String>) {
runApplication<TestSpringKotlinApplication>(*args)
}
Enjoy!
kotlin gradle spring boot mariadb mybatis
Commentami!