Обходной путь setDate для PreparedStatement в Java - PullRequest
0 голосов
/ 05 июня 2019

У меня есть метод с PreparedStatement

    public static boolean TSTHolidayPrepMapper(PreparedStatement st, TSTObject item, MapperType type) throws SQLException
{
    TSTHoliday hol = (TSTHoliday) item;
    int id = 1;
    if (type != MapperType.DELETE)
    {
        st.setString(id++, hol.getCountry());
        st.setString(id++, hol.getCommodity());
        st.setString(id++, hol.getMarketArea());
        st.setString(id++, hol.getMarketPlace());
        st.setString(id++, hol.getName());

        st.setDate(id++, hol.getCalenderDate());
    }
    if (type != MapperType.INSERT)
        st.setInt(id++, hol.getId());

    return true;
}

, который ожидает объект типа Date на st.setDate(id++, hol.getCalenderDate()), но метод getCalenderDate () доставляет объект класса, который я сам создал, с именем TSTLocalDate

public class TSTLocalDate extends TSTObject
{
public int year;
public int month;
public int day;

public TSTLocalDate()
{
    this.year = 1900;
    this.month = 1;
    this.day = 1;
}

public TSTLocalDate(int year, int month, int day)
{
    this.year = year;
    this.month = month;
    this.day = day;
}

public String toString()
{
    String val = "" + year + "-" + TSTStringFormatter.getIntWithLeadingZeros(month, 2) + "-" + TSTStringFormatter.getIntWithLeadingZeros(day, 2);

    return val;
}
}

Я думал о двух разных решениях

  1. Я пытался преобразовать мою TSTLocalDate calenderDate в Date calenderDate, но, похоже, он не работает должным образом с датыметоды классов устарели

    @SuppressWarnings({ "deprecation"})
    public Date tstlocaldateToDate(TSTLocalDate tstlocaldate) throws ParseException {       
    
    Date date = new Date(0);
    
    date.setYear(tstlocaldate.year);
    date.setMonth(tstlocaldate.month);
    date.setDate(tstlocaldate.day);
    
    Log.info(date.getYear());
    return date;
    }
    
  2. Я пытался найти способ объявить собственный тип данных для PreparedStatement, чтобы я мог передать calenderDate как объект TSTLocalDate в PreparedStatement, например st.setTSTLocalDate(id++, hol.getCalenderDate());, но, к сожалению, яне нашел способ, как это сделать.

Я бы предпочел второе решение, но я открыт и для других решений.

1 Ответ

3 голосов
/ 05 июня 2019

... но похоже, что он не работает должным образом, поскольку методы классов Date устарели.

Если вы посмотрите на сообщение об устаревании JavaDoc, скажет вам, что делать :

Запрещены.

Начиная с версии 1.1 JDK, заменено на Calendar.set(Calendar.YEAR, year + 1900).

(мой акцент на втором абзаце)

Таким образом, старый способ был бы:

  • Получите Calendar, используя getInstance или одну из его перегрузок.
  • Используйте методы Calendar для установки правильной даты.
  • Используйте причудливое имя getTime, чтобы получить экземпляр Date на эту дату.
  • Используйте конструктор java.sql.Date, передавая Date '* getTime().
  • Используйте это с PreparedStatement.

Тем не менее, с современным JDK вы, вероятно, захотите пройти через классы java.time, вероятно LocalDate, чтобы выполнить преобразование вместо этого, так как это немного проще. Тогда вы будете использовать java.sql.Date.valueOf(LocalDate):

ps.setDate(java.sql.Date.valueOf(LocalDate.of(
    tstlocaldate.year,
    tstlocaldate.month,
    tstlocaldate.dayOfMonth
));
...