С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/50: Рейтинг темы: голосов - 50, средняя оценка - 4.82
75 / 36 / 1
Регистрация: 03.08.2012
Сообщений: 447

Как сделать связь между таблицами в базе данных MySQL Java

03.07.2013, 11:40. Показов 10133. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно начал изучать базы данных в джаве. Изучаю MySql

Все первоначальные установки и загрузки делал вот по этим ссылкам:
http://javatalks.ru/topics/7147
http://books.zkoss.org/wiki/Se... in_Eclipse

Учусь в эклипсе.

На данный момент получилось сделать создание бд, удаление бд. Подключение к бд. Создание таблиц. Заполнение таблиц и вывод на консоль содержимого. Сейчас хочу разобраться как же мне сделать связь между несколькими таблицами. В MySql MS сделал пример моей базы данных, чтобы наглядно увидеть где какая будет связь.

Подскажите, как правильно связать таблицы по моей схеме? получается связь должна быть 1 к 1.


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
package DB;
 
import java.sql.SQLException;
import logic.AddUser;
 
public class DBoperations 
{
        public final static String NAME = "test";
        private DB db;
        
        public DBoperations(String path, String nameDB, String login, String pass) 
        {
            db = new DB(path, nameDB, login, pass);
        }
        
        public void createdb() throws SQLException 
        {
            db.update("CREATE DATABASE " + NAME);
        }
        
        public void usedb() throws SQLException 
        {
            db.update("USE " + NAME);
        }
        
        public void dropdb() throws SQLException 
        {
            db.update("DROP DATABASE " + NAME);
        }
        
        // Обработка результатов выполнения запроса производится методами интерфейса ResultSet
        public  void showTable_clients()
          {     
              db.showResultSet(db.query("select * from booking")); 
          }
        
        
        // Создаем поля
        public  void createTableMembers() throws SQLException
        {       
            db.update("create table clients(client_id integer(5) AUTO_INCREMENT primary key, " +
                    "client_login varchar(30) not null, " +  "client_pass varchar(30) not null, admin_Ne_admin integer(5) not null, block integer(5) not null, " +
                    "unique(client_login)) default charset=utf8;");
        } 
 
        public  void createTableBooks() throws SQLException
        {  
            db.update("create table books(books_id integer(5) AUTO_INCREMENT primary key, " +
                    "name_book varchar(30) not null, " +  "autor_book varchar(30) not null," + "year varchar(30) not null,"+
                    "unique(name_book)) default charset=utf8;");
        }
        
        public  void createTableBooking() throws SQLException
        {  
            db.update("create table booking(booking_id integer(5) AUTO_INCREMENT primary key, " +
                    "name_booking varchar(30) not null, " +  "data_booking varchar(30) not null," + "return_book varchar(30) not null,"+ "ryki_zal integer(5) not null,"+"User integer(5) not null,"+
                    "unique(name_booking)) default charset=utf8;");
        } 
        
        
        // Заполняем таблицы
        public void addAdmin() throws SQLException // Добавляем администратора
        {
            db.update("insert into clients(client_login, client_pass, admin_Ne_admin, block)"+
                       "values ('"+"admin"+"','"+"admin"+"','"+"0"+"','"+"1"+"')");
        }
        
        public void addUser(AddUser addUser) throws SQLException // добавляем обычного пользователя
        {
            //db.update("INSERT INTO Пользователи VALUES("+ addUser.getName() + "','" + addUser.getLogin() + "'," + addUser.getPassword() + "," + addUser.getAdminNeAdmin() + ",'" + addUser.getBlocking() + "')");
            db.update("insert into clients(client_login, client_pass, admin_Ne_admin, block)"+
                       " values('"+addUser.getLogin()+"','"+addUser.getPassword()+"','"+addUser.getAdminNeAdmin()+"','"+addUser.getBlocking()+"')"); 
        }
        
        public DB getDb() 
        {
            return db;
        }
}


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
package DB;
 
import java.sql.*;
 
import com.mysql.jdbc.ResultSetMetaData;
 
public class DB 
{
        private Connection cn;
        private Statement st; //Это поле даст нам возможность обратиться к базе данных с каким-то конкретным запросом.
        private ResultSet rs;
        
         public DB(String path, String nameDB, String login, String pass) 
         {
            try 
            {
                //Class.forName() служит для загрузки класса по его имени. Данный метод выбрасывает исключение, если нужный класс не найдем. 
                Class.forName("com.mysql.jdbc.Driver");
                try 
                {
                    // Для установки соединения с БД
                    cn = DriverManager.getConnection(path + nameDB, login, pass);
                    try 
                    {
                        // Для выполнения запросов применяется объект Statement
                        st = cn.createStatement();
                    } catch (SQLException ex) {
                        System.out.println("Error in Statement " + ex);
                    }
                } catch (SQLException ex) {
                    System.out.println("Error in create Connection " + ex);
                }
            } catch (ClassNotFoundException ex) {
                System.out.println("Error in download Driver " + ex);
            }
        }
 
        public void update(String sql) 
        {
            try 
            {
                /**
                 * Созданные объекты можно использовать для выполнения запроса SQL, передавая его в один из 
                 * методов  executeQuery (String sql) или executeUpdate(String sql).
                 */
                st.executeUpdate(sql);
            } catch (SQLException ex) 
            {
                System.out.println("Error in update " + ex);
            }
        }
        
        public void close() 
        {
            try 
            {
                st.close();
                cn.close();
            } catch (SQLException ex) 
            {
                System.out.println("Error in close " + ex);
            }
        }
        
        public void showResultSet(ResultSet rs) 
        {
            try 
            {
                //получаем метаданные
                ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
                //выводим названия столбцов
                for (int i = 1; i <= rsmd.getColumnCount(); i++) 
                {
                    System.out.print(rsmd.getColumnName(i) + "\t");
                }
                // выводим строки
                while (rs.next()) 
                {
                    System.out.println();
                    for (int i = 1; i <= rsmd.getColumnCount(); i++) 
                    {
                        System.out.print(rs.getString(i) + "\t");
                    }
                }
            } catch (SQLException ex) 
            {
                System.out.println("Error in showResultSet " + ex);
            }
        }
        
        public ResultSet query(String sql) 
        {
            try 
            {
               // Результаты выполнения запроса помещаются в объект ResultSet
                /**
                 * Для добавления, удаления или изменения информации в таблице вместо метода executeQuery() 
                 * запрос помещается в метод executeUpdate().
                 */
               rs = st.executeQuery(sql);
            } catch (SQLException ex) 
            {
                System.out.println("Error in query " + ex);
            }
          return rs;
        }
}
Миниатюры
Как сделать связь между таблицами в базе данных MySQL Java  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.07.2013, 11:40
Ответы с готовыми решениями:

Как правильно создать хитрую связь между таблицами в другой базе данных?
Добрый день всем. Всю ситуацию в целом изобразил на рисунке ниже. Сейчас поясню детали. Итак, есть первая база данных, в ней есть...

MySQL Workbench. Как создать связь между таблицами
Как в MySQL Workbench создать такую же связь между таблицами, как в MS Access? Пикчи прилагаются. P.S. Как здесь вставлять...

Связь между таблицами в базе access Пациенты
Ребята, как то не сложилось у меня осмыслить всю суть рационального распределения данных в таблицах, в частности в связи данных. ...

6
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
03.07.2013, 14:20
Тут подробно расписано:
http://denis.in.ua/foreign-keys-in-mysql.htm

Обратите внимание, что название столбца с внешним ключом совпадает с названием столбца с первичным ключом той таблицы, на которую идет ссылка. Это очень полезно и удобно.
1
75 / 36 / 1
Регистрация: 03.08.2012
Сообщений: 447
04.07.2013, 15:54  [ТС]
Вот, что получилось. Все правильно?

Создаю таблицы, делаю связи. Добавляю содержимое.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public  void createTableMembers() throws SQLException
        {       
            db.update("create table IF NOT EXISTS clients(client_id integer(5) AUTO_INCREMENT primary key, " +
                    "client_login varchar(30) not null, " +  "client_pass varchar(30) not null, admin_Ne_admin integer(5) not null, block integer(5) not null, " +
                    "unique(client_login)) default charset=utf8;");
        } 
 
        public  void createTableBooks() throws SQLException
        {  
            db.update("create table IF NOT EXISTS books(books_id integer(5) AUTO_INCREMENT primary key, " +
                    "name_book varchar(30) not null, " +  "autor_book varchar(30) not null," + "year varchar(30) not null,"+
                    "unique(name_book)) default charset=utf8;");
        }
        
        public  void createTableBooking() throws SQLException
        {  
            db.update("create table IF NOT EXISTS booking(booking_id integer(5) AUTO_INCREMENT primary key, " +
                    "books_id INT not null, " +  "data_booking varchar(30) not null," + "return_book varchar(30) not null,"+ "ryki_zal integer(5) not null,"+"client_id INT not null,"+
                    "FOREIGN KEY (client_id) REFERENCES clients(client_id),"+"FOREIGN KEY (books_id) REFERENCES books(books_id),"+
                    "unique(books_id)) default charset=utf8;");
        }

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
public void addBooking(ToOrder toOrder) throws SQLException // Добавляем администратора
        {
            /* db.update("insert into clients(books_id, data_booking, return_book, ryki_zal, client_id)"+
                       "values ('"+toOrder.getName_book()+"','"+toOrder.getData()+"','"+toOrder.getReturn_data()+"','"+toOrder.getRyki_zal()+"','"+toOrder.getUser()+"')"); */
            db.update("insert into booking(books_id, data_booking, return_book, ryki_zal, client_id)"+
               "values ('"+1+"','"+toOrder.getData()+"','"+toOrder.getReturn_data()+"','"+1+"','"+1+"')");
        }
        
        public void addBook() throws SQLException // Добавляем книги в библиотеку
        {
            db.update("insert into books(name_book, autor_book, year)"+
                       "values ('"+"Java"+"','"+"Shildt"+"','"+"2001"+"')");
            db.update("insert into books(name_book, autor_book, year)"+
                       "values ('"+"C++"+"','"+"Shildt"+"','"+"2008"+"')");
            db.update("insert into books(name_book, autor_book, year)"+
                       "values ('"+"Pascal"+"','"+"NoAutor"+"','"+"1995"+"')");
        }
        
        public void addAdmin() throws SQLException // Добавляем администратора
        {
            db.update("insert into clients(client_login, client_pass, admin_Ne_admin, block)"+
                       "values ('"+"admin"+"','"+"admin"+"','"+"0"+"','"+"1"+"')");
        }
        
        public void addUser(AddUser addUser) throws SQLException // добавляем обычного пользователя
        {
            //db.update("INSERT INTO Пользователи VALUES("+ addUser.getName() + "','" + addUser.getLogin() + "'," + addUser.getPassword() + "," + addUser.getAdminNeAdmin() + ",'" + addUser.getBlocking() + "')");
            db.update("insert into clients(client_login, client_pass, admin_Ne_admin, block)"+
                       " values('"+addUser.getLogin()+"','"+addUser.getPassword()+"','"+addUser.getAdminNeAdmin()+"','"+addUser.getBlocking()+"')"); 
        }
Добавлено через 33 минуты
У меня еще такой вопрос, может кто ответит. Когда я создаю новую запись в таблице Заказ(booking) при заполнении полей нужно указывать так:

1(номер книги в другой таблицы-инт), дата(стринг), дата возврата(стринг), на руки_читЗал(инт), пользователь(зарегистрированный пользователь из таблицы с пользователями - тоже инт)

Но получается так, что при создании нового поля в таблице заказ? надо все инт поля указывать в инт. А в программе хотелось бы писать в поле с книгой - название этой книги, и чтобы программа проверяла, есть ли такая книга в таблице с книгами. И если все же такая есть, то записывала ее id в поле заказа. И точно так же с пользователем. Я ввожу имя пользователя, а программа в заказ вбивает номер его id.
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
05.07.2013, 02:56
kpoxaa, а вам не кажется что вопросы SQL и в частности связей таблиц, находятся слегка за рамками тематики этой ветки форума
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
05.07.2013, 09:34
Цитата Сообщение от kpoxaa Посмотреть сообщение
Но получается так, что при создании нового поля в таблице заказ? надо все инт поля указывать в инт. А в программе хотелось бы писать в поле с книгой - название этой книги, и чтобы программа проверяла, есть ли такая книга в таблице с книгами. И если все же такая есть, то записывала ее id в поле заказа. И точно так же с пользователем. Я ввожу имя пользователя, а программа в заказ вбивает номер его id.
Если имена уникальны - все просто. Делается HashMap, в которой ключом является Title, а значением - Id. Затем, зная название, по этой структуре мы легко находим Id для загрузки.
1
75 / 36 / 1
Регистрация: 03.08.2012
Сообщений: 447
05.07.2013, 09:35  [ТС]
Ну почему же за рамкой, ветка называется java и базы данных. Я пишу на джаве используя базу данных
0
 Аватар для Gibby
154 / 154 / 10
Регистрация: 16.10.2012
Сообщений: 354
Записей в блоге: 1
05.07.2013, 09:36
Цитата Сообщение от kpoxaa Посмотреть сообщение
Ну почему же за рамкой, ветка называется java и базы данных. Я пишу на джаве используя базу данных
А вы вопросы по взаимодействию Java и БД со стороны Java задавайте в этом форуме, а со стороны БД - в форуме MySQL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2013, 09:36
Помогаю со студенческими работами здесь

Связь между таблицами, как сделать что бы было каскадно
Изменение свойств связи при удалении и обновлении не доступны, как сделать что бы было каскадно

Как создать связь между таблицами с обеспечение целостности данных?
1. Как создать связь между таблицами с обеспечение целостности данных? 2. Создать запрос, который выводит ФИО сотрудников с наибольшей...

Не могу создать связь между таблицами MySql
Нужно создать 3 таблицы со связью, но связь не получается. Помогите пожалуйста. Таблица конференций IdКонференция ключ...

Как сделать связь между двумя строками в таблице mysql
Как сделать связь между двумя строками в таблице mysql Существуют две строки в mysql id и chpu в таблице mysite. Как сделать связь...

База данных склада, связь между таблицами
Есть база данных оптового склада. В ней есть три таблицы Поставки, Сделки о продаже, Товар на складе. В каждом есть поле количество, нужно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru