mybatis, une alternative à jpa

23
MyBatis, une alternative à JPA Avec Spring Boot par James Kokou GAGLO DevOps @peopleinput Avril 2017

Upload: kokou-gaglo

Post on 24-Jan-2018

221 views

Category:

Software


2 download

TRANSCRIPT

MyBatis, une alternative à JPA

Avec Spring Boot

par James Kokou GAGLODevOps @peopleinput

Avril 2017

Pésentation de MyBatis

• un framework léger de persistance

• opère un mapping des résultats des requêtes SQL

avec des objets Java (POJOs)

• personnalisation du mapping

Pésentation de MyBatis

● utilisation de XML ou des annotations pour les

configurations et les mappings (types primitifs)

d'interface en POJOs

● une alternative à JDBC et Hibernate

Hibernate vs MyBatisMyBatis Hibernate

MyBatis utilise du SQL Hibernate utilise du HQL

MyBatis mappe les résultats des requêtes SQL aux objets Java , pas de soucis pour la structure de tables.

Hibernate mappe les objets Java aux tables de la base de données.

C’est facile d’utiliser les procédures stockées

L’utilisation des procédures stockées ajoute de la complexité

Vous ecrivez tout le SQL dont vous avez besoin (même le schéma des tables). Vous gardez ainsi le contrôle sur le SQL qui est exécuté

Génère le SQL pour vous ce qui signifie que vous ne passez pas de temps sur SQL

Le mapping : diagramme de classe

Le mapping : Structure de la base de données

CREATE TABLE IF NOT EXISTS person ( id BIGINT NOT NULL AUTO_INCREMENT, first_name varchar(50) NOT NULL, last_name varchar(50) NOT NULL, telephone varchar(15), PRIMARY KEY (id));

CREATE TABLE IF NOT EXISTS car ( id BIGINT NOT NULL AUTO_INCREMENT, model varchar(50) NOT NULL, color varchar(50) NOT NULL, person_id int, PRIMARY KEY (id), FOREIGN KEY (person_id) REFERENCES person(id));

Le mapping : les entités

@Datapublic class Car { private Integer id; private String model; private String color; private Person person;}

@Datapublic class Person{ private Integer id; private String firstName; private String lastName; private String telephone; private List<Car> cars;}

Le mapping : les mappers

• Une interface

• Des annotations @Select, @Insert, @Update,

@Delete, ….

• Des requêtes SQL

• Des signatures de méthodes

Le mapping : PersonMapper (1 / 3)

public interface PersonMapper { String INSERT_PERSON = "INSERT INTO person( first_name,last_name,telephone) VALUES(#{firstName},#{lastName},#{telephone})";

String UPDATE = "UPDATE person " + "SET first_name=#{firstName}, last_name=#{lastName},

telephone=#{telephone} WHERE id=#{id}";

String SELECT_ALL ="SELECT * FROM person"; String FIND_BY_ID ="SELECT * FROM person WHERE id=#{id}"; String DELETE ="DELETE FROM person WHERE id=#{id}"; String SELECT_PERSON_CARS ="SELECT * FROM car WHERE person_id=#{id}";

Le mapping : PersonMapper (2 / 3)

@Insert(INSERT_PERSON) @Options(useGeneratedKeys = true) int insert(Person person);

@Select(FIND_BY_ID) @Results(id = "person-cars", value = { @Result(property = "id",column = "id"), @Result(property = "cars",column = "id", javaType = List.class,many = @Many(select = "getPersonCars")) })

Le mapping : PersonMapper (3 / 3)

Person findById(Integer id); @Select(SELECT_PERSON_CARS) List<Car> getPersonCars(Integer id);

@Select(SELECT_ALL) @ResultMap("person-cars") List<Person> selectAll();

@Update(UPDATE) int update(Person person);

@Delete(DELETE) int delete(Integer id);

}

Tests unitaires de validation des mappers

● Configuration de l’environnement des tests

Tests unitaires de validation des mappers● Configuration de l’environnement des tests

Tests unitaires de validation des mappers

● INSERT

Tests unitaires de validation des mappers

● UPDATE

Tests unitaires de validation des mappers

● SELECT ALL

Tests unitaires de validation des mappers

● DELETE

Tests unitaires de validation des mappers● RELATION ONE TO MANY (Person => Cars)

Tests unitaires de validation des mappers

● RESULTATS

Les dépendances du projet

● mybatis-spring-boot-starter● h2● lombok● spring-boot-starter-test● assertj-core

Configuration mybatis

Code source

https://github.com/freemanpolys/spring-boot-labs/tree/master/mybatis