Merge pull request #2 from IUTInfoAix-R202-2022/dao

DAO JPA ajouté + DAO JDBC supprimé
This commit is contained in:
FabreLucas0 2022-06-02 14:33:08 +02:00 committed by GitHub
commit 8b2d37a8cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 362 additions and 299 deletions

View File

@ -31,7 +31,7 @@ public interface DAO<T> {
*
* @param obj Objet à insérer dans la base
*/
T insert(T obj);
boolean insert(T obj);
/**
* Permet de mettre à jour les données d'un tuple dans la base à partir d'un

View File

@ -3,4 +3,6 @@ package fr.univ_amu.iut.dao;
import fr.univ_amu.iut.model.Academie;
public interface DAOAcademie extends DAO<Academie>{
Academie getByCode(String code);
}

View File

@ -1,4 +1,6 @@
package fr.univ_amu.iut.dao;
public interface DAODiscipline extends DAO<DAODiscipline>{
import fr.univ_amu.iut.model.Discipline;
public interface DAODiscipline extends DAO<Discipline>{
}

View File

@ -1,6 +0,0 @@
package fr.univ_amu.iut.dao;
import fr.univ_amu.iut.model.TypeActeur;
public interface DAOTypeActeur extends DAO<TypeActeur>{
}

View File

@ -1,6 +0,0 @@
package fr.univ_amu.iut.dao;
import fr.univ_amu.iut.model.TypeRessource;
public interface DAOTypeRessource extends DAO<TypeRessource> {
}

View File

@ -9,7 +9,5 @@ public interface DAOFactory {
DAORegionAcademique createDAORegionAcademique();
DAORessource createDAORessource();
DAOThematique createDAOThematique();
DAOTypeActeur createDAOTypeActeur();
DAOTypeRessource createDAOTypeRessource();
DAOUsage createDAOUsage();
}

View File

@ -1,13 +1,11 @@
package fr.univ_amu.iut.dao.factory;
import fr.univ_amu.iut.dao.jdbc.DAOFactoryJDBC;
import fr.univ_amu.iut.dao.jpa.DAOFactoryJPA;
public class DAOFactoryProducer {
public static DAOFactory getFactory(DAOType type) {
return switch (type){
case JPA -> new DAOFactoryJPA();
case JDBC -> new DAOFactoryJDBC();
default -> throw new IllegalArgumentException();
};
}

View File

@ -1,6 +1,5 @@
package fr.univ_amu.iut.dao.factory;
public enum DAOType {
JPA,
JDBC
JPA
}

View File

@ -1,51 +0,0 @@
package fr.univ_amu.iut.dao.jdbc;
import fr.univ_amu.iut.dao.*;
import fr.univ_amu.iut.dao.factory.DAOFactory;
public class DAOFactoryJDBC implements DAOFactory {
@Override
public DAOAcademie createDAOAcademie() {
return null;
}
@Override
public DAOActeur createDAOActeur() {
return null;
}
@Override
public DAODiscipline createDAODiscipline() {
return null;
}
@Override
public DAORegionAcademique createDAORegionAcademique() {
return null;
}
@Override
public DAORessource createDAORessource() {
return null;
}
@Override
public DAOThematique createDAOThematique() {
return null;
}
@Override
public DAOTypeActeur createDAOTypeActeur() {
return null;
}
@Override
public DAOTypeRessource createDAOTypeRessource() {
return null;
}
@Override
public DAOUsage createDAOUsage() {
return null;
}
}

View File

@ -1,52 +0,0 @@
package fr.univ_amu.iut.dao.jdbc;
import java.sql.SQLException;
public class DataAccessException extends RuntimeException {
public int errorCode;
public String state;
public DataAccessException() {
}
public DataAccessException(String message) {
super(message);
}
public DataAccessException(String message, Throwable cause) {
super(message, cause);
getCodeAndState(cause);
}
public DataAccessException(Throwable cause) {
super(cause);
}
public DataAccessException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
private void getCodeAndState(Throwable cause) {
if (cause instanceof SQLException) {
errorCode = ((SQLException) cause).getErrorCode();
state = ((SQLException) cause).getSQLState();
} else {
errorCode = -1;
state = cause.getMessage();
}
}
public int getErrorCode() {
return errorCode;
}
public String getState() {
return state;
}
@Override
public String toString() {
return getClass().getName() + '[' + errorCode + ',' + state + "]: " + getLocalizedMessage();
}
}

View File

@ -1,78 +0,0 @@
package fr.univ_amu.iut.dao.jdbc;
import fr.univ_amu.iut.dao.jdbc.rowmappers.RowMapper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Iterator;
public class ResultSetIterator<T> implements Iterator<T> {
private ResultSet rs;
private PreparedStatement ps;
private Connection connection;
private RowMapper<T> rowMapper;
private String sql;
public ResultSetIterator(Connection connection, String sql, RowMapper<T> rowMapper) {
assert connection != null;
assert sql != null;
this.connection = connection;
this.sql = sql;
this.rowMapper = rowMapper;
}
public void init() {
try {
ps = connection.prepareStatement(sql);
rs = ps.executeQuery();
} catch (SQLException e) {
close();
throw new DataAccessException(e);
}
}
@Override
public boolean hasNext() {
if (ps == null) {
init();
}
try {
boolean hasMore = rs.next();
if (!hasMore) {
close();
}
return hasMore;
} catch (SQLException e) {
close();
throw new DataAccessException(e);
}
}
private void close() {
try {
rs.close();
try {
ps.close();
} catch (SQLException e) {
//nothing we can do here
}
} catch (SQLException e) {
//nothing we can do here
}
}
@Override
public T next() {
try {
return rowMapper.mapRow(rs, 1);
} catch (SQLException e) {
close();
throw new DataAccessException(e);
}
}
}

View File

@ -1,18 +0,0 @@
package fr.univ_amu.iut.dao.jdbc;
import fr.univ_amu.iut.dao.jdbc.rowmappers.RowMapper;
import java.sql.Connection;
import java.util.Spliterators;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
public class ResultSetStreamer {
public static <T> Stream<T> stream(final Connection connection,
final String sql,
final RowMapper<T> rowMapper) {
return StreamSupport
.stream(Spliterators.spliteratorUnknownSize(
new ResultSetIterator<>(connection, sql, rowMapper), 0), false);
}
}

View File

@ -1,8 +0,0 @@
package fr.univ_amu.iut.dao.jdbc.rowmappers;
import java.sql.ResultSet;
import java.sql.SQLException;
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}

View File

@ -0,0 +1,34 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAOAcademie;
import fr.univ_amu.iut.model.Academie;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAOAcademieJPA extends DAOBaseClassJPA<Academie> implements DAOAcademie {
public DAOAcademieJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<Academie> findAll() {
TypedQuery<Academie> query = entityManager.createNamedQuery("Academie.findAll", Academie.class);
return query.getResultList();
}
@Override
public Academie getById(int id) {
throw new UnsupportedOperationException("use getByCode()");
}
@Override
public Academie getByCode(String code) {
TypedQuery<Academie> query = entityManager.createNamedQuery("Academie.findByCode", Academie.class);
query.setParameter("acaCode", code);
return query.getSingleResult();
}
}

View File

@ -0,0 +1,29 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAOActeur;
import fr.univ_amu.iut.model.Acteur;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAOActeurJPA extends DAOBaseClassJPA<Acteur> implements DAOActeur {
public DAOActeurJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<Acteur> findAll() {
TypedQuery<Acteur> query = entityManager.createNamedQuery("Acteur.findAll", Acteur.class);
return query.getResultList();
}
@Override
public Acteur getById(int id) {
TypedQuery<Acteur> query = entityManager.createNamedQuery("Acteur.findById", Acteur.class);
query.setParameter("numEt", id);
return query.getSingleResult();
}
}

View File

@ -0,0 +1,55 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAO;
import jakarta.persistence.EntityManager;
// Helper class to reduce code duplication
public abstract class DAOBaseClassJPA<T> implements DAO<T> {
protected EntityManager entityManager;
public DAOBaseClassJPA(EntityManager entityManager) {
this.entityManager = entityManager;
}
public boolean insert(T etudiant) {
try{
entityManager.getTransaction().begin();
entityManager.persist(etudiant);
entityManager.getTransaction().commit();
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
public boolean update(T obj) {
try {
entityManager.getTransaction().begin();
entityManager.merge(obj);
entityManager.getTransaction().commit();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
@Override
public boolean delete(T obj) {
try {
entityManager.getTransaction().begin();
entityManager.remove(obj);
entityManager.getTransaction().commit();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
}

View File

@ -0,0 +1,29 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAODiscipline;
import fr.univ_amu.iut.model.Discipline;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAODisciplineJPA extends DAOBaseClassJPA<Discipline> implements DAODiscipline {
public DAODisciplineJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<Discipline> findAll() {
TypedQuery<Discipline> query = entityManager.createNamedQuery("Discipline.findAll", Discipline.class);
return query.getResultList();
}
@Override
public Discipline getById(int id) {
TypedQuery<Discipline> query = entityManager.createNamedQuery("Discipline.findById", Discipline.class);
query.setParameter("numEt", id);
return query.getSingleResult();
}
}

View File

@ -2,51 +2,55 @@ package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.*;
import fr.univ_amu.iut.dao.factory.DAOFactory;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class DAOFactoryJPA implements DAOFactory {
private EntityManager entityManager;
public EntityManager getEntityManager() {
if(entityManager == null){
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("gestionUsagesPU");
entityManager = entityManagerFactory.createEntityManager();
}
return entityManager;
}
@Override
public DAOAcademie createDAOAcademie() {
return null;
return new DAOAcademieJPA(getEntityManager());
}
@Override
public DAOActeur createDAOActeur() {
return null;
return new DAOActeurJPA(getEntityManager());
}
@Override
public DAODiscipline createDAODiscipline() {
return null;
return new DAODisciplineJPA(getEntityManager());
}
@Override
public DAORegionAcademique createDAORegionAcademique() {
return null;
return new DAORegionAcademiqueJPA(getEntityManager());
}
@Override
public DAORessource createDAORessource() {
return null;
return new DAORessourceJPA(getEntityManager());
}
@Override
public DAOThematique createDAOThematique() {
return null;
return new DAOThematiqueJPA(getEntityManager());
}
@Override
public DAOTypeActeur createDAOTypeActeur() {
return null;
}
@Override
public DAOTypeRessource createDAOTypeRessource() {
return null;
}
@Override
public DAOUsage createDAOUsage() {
return null;
return new DAOUsageJPA(getEntityManager());
}
}

View File

@ -0,0 +1,29 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAORegionAcademique;
import fr.univ_amu.iut.model.RegionAcademique;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAORegionAcademiqueJPA extends DAOBaseClassJPA<RegionAcademique> implements DAORegionAcademique {
public DAORegionAcademiqueJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<RegionAcademique> findAll() {
TypedQuery<RegionAcademique> query = entityManager.createNamedQuery("RegionAcademique.findAll", RegionAcademique.class);
return query.getResultList();
}
@Override
public RegionAcademique getById(int id) {
TypedQuery<RegionAcademique> query = entityManager.createNamedQuery("RegionAcademique.findById", RegionAcademique.class);
query.setParameter("numEt", id);
return query.getSingleResult();
}
}

View File

@ -0,0 +1,29 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAORessource;
import fr.univ_amu.iut.model.Ressource;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAORessourceJPA extends DAOBaseClassJPA<Ressource> implements DAORessource {
public DAORessourceJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<Ressource> findAll() {
TypedQuery<Ressource> query = entityManager.createNamedQuery("Ressource.findAll", Ressource.class);
return query.getResultList();
}
@Override
public Ressource getById(int id) {
TypedQuery<Ressource> query = entityManager.createNamedQuery("Ressource.findById", Ressource.class);
query.setParameter("numEt", id);
return query.getSingleResult();
}
}

View File

@ -0,0 +1,29 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAOThematique;
import fr.univ_amu.iut.model.Thematique;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAOThematiqueJPA extends DAOBaseClassJPA<Thematique> implements DAOThematique {
public DAOThematiqueJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<Thematique> findAll() {
TypedQuery<Thematique> query = entityManager.createNamedQuery("Thematique.findAll", Thematique.class);
return query.getResultList();
}
@Override
public Thematique getById(int id) {
TypedQuery<Thematique> query = entityManager.createNamedQuery("Thematique.findById", Thematique.class);
query.setParameter("numEt", id);
return query.getSingleResult();
}
}

View File

@ -0,0 +1,29 @@
package fr.univ_amu.iut.dao.jpa;
import fr.univ_amu.iut.dao.DAOUsage;
import fr.univ_amu.iut.model.Usage;
import jakarta.persistence.EntityManager;
import jakarta.persistence.TypedQuery;
import java.util.List;
// NOT JPA. No idea how to achieve it else
public class DAOUsageJPA extends DAOBaseClassJPA<Usage> implements DAOUsage {
public DAOUsageJPA(EntityManager entityManager) {
super(entityManager);
}
@Override
public List<Usage> findAll() {
TypedQuery<Usage> query = entityManager.createNamedQuery("Usage.findAll", Usage.class);
return query.getResultList();
}
@Override
public Usage getById(int id) {
TypedQuery<Usage> query = entityManager.createNamedQuery("Usage.findById", Usage.class);
query.setParameter("numEt", id);
return query.getSingleResult();
}
}

View File

@ -4,7 +4,10 @@ import jakarta.persistence.*;
import java.util.Collection;
import java.util.HashMap;
@NamedQueries({
@NamedQuery(name = "Academie.findAll", query = "SELECT p FROM Academie p"),
@NamedQuery(name = "Academie.findByCode", query = "SELECT p FROM Academie p WHERE p.code = :acaCode"),
})
@Entity
public class Academie {
private final static HashMap<String, Academie> INSTANCES = new HashMap<>();

View File

@ -18,12 +18,10 @@ public class Acteur {
@Embedded
Coordonees coordonees;
@ManyToOne(cascade = CascadeType.ALL)
TypeActeur typeActeur;
String typeActeur;
public Acteur() {
coordonees = new Coordonees();
typeActeur = new TypeActeur();
}
public int getId() {
@ -43,7 +41,7 @@ public class Acteur {
}
public String getTypeActeur() {
return typeActeur.nom;
return typeActeur;
}
public void setNom(String nom) {
@ -55,7 +53,7 @@ public class Acteur {
}
public void setTypeActeur(String typeActeur) {
this.typeActeur.setNom(typeActeur);
this.typeActeur = typeActeur;
}
public int getNumero() {

View File

@ -5,8 +5,14 @@ import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Transient;
import java.util.ArrayList;
import java.util.List;
@Entity
public class Discipline {
private static List<Discipline> INSTANCES = new ArrayList<>();
@Transient
public static Discipline Toutes = new Discipline("Toutes disciplines");
@Transient
@ -30,13 +36,29 @@ public class Discipline {
String nom;
public Discipline() {
INSTANCES.add(this);
}
Discipline(String nom) {
this();
this.nom = nom;
}
public static List<Discipline> toutes() {
return INSTANCES;
}
public static Discipline getById(int id){
for(Discipline discipline : Discipline.toutes()) {
if (discipline.id == id) return discipline;
}
return null;
}
public int getId(){
return id;
}
public String getNom() {
return nom;
}

View File

@ -2,8 +2,14 @@ package fr.univ_amu.iut.model;
import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.List;
@Entity
public class RegionAcademique {
private static List<RegionAcademique> INSTANCES = new ArrayList<>();
@Transient
public static RegionAcademique AuvergneRhoneAlpes = new RegionAcademique("Région académique Auvergne-Rhône-Alpes");
@Transient
@ -46,11 +52,23 @@ public class RegionAcademique {
int id;
String nom;
public RegionAcademique() {
INSTANCES.add(this);
}
public RegionAcademique(String nom) {
this();
this.nom = nom;
}
public RegionAcademique() {
public static List<RegionAcademique> toutes(){
return INSTANCES;
}
public static RegionAcademique getById(int id){
for(RegionAcademique regionAcademique : INSTANCES){
if(regionAcademique.id == id)return regionAcademique;
}
return null;
}
public int getId() {

View File

@ -1,17 +1,21 @@
package fr.univ_amu.iut.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.*;
import java.net.URL;
@NamedQueries({
@NamedQuery(name = "Ressource.findAll", query = "SELECT p FROM Ressource p"),
@NamedQuery(name = "Ressource.findById", query = "SELECT p FROM Ressource p WHERE p.id = :id"),
})
@Entity
public class Ressource {
@Id
@GeneratedValue
int id;
String nomRessource;
@ManyToOne
TypeRessource typeRessource;
URL lienRessource;
@ -32,4 +36,8 @@ public class Ressource {
public URL getLienRessource() {
return lienRessource;
}
public String getNomRessource() {
return nomRessource;
}
}

View File

@ -1,29 +0,0 @@
package fr.univ_amu.iut.model;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
@Entity
public class TypeActeur {
@Id
@GeneratedValue
int id;
String nom;
public TypeActeur(String nom) {
this.nom = nom;
}
public TypeActeur() {
}
public String getNom() {
return nom;
}
public void setNom(String nom) {
this.nom = nom;
}
}

View File

@ -3,9 +3,12 @@ package fr.univ_amu.iut.model;
import jakarta.persistence.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@NamedQueries({
@NamedQuery(name = "Usage.findAll", query = "SELECT p FROM Usage p"),
@NamedQuery(name = "Usage.findById", query = "SELECT p FROM Usage p WHERE p.id = :id"),
})
@Entity
public class Usage {
@Id
@ -24,8 +27,8 @@ public class Usage {
@Enumerated(EnumType.STRING)
Niveau niveau;
@OneToMany(cascade = CascadeType.ALL)
List<Academie> academies = new ArrayList<>();
@OneToOne
Academie academie;
@OneToMany(cascade = CascadeType.ALL)
List<Ressource> ressources = new ArrayList<>();
@ -78,15 +81,8 @@ public class Usage {
this.niveau = niveau;
}
public List<Academie> getAcademies() {
return academies;
}
public void addAcademies(Academie ... academies) {
this.academies.addAll(List.of(academies));
}
public void addAcademies(Collection<? extends Academie> academies){
this.academies.addAll(academies);
public Academie getAcademie() {
return academie;
}
public List<Ressource> getRessources() {

View File

@ -7,9 +7,9 @@
<properties>
<!-- database connection properties -->
<property name="jakarta.persistence.jdbc.url" value="jdbc:derby:memory:usageBD;create=true"/>
<property name="jakarta.persistence.jdbc.user" value=""/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/devapp"/>
<property name="jakarta.persistence.jdbc.user" value="root"/>
<property name="jakarta.persistence.jdbc.password" value="azerty123"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>