JDBC Tutorial

 
 
 
Сообщения:9474
Содержание

1. Что такое JDBC
2. Типы JDBC-драйверов
3. Где и что скачать
4. Установка соединения
5. Создание БД
6. Создание Таблиц
7. Выполнение SQL-команд
8. PreparedStatement (подготовленные запросы)


PS: Большая часть материала выбрана из книги К. Хорстмана, 2й том.
Изменен:07 мар 2013 07:31
 
 
Сообщения:9474
Что такое JDBC
JDBC(Java DataBase Connectivity) - это интерфейс для организации доступа Java-приложениям к базам данных. Учтите, что JDBC не содержит никаких инструментов для визуальной разработки баз данных.
 
 
Сообщения:9474
Типы JDBC-драйверов
Каждый JDBC-драйвер принадлежит одному из перечисленных ниже типов:
1. Транслирует JDBC в ODBC и для взаимодействия с базой данных использует драйвер ODBC. Компания Sun включила в состав JDK один такой драйвер - мост JDBC/ODBC. Однако для его использования нужно соответствующим образом установить и конфигурировать ODBC-драйвер.
2. Создается преимущественно на языке Java и частично на собственном языке программирования, который используется для взаимодействия с клиентским API базы данных. Для использования такого драйвера нужно помимо библиотеки Java установить специфический для данной платформы код.
3. Создается только на основе библиотеки Java, в которой используется независимый от базы данных протокол взаимодействия сервера и базы. Этот протокол позволяет транслировать запросы в соответствии со спецификой конкретной базы. Если код, зависящий от базы данных, находится только на сервере, доставка программ существенно упрощается.
4. Представляет собой библиотеку Java, которая транслирует JDBC-запросы непосредственно в протокол конкретной базы данных.
Изменен:18 авг 2011 14:49
 
 
Сообщения:9474
Где и что скачать
Для того, чтобы начать работу с БД нам нужно иметь при себе драйвер. В нижеприведенных примерах будет рассматриваться работа с сервером баз данных MySQL. Сам сервер можно взять отсюда: http://dev.mysql.com/downloads. Скачать к нему драйвер можно здесь: http://dev.mysql.com/downloads. В разделе MySQL Connector/J выбираем последнюю версию драйвера. В скачанном архиве есть документация, и, что самое главное, jar-архив mysql-connector-java-5.1.5-bin.jar. Версия, конечно же, может отличаться от вышеуказанной. Им мы и будем пользоваться для доступа к БД. Он должен быть указан в classpath, лежать в каталоге с проектом или добавлен в проект с помощью возможностей IDE(в Еклипсе, например, добавлять библиотеки можно следующим образом: Import->General->Archive File). Все готово, приступаем собственно к написанию кода.

Здесь можете найти ссылки на нужные драйвера разных СУБД.
Изменен:27 авг 2009 20:27
 
 
Сообщения:9474
Установка соединения
Для того, чтоб наш драйвер заработал, его нужно загрузить. Существует несколько способов это сделать, но здесь рассмотрим лишь один. Создадим класс CreatingConnection, в котором увидим что к чему:
package ru.javatalks.faq.db;

/**
 * 14.06.2009 16:08:32
 *
 * @author ctapobep
 */
public class CreatingConnection {

    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Driver loading success!");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

Class.forName() служит для загрузки класса по его имени. Данный метод выбрасывает исключение, если нужный класс не найдем. Метод newInstance() уже вызывать не нужно, как это делают в некоторых примерах, нам хватит просто загрузки класса. Если хотите, можете проверить его наличие в архиве подключенного выше коннектора. Загружать драйвер следует всего один раз на протяжении жизни приложения, но до того, как будет создаваться соединение с БД. Попробуйте запустить пример, если появилось сообщение "Driver loading success!", значит все прошло успешно. Если же на экране появилось java.lang.ClassNotFoundException, проверьте правильно ли вы прописали название класса, если и это не поможет, тогда Вы неверно подключили или не подключили совсем драйвер. Тогда вернитесь к рассмотрению пункта "Где и что скачать" и все перепроверьте.
Давайте теперь попробуем создать соединение к базе данных.
package ru.javatalks.faq.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 14.06.2009 16:08:32
 *
 * @author ctapobep
 */
public class CreatingConnection {

    public static void main(String[] args) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("Driver loading success!");
            //у MySQL обязательно есть системная база,
            //к ней и будем создавать соединение.
            String url = "jdbc:mysql://localhost/mysql";
            String name = "root";
            String password = "";
            try {
                Connection con = DriverManager.getConnection(url, name, password);
                System.out.println("Connected.");
                con.close();
                System.out.println("Disconnected.");
            } catch (SQLException e) {
                e.printStackTrace();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
Прежде, чем запускать програму, поговорим об основных моментах:
- Соединение здесь создается в строке con = DriverManager.getConnection(url, name, password). Класс DriverManager заведует драйверами, соединениями, а также трассировкой. В данном случае мы вызвали статический метод getConnection(). Этот метод просматривает список драйверов и, если находит подходящий к указанному URL, то создает и возвращает соединение. В противном случае выбрасывает исключение с текстом: "No suitable driver found". В качестве аргументов данный метод принимает URL к базе, имя и пароль пользователя. По умолчанию для MySQL имя - root, пароль - пустая строка. Существуют также перегруженные версии этого метода, при желании можете на них взглянуть поближе, но нам они пока не понадобятся.
- URL к базе состоит из протокола:подпротокола://других_сведений. Также может потребоваться установить дополнительные параметры, например, сетевым драйверам нужен номер порта, а драйверам ODBC могут потребоваться различные атрибуты. Вобщем, в JDBC используется синтаксис описания источника данных, подобный обычным URL.
  • протокол - jdbc, указывает, что в данном случае мы используем JDBC;
  • подпротокол - зависит от выбранного нами сервера БД, необходим для определения JDBC драйвера;
  • другие_сведенья - формат представления зависит от используемого протокола, в данном случае это адрес базы данных, т.к. она находится на нашем компьютере в host мы указываем адрес - localhost или 127.0.0.1, и название базы - mysql.
Теперь запустим наш пример. Если в результате вывело:
Quote:
Driver loading success!
Connected.
Disconnected.
то могу Вас поздравить, Вы успешно соединились и разорвали соединение с базой данных. В противном случае перепроверьте URL к БД.
Изменен:12 фев 2013 12:03
 
 
Сообщения:9474
Создание БД
Создадим БД для хранения книг. Называться она будет bookstore
package ru.javatalks.faq.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class CreatingDatabase {
    //Так мы создаем базу данных:
    private final static String createDatabaseQyery =
            "CREATE DATABASE bookstore CHARACTER SET utf8 COLLATE utf8_general_ci";

    public static void main(String[] args) {

        Connection connection = null;
        Statement statement = null;
        try {
            //Загружаем драйвер
            Class.forName("com.mysql.jdbc.Driver");
            //Нужно создать подключение к БД. У MySQL обязательно есть системная база,
            //к ней и будем создавать соединение.
            String url = "jdbc:mysql://localhost/mysql";
            //По умолчанию пользователь - root, пароль - а нет его!
            connection = DriverManager.getConnection(url, "root", "");
            statement = connection.createStatement();
            //Обратите внимание, что создаем базу с помощью executeUpdate(). Об этом мы поговорим немного позже.
            statement.executeUpdate(createDatabaseQyery);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //позакрываем теперь все
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
Источник: Create Database for MySQL
 
 
Сообщения:9474
Создание таблицы
Создадим таблицу books в новоиспеченной базе, которая будет содержать информацию про книги: наименование, автор, цена, комментарий.
package ru.javatalks.faq.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * 14.06.2009 16:25:28
 *
 * @author ctapobep
 */
public class CreatingTable {
    private final static String createTableQuery = "CREATE TABLE `books` (" +
            "  `id` int(11) NOT NULL auto_increment," +
            "  `title` varchar(50) default NULL," +
            "  `comment` varchar(100) default NULL," +
            "  `price` double default NULL," +
            "  `author` varchar(50) default NULL," +
            "  PRIMARY KEY  (`id`)" +
            ") ENGINE=InnoDB DEFAULT CHARSET=utf8;";

    public static void main(String[] args) {
        Connection connection = null;
        Statement statement = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //Подключаемся к новосозданной базе. Значение параметров после "?"
            //ясно из их имен.
            String url = "jdbc:mysql://localhost/bookstore" +
                    "?characterEncoding=utf8";
            connection = DriverManager.getConnection(url, "root", "");
            statement = connection.createStatement();
            statement.executeUpdate(createTableQuery);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //позакрываем теперь все
            if (statement != null) {
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
Изменен:15 июл 2014 17:19
 
 
Сообщения:9474
Выполнение SQL-команд

Для выполнения SQL-команд нужно создать объект Statement. Для этой цели будет использоваться Connection:
Statement st = con.createStatement();
Затем нужно создать строку с требуемой SQL-командой:
String sqlCommand = "select * from books";
Осталось лишь выполнить команду. Выполняется она с помощью методов executeXXX(). С помощью метода executeUpdate() можно выполнять команды типа update, insert, delete, create table, drop table. Для выполнения команды select нужно использовать метод executeQuery(). Существует также универсальный метод execute(), который может применяться для выполнения произвольных SQL-команд, но он используется в основном для интерактивного создания запросов а также если результатов выполнения запросы может быть несколько.
Если вы Вы выполняете запрос, вас, конечно же, интересуют результаты. Метод executeQuery() возвращает объект ResultSet, который можно использовать для построчного просмотра результатов.
ResulSet rs = st.executeQuery("select * from books");
Для анализа набора результатов применяется приведенный ниже цикл:
while(rs.next()){
обработка строки
}
Метод next() вернет false, когда достигнет конца ResultSet.
Ну что, от теории к практике. Следующая программа будет выбирать все строки нашей таблицы и выводить их на консоль:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class BookStore {
	private Connection con;

	public BookStore() {
            String url = "jdbc:mysql://localhost/bookstore?characterEncoding=utf8";
		String name = "root";
		String password = "";
		try {
			con = DriverManager.getConnection(url, name, password);
			System.out.println("Connected.");
			Statement st = con.createStatement();
			String query = "select * from books";
			ResultSet rs = st.executeQuery(query);
			printResults(rs);
			System.out.println("Disconnected.");
			con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void printResults(ResultSet rs) throws SQLException {
		String author, title, comment;
		double price;
		while (rs.next()) {
			author = rs.getString("author");
			title = rs.getString("title");
			comment = rs.getString("comment");
			price = rs.getDouble("price");
			System.out.println("******************************");
			System.out.println("Author: " + author);
			System.out.println("Title: " + title);
			System.out.println("Price: " + price);
			System.out.println("comment: " + comment);
			System.out.println("******************************");
		}
	}

	public static void main(String[] args) {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			System.out.println("Driver loading success!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		BookStore bookStore = new BookStore();
	}
}
Как Вы, наверное, догадались методы getString(), getDouble(), getInt() и т.д. возвращают соответственно строковые, дробные и целочисленные переменные, находящиеся в поле таблицы. Хотелось бы еще заметить, что эти методы могут принимать номер столбца ResultSet в качестве аргумента, причем нумерация начинается с 1! Тогда, например, rs.getInt(1) возвратит значение поля id.
Изменен:15 июл 2014 17:20
 
 
Сообщения:9474
PreparedStatement (подготовленные запросы)

Статья переехала на JavaTalks Articles.
Изменен:18 дек 2012 05:28
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет