Błąd w trakcie komunikacji z bazą danych.

0

Cześć!

Mam kolejny problem z pewnym kursem Javy (kurs jest z 2012 XD). Kiedy chcę wysłać zapytanie UPDATE do bazy danych MySQL to wywala mi błąd w następującym kodzie:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

abstract public class Query
{
	private static final String JDBC_URL = "jdbc:mysql://localhost/Loty?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC";
	protected String sql;
	protected Connection connection;
	private Statement statement;
	protected ResultSet resultSet;
	
	public Query()
	{
		this("");
	}
	
	
	public void execute()
	{
		execute(new HashMap<String, Object>());
	}
	
	public Query(String sql)
	{
		this.sql = sql;
	}

	public void execute(Map<String, Object> context) 
	{
		try
		{
			connectToDatabase();
			transformSql(context);
			executeSql();
			process(context);
			close();
		} catch (ClassNotFoundException | SQLException e)
		{
			e.printStackTrace();
		}
		
	}
  
	protected void transformSql(Map<String, Object> context){}

	private void close() throws SQLException
	{
		// TODO Auto-generated method stub
		
		resultSet.close();
		statement.close();
		connection.close();
		
	}

	abstract protected void process(Map<String, Object> context) throws SQLException;{}

	private void executeSql() throws SQLException
	{		
		statement = connection.createStatement();
		
		if(sql == null || sql.trim().equals(""))
		{
			return;
		}
		
		resultSet = statement.executeQuery(sql);
	}

	private void connectToDatabase() throws ClassNotFoundException, SQLException
	{		
		Class.forName("com.mysql.cj.jdbc.Driver");
		
		connection = DriverManager.getConnection(JDBC_URL,"root", "");
		
	}
}

package model2;

import java.util.Date;

public class Loty
{

	private long id;
	private String skad;
	private String dokad;
	private Date dataWylotu;
	private int cena;
	private int iloscMiejscBiznes;
	private int iloscMiejscEkonomicznych;
	
	public Loty(long id, String skad, String dokad, Date date, int cena, int iloscMiejscBiznes,
			int iloscMiejscEkonomicznych)
	{
		super();
		this.id = id;
		this.skad = skad;
		this.dokad = dokad;
		this.dataWylotu = date;
		this.cena = cena;
		this.iloscMiejscBiznes = iloscMiejscBiznes;
		this.iloscMiejscEkonomicznych = iloscMiejscEkonomicznych;
	}
	
	@Override
	public String toString()
	{
		return "Loty [id=" + id + ", skad=" + skad + ", dokad=" + dokad + ", dataWylotu=" + dataWylotu + ", cena="
				+ cena + ", iloscMiejscBiznes=" + iloscMiejscBiznes + ", iloscMiejscEkonomicznych="
				+ iloscMiejscEkonomicznych + "]";
	}

	public long getId()
	{
		return id;
	}

	public void setId(long id)
	{
		this.id = id;
	}

	public String getSkad()
	{
		return skad;
	}

	public void setSkad(String skad)
	{
		this.skad = skad;
	}

	public String getDokad()
	{
		return dokad;
	}

	public void setDokad(String dokad)
	{
		this.dokad = dokad;
	}

	public Date getDataWylotu()
	{
		return dataWylotu;
	}

	public void setDataWylotu(Date dataWylotu)
	{
		this.dataWylotu = dataWylotu;
	}

	public int getCena()
	{
		return cena;
	}

	public void setCena(int cena)
	{
		this.cena = cena;
	}

	public int getIloscMiejscBiznes()
	{
		return iloscMiejscBiznes;
	}

	public void setIloscMiejscBiznes(int iloscMiejscBiznes)
	{
		this.iloscMiejscBiznes = iloscMiejscBiznes;
	}

	public int getIloscMiejscEkonomicznych()
	{
		return iloscMiejscEkonomicznych;
	}

	public void setIloscMiejscEkonomicznych(int iloscMiejscEkonomicznych)
	{
		this.iloscMiejscEkonomicznych = iloscMiejscEkonomicznych;
	}
	
}


import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;


import model2.Loty;

public class AktualizujLot extends Query
{

	@Override
	protected void process(Map<String, Object> context) throws SQLException
	{
		
		
		Loty lot = (Loty) context.get("lot");
		
		
		PreparedStatement preparedStatement = connection.prepareStatement("UPDATE lotyKurs SET skad = ?, dokad = ?, dataWylotu = ?, cena = ?" + "WHERE id = ?");
		preparedStatement.setString(1, lot.getSkad());
		preparedStatement.setString(2, lot.getDokad());
		preparedStatement.setDate(3,  (java.sql.Date) new Date(lot.getDataWylotu().getTime()));
		preparedStatement.setInt(4, lot.getCena());
		preparedStatement.setInt(5, (int) lot.getId());
		
		preparedStatement.execute();
	}
	
	public static void main(String[] args) throws ParseException
	{
		AktualizujLot akutualizujLot = new AktualizujLot();
		Map<String, Object> context = new HashMap<String, Object>();
		
		Loty lot = new Loty(1, "Londyn", "Warszawa", new SimpleDateFormat("yyyy-MM-dd").parse("2012-02-01"), 1234, 20, 120);
		
		context.put("lot", lot);
		akutualizujLot.execute(context);
	}
	
}

Błąd jest następujący:

Exception in thread "main" java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date
at AktualizujLot.process(AktualizujLot.java:27)
at Query.execute(Query.java:40)
at AktualizujLot.main(AktualizujLot.java:42)

Próbowałem z metodą która powinna konwertować ale nic nie pomagało, metoda znajduję się poniżej:

	  private static java.sql.Date convertUtilToSql(java.util.Date uDate) {
		  
		          java.sql.Date sDate = new java.sql.Date(uDate.getTime());
		  
		          return sDate;
		  
		      }
0

Sam sobie podciąłeś gałąź na której siedzisz :D

preparedStatement.setDate(3,  (java.sql.Date) new Date(lot.getDataWylotu().getTime()));

Tworzysz nowy obiekt typu java.util.Date i chcesz go zcastować na java.sql.Date. No niestety, nie da rady.

Co możesz zrobić:

  1. Ponieważ java.sql.Date dziedziczy z java.util.Date (https://docs.oracle.com/javase/7/docs/api/java/sql/Date.html), możesz pole modelu zamienić z java.util.Date na java.sql.Date.
  2. Zmienić trochę spojrzenie na daty, pójść z duchem czasu i użyć javy 8 (w sumie to już nie jest aż takie nowe :D ale nowsze niż java.util.Date) i uzyć LocalDate, ewentualnie LocalDateTime - chociaż z tego co pamiętam i tak będzie kilka nowych przeszkód wtedy po drodze... wtedy się przydaje hibernate-java8 zależność jeśli byś używał Hiberneta
0
Pinek napisał(a):

Sam sobie podciąłeś gałąź na której siedzisz :D

preparedStatement.setDate(3,  (java.sql.Date) new Date(lot.getDataWylotu().getTime()));

Tworzysz nowy obiekt typu java.util.Date i chcesz go zcastować na java.sql.Date. No niestety, nie da rady.

Co możesz zrobić:

  1. Ponieważ java.sql.Date dziedziczy z java.util.Date (https://docs.oracle.com/javase/7/docs/api/java/sql/Date.html), możesz pole modelu zamienić z java.util.Date na java.sql.Date.
  2. Zmienić trochę spojrzenie na daty, pójść z duchem czasu i użyć javy 8 (w sumie to już nie jest aż takie nowe :D ale nowsze niż java.util.Date) i uzyć LocalDate, ewentualnie LocalDateTime - chociaż z tego co pamiętam i tak będzie kilka nowych przeszkód wtedy po drodze... wtedy się przydaje hibernate-java8 zależność jeśli byś używał Hiberneta
  1. zmieniałem w klasie Loty na java.sql.Date i dalej wywalało błąd.
  2. zmieniałem na LocalDate/LocalDateTime nic nie pomogło (wtedy to w ogóle zaczęło mi podkreślać na czerwono)
  3. dopiero się uczę Javy i nie znam w ogóle Hibernate, szukam rozwiązania dla początkujących
0

Okej zmieniłeś pole w klasie Loty, ale czy zmieniłeś również tę linijkę?

preparedStatement.setDate(3,  (java.sql.Date) new Date(lot.getDataWylotu().getTime()));
0
Pinek napisał(a):

Okej zmieniłeś pole w klasie Loty, ale czy zmieniłeś również tę linijkę?

preparedStatement.setDate(3,  (java.sql.Date) new Date(lot.getDataWylotu().getTime()));

No aż tak głupi nie jestem żeby tego nie zmienić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1