If you need further information about the topic, follow this link.
Here's how you can make the database schema.
public interface ClienteDAO {
int insertar (ClienteVO cliente);
int eliminar (ClienteVO cliente);
int actualizar (ClienteVO cliente);
Optional<ClienteVO> findById(int idCliente);
Optional<ClienteVO> findByName(String nombre);
Optional<List<ClienteVO>> findAll();
}
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import com.dawes.dao.ClienteDAO;
import com.dawes.modelo.ClienteVO;
public class ClienteDAOImpl implements ClienteDAO {
private Connection con;
private PreparedStatement ps;
private ResultSet rs;
public ClienteDAOImpl(Connection con) {
this.con = con;
}
@Override
public int insertar(ClienteVO cliente) {
try {
ps = con.prepareStatement("INSERT into clientes (nif, nombre, fechaNacimiento, totalVentas) values (?, ?, ?, ?)");
ps.setString(1, cliente.getNif());
ps.setString(2, cliente.getNombre());
ps.setDate(3, Date.valueOf(cliente.getFechaNacimiento()));
ps.setDouble(4, cliente.getTotalVentas());
return ps.executeUpdate();
} catch (SQLException e) {
if(e.getErrorCode()==1062) {
System.out.println("Error al insertar, NIF duplicado ");
}else
System.out.println("Error al insertar en Clientes " + e.getMessage());
return 0;
}
}
// el resto de m�todos est�n sin acabar porque cambi� la tarea
@Override
public int eliminar(ClienteVO cliente) {
try {
ps = con.prepareStatement("delete from clientes where nif =?");
ps.setString(1, cliente.getNif());
return ps.executeUpdate();
} catch (SQLException e) {
System.out.println("Error al eliminar en Clientes " + e.getMessage());
return 2;
}
}
@Override
public int actualizar(ClienteVO cliente) {
try {
ps = con.prepareStatement("UPDATE clientes set nif=?, nombre=?, fechaNacimiento=?, total_ventas=? where idcliente=?");
ps.setString(1, cliente.getNif());
ps.setString(2, cliente.getNombre());
ps.setDate(3, Date.valueOf(cliente.getFechaNacimiento()));
ps.setDouble(4, cliente.getTotalVentas()); // se tienen que actualizar con el importe de cada factura nueva a este cliente
return ps.executeUpdate();
} catch (SQLException e) {
System.out.println("Error al actualizar en Clientes " + e.getMessage());
return 0;
}
}
@Override
public Optional<ClienteVO> findById(int idCliente) {
try {
ps = con.prepareStatement("select * from clientes where idCliente=?");
ps.setInt(1, idCliente);
rs = ps.executeQuery();
if(rs.next() ) {
return Optional.of(new ClienteVO(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getDate(4).toLocalDate(), rs.getDouble(5)));
}else
return Optional.of(new ClienteVO());
} catch (SQLException e) {
System.out.println("Error al consultar Cliente por ID " + e.getMessage());
return Optional.empty();
}
}
@Override
public Optional<ClienteVO> findByName(String nombre) {
try {
ps = con.prepareStatement("select * from clientes where nombre=?");
ps.setString(1, nombre);
rs = ps.executeQuery();
if(rs.next() ) {
return Optional.of(new ClienteVO(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getDate(4).toLocalDate(), rs.getDouble(5)));
}else
return Optional.of(new ClienteVO());
} catch (SQLException e) {
System.out.println("Error al consultar Cliente por nombre" + e.getMessage());
return Optional.empty();
}
}
@Override
public Optional<List<ClienteVO>> findAll() {
List<ClienteVO> clientes = new ArrayList();
try {
ps = con.prepareStatement("select * from clientes");
rs = ps.executeQuery();
while(rs.next() ) {
clientes.add(new ClienteVO(rs.getInt(1), rs.getString(2), rs.getString(3), rs.getDate(4).toLocalDate(), rs.getDouble(5)));
}
return Optional.of(clientes);
} catch (SQLException e) {
System.out.println("Error al consultar todos Clientes " + e.getMessage());
return Optional.empty();
}
}
}
public interface ServicioCliente {
int insertar(ClienteVO cliente);
int eliminar(ClienteVO cliente);
int actualizar(ClienteVO cliente);
Optional<ClienteVO> findById(int idCliente);
Optional<ClienteVO> findByName(String nombre);
Optional<List<ClienteVO>> findAll();
}
public class ServicioClienteImpl implements ServicioCliente {
private MysqlDAOFactory factoria;
private ClienteDAO c;
public ServicioClienteImpl() {
factoria = MysqlDAOFactory.conectar();
c = factoria.getClienteDAOImpl();
}
@Override
public int insertar(ClienteVO cliente) {
return c.insertar(cliente);
}
@Override
public int eliminar(ClienteVO cliente) {
return c.eliminar(cliente);
}
@Override
public int actualizar(ClienteVO cliente) {
return c.actualizar(cliente);
}
@Override
public Optional<ClienteVO> findById(int idCliente) {
return c.findById(idCliente);
}
@Override
public Optional<ClienteVO> findByName(String nombre) {
return c.findByName(nombre);
}
@Override
public Optional<List<ClienteVO>> findAll() {
return c.findAll();
}
}
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import com.dawes.dao.ClienteDAO;
import com.dawes.dao.FacturaDAO;
import com.dawes.daoImpl.ClienteDAOImpl;
import com.dawes.daoImpl.FacturaDAOImpl;
import com.mysql.cj.jdbc.MysqlDataSource;
public class MysqlDAOFactory {
private Properties prop=new Properties();
private MysqlDataSource msd=new MysqlDataSource();
private static MysqlDAOFactory factoria;
private Connection con;
private MysqlDAOFactory() {
try {
// abrimos el fichero properties
FileInputStream fis = new FileInputStream("src/main/resources/conexion.properties");
prop.load(fis);
msd.setUrl(prop.getProperty("url"));
msd.setUser(prop.getProperty("usuario"));
msd.setPassword(prop.getProperty("password"));
// la conexion
con=msd.getConnection();
} catch (FileNotFoundException e) {
System.out.println("Error al abrir el fichero Properties" + e.getMessage());
} catch (IOException e) {
System.out.println("Error al cargar las parejas los datos del fichero properties" + e.getMessage());
} catch (SQLException e) {
System.out.println("Error al realizar la conexion" + e.getMessage());
}
}
public ClienteDAO getClienteDAOImpl() {
return new ClienteDAOImpl(con);
}
public FacturaDAO getFacturaDAOImpl() {
return new FacturaDAOImpl(con);
}
public Connection getCon() {
return con;
}
public static MysqlDAOFactory conectar() {
if (factoria==null)
return new MysqlDAOFactory();
else return factoria;
}
}
class TestServicio {
static ServicioCliente sc = new ServicioClienteImpl();
static ServicioFactura sf = new ServicioFacturaImpl();
// test para comprobar la inserci�n de clientes
@Test
public void test01() {
assertEquals(1,sc.insertar(new ClienteVO("12345678A", "Vanessa", LocalDate.parse("1979-02-01"), 0)));
}
// test para insertar una factura y que actualice el importe del cliente
@Test
public void test02() {
assertEquals(1, sf.insertar(new FacturaVO("01/2021", LocalDate.parse("2021-10-01"), 2000.50, sc.findByName("Laura").get())));
}
// test para conocer todas las ventas realizadas entre 2 fechas
@Test
public void test03() {
assertEquals(4000, sf.ventasEntreFechas(LocalDate.parse("2020-01-01"), LocalDate.now()));
}
}
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dawes</groupId>
<artifactId>02laura_alvarez_PATRONES21</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies<
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.27</version>
</dependency>
</dependencies>
</project>
url=jdbc:mysql://localhost/tarea_facturas
password=temporal
usuario=root