Форум программистов, компьютерный форум CyberForum.ru

Java и базы данных

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 117, средняя оценка - 4.66
mutagen
2550 / 2223 / 72
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
#1

JDBC FAQ для начинающих - Java БД

14.04.2013, 23:47. Просмотров 15912. Ответов 13
Метки faq, jdbc (Все метки)

обновил, добавил удаление и батч инсерт, исправил ошибку по mysql драйверу, добавил вывод в JTable,
добавил хранимки
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
package faq.jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Arrays;
import java.util.Properties;
 
/** @author mutagen */
public class JDBCExamples {
 
    public static void main(String[] args) throws Exception {
        /**
         * Код для использования требует наличия в CLASS_PATH библиотек: MYSQL, Oracle, H2, etc... позаботьтесь об этом,
         * также позаботьтесь о работоспособности выбранной вами БД перед тем как соединяться с ней. Всё демо будет
         * происходить на H2, но код для инициализации других БД тоже присутствует
         */
        //Если вы пользуетесь Java 6+ то вызывать loadDriver - не обязательно
        loadDriver("org.h2.Driver");
//        loadDriver("org.hsqldb.jdbcDriver");
//        loadDriver("com.mysql.jdbc.Driver");
//        loadDriver("org.postgresql.Driver");
//        loadDriver("oracle.jdbc.OracleDriver");
 
 
        Connection connH2 = getConnection("jdbc:h2:mem:", createPropsShort("~tst", "luser", "pass"));
//        Connection connHSQL = getConnection("jdbc:hsqldb:", createPropsShort("db_name", "luser", "pass"));
//        Connection connPostgre = getConnection("jdbc:postgresql:", createPropsGeneral("localhost", "5432", "db_name", "luser", "pass"));
//        Connection connMysql = getConnection("jdbc:mysql:", createPropsGeneral("localhost", "3306", "db_name", "luser", "pass"));
//        Connection connOracle = getConnection("jdbc:oracle:thin:", createPropsOracle("localhost", "1521", "XE", "oracle", "oracle"));
 
 
//        создадим таблицу
        String createTable = "create table IF NOT EXISTS TST_TAB (ID INT, NAME VARCHAR(50));";
        Statement stH2 = connH2.createStatement();
        stH2.execute(createTable);
 
 
//        наполним данными
        String[] insert = {"insert into TST_TAB (id, name) values (1, 'abc');",
            "insert into TST_TAB (id, name) values (2, 'abcabc');",
            "insert into TST_TAB (id, name) values (3, 'abcabcabc');"};
        for (String sql : insert) {
            stH2.execute(sql);
        }
        System.out.println();
 
//       выполним простую выборку
        String select = "select * from TST_TAB;";
        ResultSet rs = stH2.executeQuery(select);
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
        System.out.println();
 
//        выполним подготовленный SQL стейтмент
        String sqlPrepared = "select * from TST_TAB where id=?";
        PreparedStatement ps = connH2.prepareStatement(sqlPrepared);
 
        ps.setInt(1, 2);
        rs = ps.executeQuery();
 
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
        System.out.println();
 
//        выполним простое удаление через стейтмент
        String delete = "DELETE FROM TST_TAB WHERE id=1;";
        int deletedRows = stH2.executeUpdate(delete);
        System.out.println("Удалено " + deletedRows + " рядов");
//        посмотрим что там осталось
        select = "select * from TST_TAB;";
        rs = stH2.executeQuery(select);
        System.out.println("осталось:");
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
        System.out.println();
 
//        выполним удаление чере препейред стейтмент
        sqlPrepared = "DELETE FROM TST_TAB WHERE id=?";
        ps = connH2.prepareStatement(sqlPrepared);
 
        ps.setInt(1, 2);
        deletedRows = ps.executeUpdate();
 
        System.out.println("Удалено " + deletedRows + " рядов");
//        посмотрим что там осталось
        select = "select * from TST_TAB;";
        rs = stH2.executeQuery(select);
        System.out.println("осталось:");
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
 
//        а теперь добавим через препаред батч
        sqlPrepared = "insert into TST_TAB (id, name) values (?, ?)";
        ps = connH2.prepareStatement(sqlPrepared);
        for (int i = 0; i < 10; i++) {
            ps.setInt(1, i);
            ps.setString(2, "abc" + i);
            ps.addBatch();
        }
        int [] insertedRows = ps.executeBatch();
 
        System.out.println("Вставлено " + insertedRows.length + " рядов");
//        посмотрим что там осталось
        select = "select * from TST_TAB;";
        rs = stH2.executeQuery(select);
        System.out.println("теперь стало:");
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " " + rs.getString(2));
        }
 
 
    }
 
    /**
     * @param db строка для соединения с базой в формате JDBC
     * @param props параметры для драйвера, такие как пользователь, пароль, порт и тд
     * @return соединение с БД
     * @throws SQLException
     */
    public static Connection getConnection(String db, Properties props) throws SQLException {
        Connection conn = DriverManager.getConnection(db, props);
        System.out.println(conn);
        return conn;
    }
 
//    для разных баз требуются различные параметры
    /**
     * @param host адрес хоста с БД
     * @param port поорт на котором БД прослушивает соединения
     * @param database имя базы
     * @param user пользователь
     * @param password и его пароль
     * @return параметры для соединения с MySQL
     */
    public static Properties createPropsGeneral(String host, String port, String database, String user, String password) {
        Properties props = new Properties();
        props.put("host", host);
        props.put("port", port);
        props.put("database", database);
        props.put("user", user);
        props.put("password", password);
        return props;
    }
 
    /**
     * @param host адрес хоста с БД
     * @param port поорт на котором листенер прослушивает соединение для указанного SID
     * @param sid идентификатор схемы БД
     * @param user пользоватьель
     * @param password и его пароль
     * @return параметры для соединения с Oracle DB
     */
    public static Properties createPropsOracle(String host, String port, String sid, String user, String password) {
        Properties props = new Properties();
        props.put("host", host);
        props.put("port", port);
        props.put("sid", sid);
        props.put("user", user);
        props.put("password", password);
        return props;
    }
 
    /**
     * @param database имя базы
     * @param user пользоватьель
     * @param password и его пароль
     * @return параметры для соединения с PostgreSQL
     */
    public static Properties createPropsShort(String database, String user, String password) {
        Properties props = new Properties();
        props.put("database", database);
        props.put("user", user);
        props.put("password", password);
        return props;
    }
 
    /**
     * Загружает JDBC драйвер по имени. 
     * На самом деле это лишнее для всех современных БД. Вызывать loadDriver - НЕ обязательно
     * @param driverFullName полное имя класса в котором реализован интерфейс вызова Driver для JDBC
     * @return загруженный класс
     * @throws ClassNotFoundException
     */
    public static Class loadDriver(String driverFullName) throws ClassNotFoundException {
        Class c = Class.forName(driverFullName);
        System.out.println(c);
        return c;
    }
}
вывод в простенький GUI
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
package faq.jdbc;
 
import static faq.jdbc.JDBCExamples.createPropsShort;
import static faq.jdbc.JDBCExamples.getConnection;
import static faq.jdbc.JDBCExamples.loadDriver;
import java.awt.BorderLayout;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
 
/** @author mutagen */
public class JDBCTableExample extends JFrame {
 
    static class TableFromDatabase extends JFrame {
 
        public TableFromDatabase(Connection connection) {
 
            Vector columnNames = new Vector();
            Vector data = new Vector();
 
            try {
                //  прочитаем всё из таблицы
                String sql = "Select * from TST_TAB";
                Statement stmt = connection.createStatement();
                ResultSet rs = stmt.executeQuery(sql);
                ResultSetMetaData md = rs.getMetaData();
                int columns = md.getColumnCount();
 
                //  получим имена колонок
                for (int i = 1; i <= columns; i++) {
                    columnNames.addElement(md.getColumnName(i));
                }
 
                //  считаем ряды
                while (rs.next()) {
                    Vector row = new Vector(columns);
                    for (int i = 1; i <= columns; i++) {
                        row.addElement(rs.getObject(i));
                    }
                    data.addElement(row);
                }
                rs.close();
                stmt.close();
                connection.close();
            } catch (Exception e) {
                System.out.println(e);
            }
 
            //  создадим таблицу с данными из БД
            JTable table = new JTable(data, columnNames) {
                public Class getColumnClass(int column) {
                    for (int row = 0; row < getRowCount(); row++) {
                        Object o = getValueAt(row, column);
                        if (o != null) {
                            return o.getClass();
                        }
                    }
                    return Object.class;
                }
            };
 
            JScrollPane scrollPane = new JScrollPane(table);
            getContentPane().add(scrollPane);
            JPanel buttonPanel = new JPanel();
            getContentPane().add(buttonPanel, BorderLayout.SOUTH);
        }
 
    }
 
    public static void main(String[] args) throws Exception {
        Connection con = prepareData();
        TableFromDatabase frame = new TableFromDatabase(con);
        frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
 
//    подготовим таблицу и данные для отображения и вернём соединение с базой
    static Connection prepareData() throws Exception {
        JDBCExamples jDBCExamples = new JDBCExamples();
        Class h2Class = loadDriver("org.h2.Driver");
        Connection connH2 = getConnection("jdbc:h2:mem:", createPropsShort("~tst", "luser", "pass"));
        String createTable = "create table IF NOT EXISTS TST_TAB (ID INT, NAME VARCHAR(50), ADDRESS VARCHAR(100));";
        Statement stH2 = connH2.createStatement();
        stH2.execute(createTable);
        List<String> insert = new ArrayList<String>() {
            {
                for (int i = 0; i <= 30; i++) {
                    add("insert into TST_TAB (id, name, address) values (" + i + ", 'name" + i + "', 'street" + i + "');");
                }
            }
        };
        for (String sql : insert) {
            stH2.execute(sql);
        }
        return connH2;
    }
}
прошу не ругаться что всё в конструкторе ) код не полностью мой, а частично потырен с инета http://www.camick.com/java/source/Ta...mDatabase.java
лень самому всё писать )

пример по вызову хранимых процедур

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
package faq.jdbc;
 
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
 
/** @author mutagen */
public class JDBCCallDBProcedureExample {
 
    public static void main(String[] args) throws Exception {
        Connection conn = createDB();
        createTable(conn);
        fillDB(conn);
        showTableContent(conn);
        createProcedure(conn);
        User u = new User(100, "user_100", "addr_100");
        callProcedure(conn, u);
        showTableContent(conn);
    }
 
//    создадим вызываемую процедуру в БД
    static void createProcedure(Connection conn) throws Exception {
        String sql = "CREATE PROCEDURE new_user(user_id INT, name VARCHAR(50), address VARCHAR(100)) MODIFIES SQL DATA "
                + " INSERT INTO TST_TAB VALUES (user_id, name, address)";
        Statement st = conn.createStatement();
        st.execute(sql);
    }
 
//    вызовем процедуру из БД
    static void callProcedure(Connection conn, User user) throws Exception {
        String sql = "{call new_user(?,?,?)}";
        CallableStatement cst = conn.prepareCall(sql);
        cst.setInt(1, user.getId());
        cst.setString(2, user.getName());
        cst.setString(3, user.getAddress());
        cst.execute();
    }
 
//    создадим тестовую БД в памяти
    static Connection createDB() throws Exception {
        Class.forName("org.hsqldb.jdbcDriver");
        Connection conn = DriverManager.getConnection("jdbc:hsqldb:mem:tstDB", "user", "pass");
        return conn;
    }
 
//    создадим тестовую таблицу
    static void createTable(Connection conn) throws Exception {
        String createTable = "create table IF NOT EXISTS TST_TAB (ID INT, NAME VARCHAR(50), ADDRESS VARCHAR(100));";
        Statement st = conn.createStatement();
        st.execute(createTable);
    }
 
//  наполним БД чем нибудь )
    static void fillDB(Connection conn) throws Exception {
        PreparedStatement pst = conn.prepareStatement("insert into TST_TAB values (?, ?, ?)");
        for (int i = 0; i < 3; i++) {
            pst.setInt(1, i);
            pst.setString(2, "name-" + i);
            pst.setString(3, "address-" + i);
            pst.addBatch();
        }
        pst.executeBatch();
    }
 
//  посмотрим что в таблице
    static void showTableContent(Connection conn) throws Exception {
        String sql = "Select * from TST_TAB";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        while (rs.next()) {
            System.out.println(rs.getInt(1) + " | " + rs.getString(2) + " | " + rs.getString(3));
        }
        System.out.println("");
    }
 
// простенький класс
    static class User {
 
        int id;
        String name;
        String address;
 
        public User(int id, String name, String address) {
            this.id = id;
            this.name = name;
            this.address = address;
        }
 
        public int getId() {
            return id;
        }
 
        public String getName() {
            return name;
        }
 
        public String getAddress() {
            return address;
        }
    }
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AckiyBolt
451 / 397 / 6
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
29.05.2013, 22:11     JDBC FAQ для начинающих #2
может быть полезно для связки swing + jdbc:

Цитата Сообщение от Gibby Посмотреть сообщение
По поводу работы с jTable есть вот такие пара классов. Позволяют прямо из ResultSet-a загузить данные в TableModel. Потом прилепляете ее таблице с помощью JTable.setModel(TableModel); и voila!

А здесь очень много информации по поводу работы с таблицами. Там и про создание собственных моделей и про все на свете. Лично я заглянув понял, что надо бросать читать Хорстманна и плотно приниматься за изучение

И вот тут много полезной информации по теме с работающими примерами.
MaxNevermind
38 / 38 / 3
Регистрация: 21.05.2013
Сообщений: 128
18.08.2013, 11:42     JDBC FAQ для начинающих #3
mutagen, А AutoCloseable не закрывать это нормально или это для простоты?
mutagen
2550 / 2223 / 72
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
18.08.2013, 11:58  [ТС]     JDBC FAQ для начинающих #4
Цитата Сообщение от MaxNevermind Посмотреть сообщение
mutagen, А AutoCloseable не закрывать это нормально или это для простоты?
В моём примере специально нет лапши с закрытием и обработкой эксепшенов, чтобы не отвлекать тоннами кода от основных целей примера.
Вопросы работы с ресурсами находятся за рамками примера.
WoodHead
101 / 100 / 7
Регистрация: 15.01.2011
Сообщений: 460
02.09.2013, 08:23     JDBC FAQ для начинающих #5
mutagen, буду признателен, если добавите в FAQ код для работы с Java DB.
Black_Archer
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 8
08.01.2014, 16:58     JDBC FAQ для начинающих #6
Ребят Сложно все написано. Можно как-нить по легче чуть. Простите за нубство, но пойму сложновато для чайника). Подскажите, что почитать лучше. И вообще, долго освоить все эту тему? Просто у нас выпускники выпускаются с базами, которые делают в эксесе. Я хотел бы с Java что-то придумать. Опыт есть в программирование на Яве есть, но небольшой
mutagen
2550 / 2223 / 72
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
08.01.2014, 17:06  [ТС]     JDBC FAQ для начинающих #7
попробуйте http://citforum.ru/internet/articles/java_db.shtml может будет понятнее
Black_Archer
0 / 0 / 0
Регистрация: 04.12.2013
Сообщений: 8
08.01.2014, 23:23     JDBC FAQ для начинающих #8
Спасибо
iv_roman_vl
0 / 0 / 0
Регистрация: 14.06.2010
Сообщений: 62
11.04.2014, 14:47     JDBC FAQ для начинающих #9
А можете привести пример копирования данных из одной бд в другую.
Archangel-n
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 12
05.05.2015, 17:20     JDBC FAQ для начинающих #10
Обьяснице плз зеленому джуниору вот к примеру переменная
Java
1
connH2
с строки
Java
1
Connection connH2 = getConnection("jdbc:h2:mem:", createPropsShort("~tst", "luser", "pass"));
она просто создается но негде не обьявляется как это?)
turbanoff
Модератор
3888 / 3623 / 432
Регистрация: 18.05.2010
Сообщений: 9,120
Записей в блоге: 11
Завершенные тесты: 1
05.05.2015, 18:12     JDBC FAQ для начинающих #11
Archangel-n, Она объявляется в этой же строчке, где и создается. Не понял вопроса...
Archangel-n
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 12
11.05.2015, 11:09     JDBC FAQ для начинающих #12
я просто только изучаю коннекты )
то есть она тут создана объявлена и больше негде не вызывается ?
к примеру там создали какой-то интеджер а потом его передаем в работу дальше для выполнения каких-то задачь над ним
а тут просто создается и объявляться? а драйвер после объявления сам подгружается и работает?нет необходимости там делать что-то дополнительного над ним для подключения ? например как переменная.загрузить и тп?
сори за джуниорский вопрос просто только конекты изучаю)
KiraLis39
8 / 9 / 0
Регистрация: 23.07.2014
Сообщений: 329
11.01.2016, 16:55     JDBC FAQ для начинающих #13
Цитата Сообщение от Archangel-n Посмотреть сообщение
Connection connH2 =
- это и есть создание имени connH2 как Connection.

Цитата Сообщение от mutagen Посмотреть сообщение
return connH2;
- тут и вызывается.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2016, 12:58     JDBC FAQ для начинающих
Еще ссылки по теме:

Где я могу скачать бесплатный jdbc 3.х драйвер 4 типа для MSSQLServer(-) Java БД
Java БД Ошибка в jdbc+oracle: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
Java БД Подключение драйверов для JDBC динамически
Java БД jdbc
При настройке log4j для jdbc вылетает exception Java БД PostgreSQL

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

Или воспользуйтесь поиском по форуму:
TurboDuck
39 / 39 / 11
Регистрация: 23.11.2015
Сообщений: 329
18.08.2016, 12:58     JDBC FAQ для начинающих #14
mutagen, спасибо за статью по JDBC!
AckiyBolt, спасибо за открытие глаз на офф сайт Oracle! Скачивая в PDF документы и не подозревал, что у них там такой интерактивный учебник по Java есть! Все подробно и очень доступно!
Yandex
Объявления
18.08.2016, 12:58     JDBC FAQ для начинающих
Ответ Создать тему
Опции темы

Текущее время: 09:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru