Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 INSERT в JAVA(работа с БД SQL)  [new]
nastyaa
Member

Откуда:
Сообщений: 376
Всем привет я создала школьный журнал, и он читает данные из БД(SQL). Как теперь я могу добавить ученика в БД через JAVA (INSERT)
Можете помочь написать INSERT
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package school.database;

import java.sql.*;
import java.util.ArrayList;


public class DatabaseDAO {

    private static final String URL = "jdbc:mysql://localhost:3306/school_db?useTimezone=true&serverTimezone=GMT";
    private static final String USER = "root";
    private static final String PASSWORD = "123456";

    private static final String GET_ALL_CLASSES_QUERY = "SELECT id, name FROM class ORDER BY name";

    private static final String GET_STUDENTS_IN_CLASS_QUERY =
            "SELECT s.id, s.name, s.surname, s.birthday, s.phone\n" +
            "FROM student s JOIN class_student_connection csc\n" +
            "ON csc.student_id = s.id\n" +
            "JOIN class c\n" +
            "ON csc.class_id = c.id\n" +
            "WHERE c.id = ?";

    private static final String GET_STUDENT_GRADES_QUERY =
            "SELECT s.name, gv.values, g.grade_date\n" +
            "FROM grade g JOIN subject s\n" +
            "ON g.subject_id = s.id\n" +
            "JOIN student st\n" +
            "ON g.student_id = st.id\n" +
            "JOIN grade_value gv\n" +
            "ON g.mark_id = gv.id\n" +
            "WHERE st.id = ?";


    private Connection conn;

    public DatabaseDAO() {
        try {
            conn = DriverManager.getConnection(URL, USER, PASSWORD);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    public ArrayList<SchoolClass> readAllClassesFromDB() {
        ArrayList<SchoolClass> result = new ArrayList<>();

        try (PreparedStatement stmt = conn.prepareStatement(GET_ALL_CLASSES_QUERY)) {
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                SchoolClass schoolClass = new SchoolClass(id, name);
                result.add(schoolClass);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return result;
    }

    public ArrayList<Student> readStudentsInClassFromDB(int classID) {
        ArrayList<Student> result = new ArrayList<>();

        try (PreparedStatement stmt = conn.prepareStatement(GET_STUDENTS_IN_CLASS_QUERY)) {
            stmt.setInt(1, classID);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                int studentID = rs.getInt("id");
                String firstName = rs.getString("name");
                String lastName = rs.getString("surname");
                Date birthday = rs.getDate("birthday");
                Student student = new Student(studentID, firstName, lastName, "PATRON", birthday);
                result.add(student);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return result;
    }

    public ArrayList<Grade> readGradesFromDB(int studentID) {
        ArrayList<Grade> result = new ArrayList<>();
        
        try (PreparedStatement stmt = conn.prepareStatement(GET_STUDENT_GRADES_QUERY)) {
            stmt.setInt(1, studentID);
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                String subject = rs.getString("name");
                int value = rs.getInt("values");
                java.util.Date date = rs.getDate("grade_date");
                Grade grade = new Grade(subject, value, date.toString());
                result.add(grade);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        
        return result;
    }
}
5 фев 19, 10:20    [21801749]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
SQL2008
Member

Откуда:
Сообщений: 3724
nastyaa, как-то так

private static final String PUT_STUDENT_IN_CLASS_QUERY = "INSERT INTO class (name,surname,birthdate,phone) VALUES (?,?,?,?);"

    public boolean writeStudentsToClassFromDB(Student student) {
	boolean result = false;
	PreparedStatement stmt = conn.prepareStatement(PUT_STUDENT_IN_CLASS_QUERY);
        try {
            stmt.setString(1, student.getName());
            stmt.setString(2, student.getSurname());
            stmt.setDate(3, student.getBirthdate());
            stmt.setString(4, student.getPhone());


            if(stmt.executeUpdate() == 1){
		// все хорошо!
		result = true;
            } 

        } catch (SQLException e) {
            throw new RuntimeException(e);
        }

        return result;
    }
5 фев 19, 11:41    [21801808]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
SQL2008
Member

Откуда:
Сообщений: 3724
И еще нелишне напомнить, что

1. Таблица class должна иметь поле id со свойством автоинкремент.
2. Объект student должен быть заполнен данными перед сохранением.
3. Если необходимо, то таблицы grade, grade_value должны заполняться аналогичным способом.
5 фев 19, 11:45    [21801810]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
nastyaa
Member

Откуда:
Сообщений: 376
SQL2008,

можете отправить свой gmail
5 фев 19, 11:59    [21801822]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
nastyaa
Member

Откуда:
Сообщений: 376
nastyaa,

Хочу вам показать свой проект
5 фев 19, 12:04    [21801827]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
SQL2008
nastyaa, как-то так

делать не надо.

А кто stmt закрывать будет?

stmt.close() в finally или try with resource (как в примере nastyaa)

IMHO & AFAIK

p.s. как всегда. Фотки нет, тема сисек не раскрыта (((
5 фев 19, 12:51    [21801867]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
nastyaa, все это фигня. Давай лучше на следующей недели пива выпьем. Ориентировочно вторник/среда/четверг
+

Наконец билеты на Победу подешевели (плюс есть прямые рейсы), т.ч. или ты в СПб или я в Ростов. К сожалению, бар в Ростове. где я раньше пил пиво (Ершь) закрылся ((( Т.ч. даже и не знаю, что в Ростове делать и где пить пива (Есенен - раньше не было пива, которое я люблю, Голодранец - отстой, за безумные деньги не соотвествующие названию, кроме Буковского ничего в голову и не приходит) (((

В СПб можно или в Твин-Пикс (м.Востание, Лиговский пр.) или в Рок-Паб пойти.

p.s. зарплата в понедельник, до этого времени нужно определится где пить пива
p.p,s. прошлой зарплаты закончилась за один день ))) т.ч. определять нужно до того, как я ее получу
5 фев 19, 13:46    [21801920]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
SQL2008
Member

Откуда:
Сообщений: 3724
Leonid Kudryavtsev
SQL2008
nastyaa, как-то так

делать не надо.

А кто stmt закрывать будет?

stmt.close() в finally или try with resource (как в примере nastyaa)


Наверно имелось в виду не stmt, а conn?
И потом не факт, что соединение обслуживает каждый отдельный запрос, а не все приложение в целом.
Каждый раз открывать соединение, на мой взгляд, как-то накладно (в смысле по времени).
Нет?
6 фев 19, 10:23    [21802421]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
SQL2008
Member

Откуда:
Сообщений: 3724
nastyaa
SQL2008,

можете отправить свой gmail

Извини!
Нет времени, могу только подсказать направление или что-то по мелочи.
6 фев 19, 10:26    [21802427]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
SQL2008

По хорошему закрывать нужно все.
И resultset, и statement, и conn.

Иначе можем получить resource leak.

AFAIK
6 фев 19, 15:08    [21802757]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5055
Leonid Kudryavtsev
SQL2008

По хорошему закрывать нужно все.
И resultset, и statement, и conn.

Иначе можем получить resource leak.

AFAIK


по-хорошему, настю надо на форум - Работа.
6 фев 19, 15:11    [21802759]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
+

    private static final String PUT_STUDENT_IN_CLASS_QUERY = "INSERT INTO class (name,surname,birthdate,phone) VALUES (?,?,?,?);"

    public boolean writeStudentsToClassFromDB(Student student) {
	boolean result = false;
        try ( PreparedStatement stmt = conn.prepareStatement(PUT_STUDENT_IN_CLASS_QUERY) ) {
            stmt.setString(1, student.getName());
            stmt.setString(2, student.getSurname());
            stmt.setDate(3, student.getBirthdate());
            stmt.setString(4, student.getPhone());

            if(stmt.executeUpdate() == 1){
		// все хорошо!
		result = true;
            } 
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return result;
    }


6 фев 19, 15:18    [21802767]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Maxifly
Member

Откуда:
Сообщений: 521
Leonid Kudryavtsev,

по идее, коннекцию должен закрыть тот, кто ее открыл.
В приведенном примере коннекция открывается в момент создания класса. Значит после выполнения запроса ее не надо закрывать.
7 фев 19, 01:11    [21803150]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
Maxifly
Leonid Kudryavtsev,

по идее, коннекцию должен закрыть тот, кто ее открыл.
В приведенном примере коннекция открывается в момент создания класса. Значит после выполнения запроса ее не надо закрывать.


Причем тут коннекция ?
Я про Statement. Statement создается, но не закрывается !
7 фев 19, 02:00    [21803160]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#close()

p.s. Надеяться, что при закрытии коннекции статменты и ресалтсеты сами закроются - очень наивно. Т.к. в случае пула соединений, коннекция может жить часами, если не сутками. И кроме ресурс лиака в Java, вполне можно словить и тоо мани опен курсор (Oracle).
7 фев 19, 02:07    [21803162]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 15471
Leonid Kudryavtsev
в случае пула соединений, коннекция может жить часами, если не сутками

да, но открытый коннект по завершению действия лучше вернуть в пул.
        try (Connection con = dataSource.getConnection();
             CallableStatement proc = con.prepareStatement(PUT_STUDENT_IN_CLASS_QUERY);) {
            stmt.setString(1, student.getName());
            stmt.setString(2, student.getSurname());
            stmt.setDate(3, student.getBirthdate());
            stmt.setString(4, student.getPhone());

            if(stmt.executeUpdate() == 1){
		// все хорошо!
		result = true;
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
7 фев 19, 10:20    [21803265]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
Да при чем тут Connection!!!!

Statement закрывать уже не нужно? Варианты ответа два:
1) нет, не нужно, Java сейчас шубко умная (желательно ссылку на то, где такое написано)
2) Statement'ы (и ResultSet'ы) нужно закрывать
7 фев 19, 13:13    [21803446]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5055
Leonid Kudryavtsev
Да при чем тут Connection!!!!

Statement закрывать уже не нужно? Варианты ответа два:
1) нет, не нужно, Java сейчас шубко умная (желательно ссылку на то, где такое написано)
2) Statement'ы (и ResultSet'ы) нужно закрывать


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

https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

The following statement specifies that the cursor of the ResultSet object generated from the getPrice query is closed when the commit method is called. Note that if your DBMs does not support ResultSet.CLOSE_CURSORS_AT_COMMIT, then this constant is ignored
7 фев 19, 13:35    [21803471]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 15471
Leonid Kudryavtsev
1) нет, не нужно, Java сейчас шубко умная (желательно ссылку на то, где такое написано)
try-with-resources
7 фев 19, 14:13    [21803510]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Basil A. Sidorov
Member

Откуда:
Сообщений: 9080
вадя
try-with-resources
Это не способ "обойтись без вызова close()", а способ "автоматически вызвать close()".
7 фев 19, 14:19    [21803516]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 15471
Basil A. Sidorov
Это не способ "обойтись без вызова close()", а способ "автоматически вызвать close()".
дак это
автор
нет, не нужно, Java сейчас шубко умная

говорит о том, что не нужно писать в коде close, java умная
7 фев 19, 14:26    [21803524]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
Озверин
...то резалтсет....

Я конкретно по Statement'ам, а Вы то коннекции, то резалтсет...
Причем коннекции и резалтсеты если Statement банально забыли закрыть? !!!

+

С ResultSet'ами конечно все проще. т.к. если Statement'ы корректно закрываются, то resource leak на ResultSet'ах __наверное__ не будет. Но на мой взгляд, лучше перебдеть и лишний раз вызвать close() (как требует спецификация интерфейса), чем потом 100500 часов искать resource leak в продакшине.
7 фев 19, 14:33    [21803537]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 313
Leonid Kudryavtsev
nastyaa, все это фигня. Давай лучше на следующей недели пива выпьем. Ориентировочно вторник/среда/четверг

Леонид, "это" не лечится. "Она" таскает по очереди задачу разным "помощникам" типа "сделала кусок" - помогите доделать. Я же тебе писал - ты тут растишь будущего беспощадного эксплуататора.
PS Лёня, у меня к тебе один закономерный вопрос
+
Лёня, ты "извращенец"? В смысле как модельер в фильме "Оттепель". Ибо личность сабжа неоднократно тут уже выявлялась.
7 фев 19, 14:38    [21803547]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7525
Пылинка
...тут растишь будущего беспощадного эксплуататора....

Не волнуйся, хуже уже не будет.
"Что выросло, то выросло" ( C )
7 фев 19, 14:52    [21803561]     Ответить | Цитировать Сообщить модератору
 Re: INSERT в JAVA(работа с БД SQL)  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 5055
Leonid Kudryavtsev
Озверин
...то резалтсет....

Я конкретно по Statement'ам, а Вы то коннекции, то резалтсет...
Причем коннекции и резалтсеты если Statement банально забыли закрыть? !!!

+

С ResultSet'ами конечно все проще. т.к. если Statement'ы корректно закрываются, то resource leak на ResultSet'ах __наверное__ не будет. Но на мой взгляд, лучше перебдеть и лишний раз вызвать close() (как требует спецификация интерфейса), чем потом 100500 часов искать resource leak в продакшине.


у вас в скобках был резалтсет - я дал по нему небольшую ремарку.
7 фев 19, 16:09    [21803651]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить