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

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

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

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

14.04.2013, 23:47. Просмотров 18017. Ответов 15
Метки 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;
        }
    }
}
22
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2013, 23:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос JDBC FAQ для начинающих (Java БД):

Java FAQ: для начинающих - Java
Привет всем форумчанам,в этом Java FAQ,е постараюсь собрать все самое нужное о Java) Для начала давайте разберемся,что такое Java?Как...

Ошибка в jdbc+oracle: java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver - Java БД
Вот такой трабл: на Class.forName('oracle.jdbc.driver.OracleDriver'); отвечает java.lang.ClassNotFoundException:...

Подключение драйверов для JDBC динамически - Java БД
Есть такое желание: не зависеть от СУБД и загружать драйверы для работы с каждой динамически. Вопрос: как реализовать и возможно ли...

Нужен JDBC драйвер для DBF - Java БД
Господа! Срочно нужен JDBC драйвер для DBF файлов! Может есть у кого, или ссылку видели?

Ищу драйвер jdbc для dbf - Java БД
у меня есть zyh.sql.dbf.DBFDriver, но он меня не устраивает. какие еще драйверы есть? чтобы без проблем с кодировками и поддержкой...

срочно нужен JDBC драйвер для DBF - Java
Собственно тема! ;( Вот что мне выдал 'мой' драйвер: Failed to register com.hxtt.sql.dbf.DBFDriver as a JDBC driver: Evaluation period...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
AckiyBolt
451 / 397 / 6
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
29.05.2013, 22:11 #2
может быть полезно для связки swing + jdbc:

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

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

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

Цитата Сообщение от mutagen Посмотреть сообщение
return connH2;
- тут и вызывается.
0
TurboDuck
41 / 41 / 11
Регистрация: 23.11.2015
Сообщений: 364
18.08.2016, 12:58 #14
mutagen, спасибо за статью по JDBC!
AckiyBolt, спасибо за открытие глаз на офф сайт Oracle! Скачивая в PDF документы и не подозревал, что у них там такой интерактивный учебник по Java есть! Все подробно и очень доступно!
0
Maxim09
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 414
10.07.2017, 21:27 #15
Нужно ли изучать JDBC перед изучением Android ?
P.s. планировал изучить Java а потом перейти на Android.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2017, 21:27
Привет! Вот еще темы с ответами:

Java FAQ: для тех кто знает (учил) С/С++ - Java
1. Строки сравниваются не при помощи оператора == а при помощи метода equals (&quot;a&quot; == &quot;a&quot;) == true &quot;a&quot;.equals(&quot;a&quot;) == true 2. В...

Где взять бесплатный jdbc драййвер для msaccess? - Java БД
где взять бесплатный jdbc драййвер для msaccess? А то сижу на этом jdbc-odbc мосту.

Где указывать имя хоста в Url'e для jdbc ? - Java БД
java:/MyHost/comp/env/jdbc/MyBase или java:/comp/env/jdbc/MyHost/MyBase не работает ... куды ж его писать ???

PostgreSQL При настройке log4j для jdbc вылетает exception - Java БД
Моя цель - настроить логирование с сохранением в базу данных. Использую log4j. Вот сам аппендер, который у меня получился: &lt;JDBC...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2017, 21:27
Ответ Создать тему
Опции темы

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