Une introduction à JDBC

Quelques liens utiles

Mise en place

Utiliser HyperSQL

Pour nos exemples, nous allons utiliser la base de données embarquée HyperSQL. N'oubliez pas de lire la documentation HyperSQL. Elle se présente comme une librairie à ajouter à vos projet.

Spring Boot pour JDBC

Premiers programmes JDBC

Travail à faire :

Utiliser une DataSource

Mise en place

Une DataSource permet de centraliser la phase de paramétrage et ainsi de simplifier le code JDBC. Ces objets permettent également de gérer un ensemble de connexions ouvertes prêtes à être utilisées. Nous évitons ainsi l'ouverture de nouvelles connexions à chaque transaction (opération très coûteuse pour la BD).

Nous allons utiliser les dataSources Hikari fournies par Spring que nous allons configurer en ajoutant ces lignes dans notre fichier src/main/resources/application.properties :

spring.datasource.url=jdbc:hsqldb:file:databases/myBase
spring.datasource.username=SA
spring.datasource.password=
spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver

Nous pouvons ainsi simplifier notre classe NameDao :

...

    @Autowired
    DataSource dataSource;

    // Nouvelle version
    private Connection newConnection() throws SQLException {
        return dataSource.getConnection();
    }

...

Nous pouvons également construire une classe de configuration afin de maitriser la création de nos ressources :

package myapp.jdbc;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
public class SpringJdbcConfig {

    @Bean
    public DataSource myDataSource(//
            @Value("${spring.datasource.url}") String url, //
            @Value("${spring.datasource.username}") String user, //
            @Value("${spring.datasource.password}") String password//
    ) {
        System.out.println("--- my datasource");
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl(url);
        config.setUsername(user);
        config.setPassword(password);
        // le pool de connexion doit gérer
        // entre 5 et 10 connections prêtes.
        config.setMinimumIdle(5);
        config.setMaximumPoolSize(10);
        return new HikariDataSource(config);
    }

}

Pool de connexions

Nous allons maintenant illustrer le pool de connexions géré par la DataSource :

Spring et JDBC

Préalable. Jusqu'à maintenant nous avons utilisé Spring pour définir nos services et nos injections (de la DataSource dans la Dao et de la DAO dans les classses de test). Notre code JDBC n'utilise pas les fonctions de Spring.

Faciliter l'utilisation de JDBC

Nous allons maintenant utiliser les outils de Spring pour simplifier l'utilisation de JDBC.

Travail à faire :

Prévoir un script d'initialisation

Nous pouvons améliorer la phase de création du schéma relationnel en délocalisation le script dans un fichier schema.sql placé dans la package myapp.jdbc :

@PostConstruct
public void initSchema() throws SQLException {
    try (var c = jt.getDataSource().getConnection()) {
        var res = new ClassPathResource("schema.sql", SpringNameDao.class);
        ScriptUtils.executeSqlScript(c, res);
    }
}

Utiliser un Javabean

Commencez par préparer le Javabean de représentation des noms :

package myapp.jdbc;

import java.io.Serializable;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Name implements Serializable {

    private static final long serialVersionUID = 1L;

    private int id;
    private String name;

}

Travail à faire :