powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / INSERT в JAVA(работа с БД SQL)
25 сообщений из 25, страница 1 из 1
INSERT в JAVA(работа с БД SQL)
    #39769525
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет я создала школьный журнал, и он читает данные из БД(SQL). Как теперь я могу добавить ученика в БД через JAVA (INSERT)
Можете помочь написать INSERT
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
/*
 * 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;
    }
}
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769565
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaa, как-то так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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;
    }
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769567
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще нелишне напомнить, что

1. Таблица class должна иметь поле id со свойством автоинкремент.
2. Объект student должен быть заполнен данными перед сохранением.
3. Если необходимо, то таблицы grade, grade_value должны заполняться аналогичным способом.
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769576
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008,

можете отправить свой gmail
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769580
nastyaa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
nastyaa,

Хочу вам показать свой проект
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769606
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008nastyaa, как-то так

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

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

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

IMHO & AFAIK

p.s. как всегда. Фотки нет, тема сисек не раскрыта (((
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769649
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaa, все это фигня. Давай лучше на следующей недели пива выпьем. Ориентировочно вторник/среда/четверг

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

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

p.s. зарплата в понедельник, до этого времени нужно определится где пить пива
p.p,s. прошлой зарплаты закончилась за один день ))) т.ч. определять нужно до того, как я ее получу
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769967
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevSQL2008nastyaa, как-то так

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

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

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


Наверно имелось в виду не stmt, а conn?
И потом не факт, что соединение обслуживает каждый отдельный запрос, а не все приложение в целом.
Каждый раз открывать соединение, на мой взгляд, как-то накладно (в смысле по времени).
Нет?
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39769972
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nastyaaSQL2008,

можете отправить свой gmail
Извини!
Нет времени, могу только подсказать направление или что-то по мелочи.
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770202
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008
По хорошему закрывать нужно все.
И resultset, и statement, и conn.

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

AFAIK
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770203
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevSQL2008
По хорошему закрывать нужно все.
И resultset, и statement, и conn.

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

AFAIK

по-хорошему, настю надо на форум - Работа.
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770208
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
    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;
    }



...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770459
Maxifly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

по идее, коннекцию должен закрыть тот, кто ее открыл.
В приведенном примере коннекция открывается в момент создания класса. Значит после выполнения запроса ее не надо закрывать.
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770469
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaxiflyLeonid Kudryavtsev,

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

Причем тут коннекция ?
Я про Statement. Statement создается, но не закрывается !
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770471
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#close()

p.s. Надеяться, что при закрытии коннекции статменты и ресалтсеты сами закроются - очень наивно. Т.к. в случае пула соединений, коннекция может жить часами, если не сутками. И кроме ресурс лиака в Java, вполне можно словить и тоо мани опен курсор (Oracle).
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770535
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevв случае пула соединений, коннекция может жить часами, если не сутками
да, но открытый коннект по завершению действия лучше вернуть в пул.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
        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();
        }
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770632
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да при чем тут Connection!!!!

Statement закрывать уже не нужно? Варианты ответа два:
1) нет, не нужно, Java сейчас шубко умная (желательно ссылку на то, где такое написано)
2) Statement'ы (и ResultSet'ы) нужно закрывать
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770646
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770672
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev1) нет, не нужно, Java сейчас шубко умная (желательно ссылку на то, где такое написано)try-with-resources
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770676
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадяtry-with-resourcesЭто не способ "обойтись без вызова close()", а способ "автоматически вызвать close()".
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770681
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЭто не способ "обойтись без вызова close()", а способ "автоматически вызвать close()".дак это
автор нет, не нужно, Java сейчас шубко умная
говорит о том, что не нужно писать в коде close, java умная
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770690
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин...то резалтсет....
Я конкретно по Statement'ам, а Вы то коннекции, то резалтсет...
Причем коннекции и резалтсеты если Statement банально забыли закрыть? !!!


С ResultSet'ами конечно все проще. т.к. если Statement'ы корректно закрываются, то resource leak на ResultSet'ах __наверное__ не будет. Но на мой взгляд, лучше перебдеть и лишний раз вызвать close() (как требует спецификация интерфейса), чем потом 100500 часов искать resource leak в продакшине.
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770695
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevnastyaa, все это фигня. Давай лучше на следующей недели пива выпьем. Ориентировочно вторник/среда/четверг

Леонид, "это" не лечится. "Она" таскает по очереди задачу разным "помощникам" типа "сделала кусок" - помогите доделать. Я же тебе писал - ты тут растишь будущего беспощадного эксплуататора.
PS Лёня, у меня к тебе один закономерный вопрос
Лёня, ты "извращенец"? В смысле как модельер в фильме "Оттепель". Ибо личность сабжа неоднократно тут уже выявлялась.
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770702
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинка...тут растишь будущего беспощадного эксплуататора....
Не волнуйся, хуже уже не будет.
"Что выросло, то выросло" ( C )
...
Рейтинг: 0 / 0
INSERT в JAVA(работа с БД SQL)
    #39770737
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevОзверин...то резалтсет....
Я конкретно по Statement'ам, а Вы то коннекции, то резалтсет...
Причем коннекции и резалтсеты если Statement банально забыли закрыть? !!!


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


у вас в скобках был резалтсет - я дал по нему небольшую ремарку.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / INSERT в JAVA(работа с БД SQL)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]