Connessione a MySQL con Kotlin, Spring e JPA
Sto studiando un pò il framework Spring; e usando Kotlin per rinfrescarlo un pò.
Oggi vediamo come connetterci ad un db MySQL / MariaDB già esistente usando JPA.
Per creare il progetto Spring ho usato l'initializr ufficiale, scegliendo Kotlin come linguaggio.
E Maven; questo solo le dipendenze:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-kotlin</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-reflect</artifactId>
</dependency>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-stdlib-jdk8</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.19</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
Dopo aver installato tutto correttamente, dovete modificare il file application.properties che dovreste già avere di default:
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=USERNAME
spring.datasource.password=PASSWORD
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
Le impostazioni che trovate per la connessione (quelle dopo il ? per intenderci) le ho dovute mettere per evitare diversi errori.
Lo step successivo è creare una data class per la nostra tabella:
import javax.persistence.Id
import java.io.Serializable
import javax.persistence.*
@Entity
@Table(name = "persone")
data class Persone(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var id: Int = 0,
var email: String = ""
) : Serializable
Qui dovete fare attenzione a due cose:
- agli import
- ai valori di default nel costruttore
Adesso creiamo una interface:
import org.springframework.data.repository.CrudRepository
interface PersoneRepo : CrudRepository<Persone, Int> {
}
La lasceremo vuota, in quanto i metodi verranno auto-generati.
Questo il nostro controller:
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.ResponseBody
import org.springframework.web.bind.annotation.RestController
@RestController
class PersoneController {
@Autowired
internal lateinit var pr: PersoneRepo;
@GetMapping("/persone")
@ResponseBody
fun getAll(): Iterable {
return pr.findAll();
}
}
Eseguira una query su tutti i records, e li manderà in output in formato JSON.
Infine il codice che si occupa dell'init dell'applicazione; non è stato modificato da quello originale:
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class SpringKotlinApplication
fun main(args: Array<String>) {
runApplication<SpringKotlinApplication>(*args)
}
Enjoy!
kotlin spring jpa mysql
Commentami!