Connessione a MariaDB in Spring Boot con Kotlin e MyBatis

Mattepuffo's logo
Connessione a MariaDB in Spring Boot con Kotlin e MyBatis

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!


Condividi

Commentami!