Я посылаю строку типа месяца из JSP в сервлет, затем в дао из сервлета.Как я могу получить год и месяц из этой строки? - PullRequest
0 голосов
/ 10 февраля 2019

Как мне преобразовать строку в формат Year-MMMM в mysql, или мне нужно преобразовать ее в части контроллера?Предположим, 2019-02 сохраняется как 2019-02, но я хочу другой столбец, который преобразует 2019-02 в 2019-февраль.

JSP-часть

<form action="YearMonthController" method="post">

    <input type="hidden" name="command" value="CREATE_YearMonth" />

    Month with year: <input type="month" name="year_month">

    <input type="submit">

</form>

Это контроллерчасть

private void create_a_yearMonth_controller(HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    String _yearMonth = request.getParameter("year_month");

    YM ym = new YM(_yearMonth);

    _ymDAO.create_a_yearMonth_dao(ym);

}

Это часть DAO

public void create_a_yearMonth_dao(YM ym) throws Exception {

    Connection connection = null;
    PreparedStatement prepared_statement = null;

    try {
        connection = data_source.getConnection();

        String sql = "INSERT INTO `years_months`\r\n" + "(yearMonth) \r\n" + "VALUES \r\n" + "(?);";

        prepared_statement = connection.prepareStatement(sql);

        prepared_statement.setString(1, ym.get_yearMonth());

        prepared_statement.execute();
    } finally {
        close(connection, prepared_statement, null);
    }

}

Это таблица

CREATE TABLE `years_months` (
yearMonth VARCHAR(50) NOT NULL,
PRIMARY KEY (yearMonth)
);

1 Ответ

0 голосов
/ 10 февраля 2019

Поскольку MySQL не имеет тип данных год-месяц (по крайней мере, я так думаю), я бы сохранял год и месяц как всегда 2019-02 (поэтому столбец varchar(50) довольно широк для этой цели, char(7) сделал бы).Это формат ISO 8601 и широко признанный.

В Java я бы использовал YearMonth для года и месяца (не нужно придумывать свой собственный класс).И отформатируйте его в соответствии с потребностями презентации.YearMonth.toString создает упомянутый формат ISO 8601, а YearMonth.parse анализирует его, поэтому все хорошо сочетается друг с другом.

public void createAYearMonthDao(YearMonth ym) throws SQLException {
    String sql = "INSERT INTO `years_months` (yearMonth) VALUES (?);";

    try (Connection connection = data_source.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
        preparedStatement.setString(1, ym.toString());
        preparedStatement.execute();
    }
}

Чтобы создать строку типа 2019-February, когда вам это нужно:

    DateTimeFormatter ymFormatter = DateTimeFormatter.ofPattern("uuuu-MMMM", Locale.ENGLISH);

    YearMonth ym = YearMonth.of(2019, Month.FEBRUARY);
    String formattedYm = ym.format(ymFormatter);
    System.out.println(formattedYm);

Вывод:

2019-февраль

YearMonth имеет методы для получения года и месяца отдельно, например:

    System.out.println("Year " + ym.getYear() + " month " + ym.getMonth());

Год 2019 месяц ФЕВРАЛЬ

Альтернативное предложение в комментариях использовать date в MySQL и LocalDate в Java также неплохо.Pro: Вы сохраняете форматирование и анализ при сохранении и извлечении.Con: У вас есть избыточный день месяца в вашей базе данных.

...