JDBC example from zero to hero!

If you need further information about the topic, follow this link.

Here's how you can make the database schema.

Build the dao with the DAO classes and implementation

      
      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();
		}
	}

}
      
      

Build the service and implementation

      
      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();
	}
	
}

            
      

Build the factory and test

      
      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()));
	}

}



               
      

POM y properties

      
      
      <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