diff --git a/pom.xml b/pom.xml index f6c69a8..5d8220d 100644 --- a/pom.xml +++ b/pom.xml @@ -25,9 +25,16 @@ + + + + org.springframework.data + spring-data-jdbc + 3.2.5 @@ -37,6 +44,6 @@ test - + org.apache.maven.pluginsmaven-compiler-plugin88 diff --git a/src/main/java/com/mycompany/invoice/web/entity/Invoice.java b/src/main/java/com/mycompany/invoice/web/entity/Invoice.java index 148f1e3..d84d8d7 100644 --- a/src/main/java/com/mycompany/invoice/web/entity/Invoice.java +++ b/src/main/java/com/mycompany/invoice/web/entity/Invoice.java @@ -1,12 +1,23 @@ package com.mycompany.invoice.web.entity; +import org.springframework.data.annotation.Id; +import org.springframework.data.relational.core.mapping.Column; +import org.springframework.data.relational.core.mapping.Table; + +@Table("invoice") public class Invoice { /** * ATTRIBUTS */ + @Id + @Column("INVOICE_NUMBER") private String number; + + @Column("CUSTOMER_NAME") private String customerName; + + @Column("ORDER_NUMBER") private String orderNumber; /** diff --git a/src/main/java/com/mycompany/invoice/web/repository/IInvoiceRepository.java b/src/main/java/com/mycompany/invoice/web/repository/IInvoiceRepository.java index 4bbc075..ba22547 100644 --- a/src/main/java/com/mycompany/invoice/web/repository/IInvoiceRepository.java +++ b/src/main/java/com/mycompany/invoice/web/repository/IInvoiceRepository.java @@ -1,12 +1,20 @@ package com.mycompany.invoice.web.repository; import com.mycompany.invoice.web.entity.Invoice; +import org.springframework.data.repository.CrudRepository; import java.util.List; -public interface IInvoiceRepository { +public interface IInvoiceRepository extends CrudRepository { + /** + * AVEC L'UTILISATION DE SPRING DATA JDBC + * IL N'EST PLUS NECESSAIRE D'AVCOIR UN REPOSITORY + * C'EST L'INTERFACE QUI VA ETENDRE UN CRUD REPOSITORY + */ + /* Invoice create(Invoice invoice); List getListInvoice(); public Invoice getInvoiceByNumber(String number); + */ } diff --git a/src/main/java/com/mycompany/invoice/web/repository/cache/InvoiceRepositoryCache.java b/src/main/java/com/mycompany/invoice/web/repository/cache/InvoiceRepositoryCache.java index 5859034..04da6c4 100644 --- a/src/main/java/com/mycompany/invoice/web/repository/cache/InvoiceRepositoryCache.java +++ b/src/main/java/com/mycompany/invoice/web/repository/cache/InvoiceRepositoryCache.java @@ -11,6 +11,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; //@Repository public class InvoiceRepositoryCache implements IInvoiceRepository { @@ -44,45 +45,66 @@ public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException { } } - public Invoice create(Invoice invoice){ + @Override + public Invoice save(Invoice invoice){ this.invoices.add(invoice); System.out.println("Cache : Invoice added with number " + invoice.getNumber() + " for " + invoice.getCustomerName() + "."); return invoice; } - public List getListInvoice(){ + @Override + public Iterable findAll(){ + throw new UnsupportedOperationException(); + } + + @Override + public Iterable findAllById(Iterable strings) { + throw new UnsupportedOperationException(); + } - // On crée des données fictives, car on a pas encore de DB - Invoice invoice1 = new Invoice(); - invoice1.setNumber("1"); - invoice1.setCustomerName("Customer1"); + @Override + public long count() { + throw new UnsupportedOperationException(); + } + + @Override + public void deleteById(String s) { + throw new UnsupportedOperationException(); + } - Invoice invoice2 = new Invoice(); - invoice2.setNumber("2"); - invoice2.setCustomerName("Customer2"); - invoice2.setOrderNumber("ON_02"); + @Override + public void delete(Invoice entity) { + throw new UnsupportedOperationException(); + } - // On les ajoutes à une liste qu'on va renvoyer - List listInvoice = new ArrayList<>(); - listInvoice.add(invoice1); - listInvoice.add(invoice2); + @Override + public void deleteAllById(Iterable strings) { + throw new UnsupportedOperationException(); + } - // On retourne les données - return listInvoice; + @Override + public void deleteAll(Iterable entities) { + throw new UnsupportedOperationException(); } - public Invoice getInvoiceByNumber(String number){ + @Override + public void deleteAll() { + throw new UnsupportedOperationException(); + } - System.out.println(" ----- InvoiceRepositoryCache/getInvoiceByNumber ----- "); + @Override + public Iterable saveAll(Iterable entities) { + throw new UnsupportedOperationException(); + } - // On crée des données fictives, car on a pas encore de DB - Invoice invoice = new Invoice(); - invoice.setNumber(number); - invoice.setCustomerName("Customer_1"); - invoice.setOrderNumber("OrderNumber_1"); + @Override + public Optional findById(String number){ + throw new UnsupportedOperationException(); + } - // On retourne les données - return invoice; + @Override + public boolean existsById(String s) { + throw new UnsupportedOperationException(); } /** diff --git a/src/main/java/com/mycompany/invoice/web/repository/db/InvoiceRepositoryDB.java b/src/main/java/com/mycompany/invoice/web/repository/db/InvoiceRepositoryDB.java index b6b5f18..767405c 100644 --- a/src/main/java/com/mycompany/invoice/web/repository/db/InvoiceRepositoryDB.java +++ b/src/main/java/com/mycompany/invoice/web/repository/db/InvoiceRepositoryDB.java @@ -1,166 +1,172 @@ package com.mycompany.invoice.web.repository.db; -import com.mycompany.invoice.web.entity.Invoice; -import com.mycompany.invoice.web.repository.IInvoiceRepository; -import com.mycompany.invoice.web.repository.cache.InvoiceRepositoryCache; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.support.GeneratedKeyHolder; -import org.springframework.jdbc.support.KeyHolder; -import org.springframework.stereotype.Repository; - -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.List; - -@Repository -public class InvoiceRepositoryDB implements IInvoiceRepository { - - /** - * ATTRIBUTS - */ - private static List invoices = new ArrayList<>(); - - @Autowired - private JdbcTemplate jdbcTemplate; - - /** - * METHODS - */ - private static final class InvoiceRowMapper implements RowMapper { - - // Redéfinir une méthode de l'interface RowMapper. - @Override - public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException { - - // Création de la nouvelle facture - Invoice invoice = new Invoice(); - - // Ajout des attributs - invoice.setNumber(String.valueOf(rs.getLong("INVOICE_NUMBER"))); - invoice.setCustomerName(rs.getString("CUSTOMER_NAME")); - invoice.setOrderNumber(rs.getString("ORDER_NUMBER")); - - return invoice; - } - } - - // Sans DB - /*public void create(Invoice invoice){ - this.invoices.add(invoice); - System.out.println("DB : Invoice added with number " + invoice.getNumber() + " for " + invoice.getCustomerName() + "."); - }*/ - - // Avec DB Sans clé générée pas la DB en retour - /*@Override - public void create(Invoice invoice){ - String sql = "INSERT INTO invoice (customer_name, order_number) VALUES (?, ?)"; - jdbcTemplate.update(sql, invoice.getCustomerName(), invoice.getOrderNumber()); - }*/ - - // Avec DB Avec clé générée par la DB en retour - @Override - public Invoice create(Invoice invoice) { - - // KeyHolder est utilisé pour capturer la clé générée par la base de données - KeyHolder kh = new GeneratedKeyHolder(); - - // Utilisation de JdbcTemplate pour exécuter une mise à jour (insertion) - jdbcTemplate.update(connection -> { - - // Préparation de la requête SQL avec RETURN_GENERATED_KEYS pour obtenir la clé générée - PreparedStatement ps = connection.prepareStatement( - "INSERT INTO INVOICE(CUSTOMER_NAME, ORDER_NUMBER) VALUES (?, ?)", - Statement.RETURN_GENERATED_KEYS - ); - // Affectation des valeurs des paramètres à la requête préparée - ps.setString(1, invoice.getCustomerName()); // Premier paramètre (index 1) - ps.setString(2, invoice.getOrderNumber()); // Deuxième paramètre (index 2) - - // Retourne l'objet PreparedStatement pour l'exécution - return ps; - - }, kh); // KeyHolder pour capturer la clé générée - - // Conversion de la clé générée en chaîne de caractères et l'affecte à l'attribut 'number' de l'objet Invoice - invoice.setNumber(kh.getKey().toString()); - - // Retourne l'objet Invoice mis à jour avec la clé générée - return invoice; - } - - // Méthode sans DB - /*public List getListInvoice(){ - - // On crée des données fictives, car on a pas encore de DB - Invoice invoice1 = new Invoice(); - invoice1.setNumber("1"); - invoice1.setCustomerName("Customer1"); - - Invoice invoice2 = new Invoice(); - invoice2.setNumber("2"); - invoice2.setCustomerName("Customer2"); - - // On les ajoutes à une liste qu'on va renvoyer - List listInvoice = new ArrayList<>(); - listInvoice.add(invoice1); - listInvoice.add(invoice2); - - // On retourne les données - return listInvoice; - }*/ - - // Méthode avec DB - @Override - public List getListInvoice(){ - - System.out.println(" ----- InvoiceRepositoryDB/getListInvoice ----- "); - - // Requête SQL - String sqlRequest = "SELECT * FROM invoice"; - return jdbcTemplate.query(sqlRequest,new InvoiceRowMapper()); - } - - // Méthode sans DB - /*public Invoice getInvoiceByNumber(String number){ - - System.out.println(" ----- InvoiceRepositoryDB/getInvoiceByNumber ----- "); - - // On crée des données fictives, car on a pas encore de DB - Invoice invoice = new Invoice(); - invoice.setNumber(number); - invoice.setCustomerName("Customer_1"); - invoice.setOrderNumber("OrderNumber_1"); - - // On retourne les données - return invoice; - }*/ - - // Méthode avec DB - @Override - public Invoice getInvoiceByNumber(String number){ - - System.out.println(" ----- InvoiceRepositoryDB/getInvoiceByNumber ----- "); - - // Requête SQL - String sqlRequest = "SELECT * FROM invoice WHERE INVOICE_NUMBER=?"; - - // On retourne les données - return jdbcTemplate.queryForObject(sqlRequest,new InvoiceRowMapper(), number); - } - - /** - * GETTERS/SETTERS - */ - public static List getInvoices() { - return invoices; - } - - public static void setInvoices(List invoices) { - InvoiceRepositoryDB.invoices = invoices; - } -} +/** + * AVEC L'UTILISATION DE SPRING DATA JDBC + * IL N'EST PLUS NECESSAIRE D'AVCOIR UN REPOSITORY + * C'EST L'INTERFACE QUI VA ETENDRE UN CRUD REPOSITORY + */ + +//import com.mycompany.invoice.web.entity.Invoice; +//import com.mycompany.invoice.web.repository.IInvoiceRepository; +//import com.mycompany.invoice.web.repository.cache.InvoiceRepositoryCache; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.jdbc.core.JdbcTemplate; +//import org.springframework.jdbc.core.RowMapper; +//import org.springframework.jdbc.support.GeneratedKeyHolder; +//import org.springframework.jdbc.support.KeyHolder; +//import org.springframework.stereotype.Repository; +// +//import java.sql.PreparedStatement; +//import java.sql.ResultSet; +//import java.sql.SQLException; +//import java.sql.Statement; +//import java.util.ArrayList; +//import java.util.List; +// +//@Repository +//public class InvoiceRepositoryDB implements IInvoiceRepository { +// +// /** +// * ATTRIBUTS +// */ +// private static List invoices = new ArrayList<>(); +// +// @Autowired +// private JdbcTemplate jdbcTemplate; +// +// /** +// * METHODS +// */ +// private static final class InvoiceRowMapper implements RowMapper { +// +// // Redéfinir une méthode de l'interface RowMapper. +// @Override +// public Invoice mapRow(ResultSet rs, int rowNum) throws SQLException { +// +// // Création de la nouvelle facture +// Invoice invoice = new Invoice(); +// +// // Ajout des attributs +// invoice.setNumber(String.valueOf(rs.getLong("INVOICE_NUMBER"))); +// invoice.setCustomerName(rs.getString("CUSTOMER_NAME")); +// invoice.setOrderNumber(rs.getString("ORDER_NUMBER")); +// +// return invoice; +// } +// } +// +// // Sans DB +// /*public void create(Invoice invoice){ +// this.invoices.add(invoice); +// System.out.println("DB : Invoice added with number " + invoice.getNumber() + " for " + invoice.getCustomerName() + "."); +// }*/ +// +// // Avec DB Sans clé générée pas la DB en retour +// /*@Override +// public void create(Invoice invoice){ +// String sql = "INSERT INTO invoice (customer_name, order_number) VALUES (?, ?)"; +// jdbcTemplate.update(sql, invoice.getCustomerName(), invoice.getOrderNumber()); +// }*/ +// +// // Avec DB Avec clé générée par la DB en retour +// @Override +// public Invoice create(Invoice invoice) { +// +// // KeyHolder est utilisé pour capturer la clé générée par la base de données +// KeyHolder kh = new GeneratedKeyHolder(); +// +// // Utilisation de JdbcTemplate pour exécuter une mise à jour (insertion) +// jdbcTemplate.update(connection -> { +// +// // Préparation de la requête SQL avec RETURN_GENERATED_KEYS pour obtenir la clé générée +// PreparedStatement ps = connection.prepareStatement( +// "INSERT INTO INVOICE(CUSTOMER_NAME, ORDER_NUMBER) VALUES (?, ?)", +// Statement.RETURN_GENERATED_KEYS +// ); +// // Affectation des valeurs des paramètres à la requête préparée +// ps.setString(1, invoice.getCustomerName()); // Premier paramètre (index 1) +// ps.setString(2, invoice.getOrderNumber()); // Deuxième paramètre (index 2) +// +// // Retourne l'objet PreparedStatement pour l'exécution +// return ps; +// +// }, kh); // KeyHolder pour capturer la clé générée +// +// // Conversion de la clé générée en chaîne de caractères et l'affecte à l'attribut 'number' de l'objet Invoice +// invoice.setNumber(kh.getKey().toString()); +// +// // Retourne l'objet Invoice mis à jour avec la clé générée +// return invoice; +// } +// +// // Méthode sans DB +// /*public List getListInvoice(){ +// +// // On crée des données fictives, car on a pas encore de DB +// Invoice invoice1 = new Invoice(); +// invoice1.setNumber("1"); +// invoice1.setCustomerName("Customer1"); +// +// Invoice invoice2 = new Invoice(); +// invoice2.setNumber("2"); +// invoice2.setCustomerName("Customer2"); +// +// // On les ajoutes à une liste qu'on va renvoyer +// List listInvoice = new ArrayList<>(); +// listInvoice.add(invoice1); +// listInvoice.add(invoice2); +// +// // On retourne les données +// return listInvoice; +// }*/ +// +// // Méthode avec DB +// @Override +// public List getListInvoice(){ +// +// System.out.println(" ----- InvoiceRepositoryDB/getListInvoice ----- "); +// +// // Requête SQL +// String sqlRequest = "SELECT * FROM invoice"; +// return jdbcTemplate.query(sqlRequest,new InvoiceRowMapper()); +// } +// +// // Méthode sans DB +// /*public Invoice getInvoiceByNumber(String number){ +// +// System.out.println(" ----- InvoiceRepositoryDB/getInvoiceByNumber ----- "); +// +// // On crée des données fictives, car on a pas encore de DB +// Invoice invoice = new Invoice(); +// invoice.setNumber(number); +// invoice.setCustomerName("Customer_1"); +// invoice.setOrderNumber("OrderNumber_1"); +// +// // On retourne les données +// return invoice; +// }*/ +// +// // Méthode avec DB +// @Override +// public Invoice getInvoiceByNumber(String number){ +// +// System.out.println(" ----- InvoiceRepositoryDB/getInvoiceByNumber ----- "); +// +// // Requête SQL +// String sqlRequest = "SELECT * FROM invoice WHERE INVOICE_NUMBER=?"; +// +// // On retourne les données +// return jdbcTemplate.queryForObject(sqlRequest,new InvoiceRowMapper(), number); +// } +// +// /** +// * GETTERS/SETTERS +// */ +// public static List getInvoices() { +// return invoices; +// } +// +// public static void setInvoices(List invoices) { +// InvoiceRepositoryDB.invoices = invoices; +// } +//} \ No newline at end of file diff --git a/src/main/java/com/mycompany/invoice/web/service/IInvoiceService.java b/src/main/java/com/mycompany/invoice/web/service/IInvoiceService.java index 18d2d77..222191b 100644 --- a/src/main/java/com/mycompany/invoice/web/service/IInvoiceService.java +++ b/src/main/java/com/mycompany/invoice/web/service/IInvoiceService.java @@ -9,7 +9,7 @@ public interface IInvoiceService{ Invoice create(Invoice invoice); void setInvoiceRepository(IInvoiceRepository invoiceRepository); - List getListInvoice(); + Iterable getListInvoice(); Invoice getInvoiceByNumber(String number); } diff --git a/src/main/java/com/mycompany/invoice/web/service/number/InvoiceServiceNumber.java b/src/main/java/com/mycompany/invoice/web/service/number/InvoiceServiceNumber.java index 4d29b80..837e68f 100644 --- a/src/main/java/com/mycompany/invoice/web/service/number/InvoiceServiceNumber.java +++ b/src/main/java/com/mycompany/invoice/web/service/number/InvoiceServiceNumber.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.NoSuchElementException; @Service public class InvoiceServiceNumber implements IInvoiceService { @@ -14,7 +15,6 @@ public class InvoiceServiceNumber implements IInvoiceService { /** * ATTRIBUTS */ - private static long lastNumber=0L; private IInvoiceRepository invoiceRepository; /** @@ -30,34 +30,30 @@ public InvoiceServiceNumber(IInvoiceRepository invoiceRepository){ */ public Invoice create(Invoice invoice){ System.out.println(" ----- InvoiceServiceNumber/create ----- "); + System.out.println(" ----- invoice.getNumber : " + invoice.getNumber()); + System.out.println(" ----- invoice.getNumber : " + invoice.getCustomerName()); + System.out.println(" ----- invoice.getOrderNumber : " + invoice.getOrderNumber()); - invoice.setNumber(String.valueOf(++this.lastNumber)); - return invoiceRepository.create(invoice); + return invoiceRepository.save(invoice); } @Override - public List getListInvoice(){ + public Iterable getListInvoice(){ System.out.println(" ----- InvoiceServiceNumber/getListInvoice ----- "); - return invoiceRepository.getListInvoice(); + return invoiceRepository.findAll(); } @Override public Invoice getInvoiceByNumber(String number){ System.out.println(" ----- InvoiceServiceNumber/getInvoiceByNumber ----- "); - return invoiceRepository.getInvoiceByNumber(number); + return invoiceRepository.findById(number).orElseThrow( + () -> new NoSuchElementException("Invoice with number " + number + " not found") + ); } /** * GETTERS/SETTERS */ - public static long getLastNumber() { - return lastNumber; - } - - public static void setLastNumber(long lastNumber) { - InvoiceServiceNumber.lastNumber = lastNumber; - } - public IInvoiceRepository getInvoiceRepository() { return invoiceRepository; } diff --git a/src/main/java/com/mycompany/invoice/web/service/prefix/InvoiceServicePrefix.java b/src/main/java/com/mycompany/invoice/web/service/prefix/InvoiceServicePrefix.java index 937b0f1..94f627c 100644 --- a/src/main/java/com/mycompany/invoice/web/service/prefix/InvoiceServicePrefix.java +++ b/src/main/java/com/mycompany/invoice/web/service/prefix/InvoiceServicePrefix.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.NoSuchElementException; //@Service public class InvoiceServicePrefix implements IInvoiceService { @@ -37,16 +38,20 @@ public InvoiceServicePrefix(IInvoiceRepository invoiceRepository){ @Override public Invoice create(Invoice invoice){ invoice.setNumber(String.valueOf(prefix + ++this.lastNumber)); - return invoiceRepository.create(invoice); + return invoiceRepository.save(invoice); } @Override - public List getListInvoice(){ - return invoiceRepository.getListInvoice(); + public Iterable getListInvoice(){ + return invoiceRepository.findAll(); } @Override - public Invoice getInvoiceByNumber(String number){return invoiceRepository.getInvoiceByNumber(number);} + public Invoice getInvoiceByNumber(String number){ + return invoiceRepository.findById(number).orElseThrow( + () -> new NoSuchElementException("Invoice with number " + number + " not found") + ); + } /** diff --git a/src/main/java/com/mycompany/invoice/web/service/prefixinv/InvoiceServicePrefixINV.java b/src/main/java/com/mycompany/invoice/web/service/prefixinv/InvoiceServicePrefixINV.java index 41dacd8..d5450c2 100644 --- a/src/main/java/com/mycompany/invoice/web/service/prefixinv/InvoiceServicePrefixINV.java +++ b/src/main/java/com/mycompany/invoice/web/service/prefixinv/InvoiceServicePrefixINV.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import java.util.List; +import java.util.NoSuchElementException; //@Service public class InvoiceServicePrefixINV implements IInvoiceService { @@ -30,16 +31,20 @@ public InvoiceServicePrefixINV(IInvoiceRepository invoiceRepository){ @Override public Invoice create(Invoice invoice){ invoice.setNumber(String.valueOf("INV_" + ++this.lastNumber)); - return invoiceRepository.create(invoice); + return invoiceRepository.save(invoice); } @Override - public List getListInvoice(){ - return invoiceRepository.getListInvoice(); + public Iterable getListInvoice(){ + return invoiceRepository.findAll(); } @Override - public Invoice getInvoiceByNumber(String number){return invoiceRepository.getInvoiceByNumber(number);} + public Invoice getInvoiceByNumber(String number){ + return invoiceRepository.findById(number).orElseThrow( + () -> new NoSuchElementException("Invoice with number " + number + " not found") + ); + } /** * GETTERS/SETTERS