Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / INSERT в JAVA(работа с БД SQL) / 25 сообщений из 25, страница 1 из 1
05.02.2019, 10:20
    #39769525
nastyaa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT в JAVA(работа с БД SQL)
Всем привет я создала школьный журнал, и он читает данные из БД(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
05.02.2019, 11:41
    #39769565
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT в JAVA(работа с БД SQL)
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
05.02.2019, 11:45
    #39769567
SQL2008
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT в JAVA(работа с БД SQL)
И еще нелишне напомнить, что

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

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

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

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

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

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

IMHO & AFAIK

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

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

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

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

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

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

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


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

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

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

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

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

AFAIK

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

Код: 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
07.02.2019, 01:11
    #39770459
Maxifly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT в JAVA(работа с БД SQL)
Leonid Kudryavtsev,

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

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

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

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

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


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

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


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


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


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