410013796724260
• Webmoney
R335386147728
Z369087728698
JDBC примерВ примере рассматривается взаимодействие сразу с несколькими СУБД (oracle, ms sql, postgresql, mysql, derby) по подключению к серверу, созданию и удалению схемы (базы данных), созданию и удалению таблицы. При небольшой доработке можно одновременно работать сразу с несколькими разнотипными реляционными СУБД. Пример создан с использованием всех основных принципов ООП (объектно-ориентированное программирование) - инкапсуляция-наследование-полиморфизм. На сайте приводится также пример записи файлов в бинарные (BLOB) и символьные (CLOB/TEXT) поля баз данных Oracle и MySQL, который можно увидеть здесь. Описание примераНа скриншоте представлен JDBC пример в среде разработки Eclipse.
Рассматриваемый JDBC пример включает несколько программных модулей, реализующих принципы ООП :
В директории lib размещаются драйверы JDBC различных провайдеров БД. В примере использовались следующие сервера баз данных : Oracle 10g Express Edition и MySQL 5.1 Дополнительно пример включает СУБД Apache Derby (директория db), которая наряду с драйверами JDBC включена в исходный код примера. СУБД Derby работает в режиме "EmbeddedDriver", т.е. запускается под управлением виртуальной машины JVM вместе с примером. Пример можно использовать для разработки и отладки дополнительных функций. Исходный код примера в виде проекта Eclipse можно скачать здесь. Базовый класс, dao_base.java
/**
* Базовый класс модуля доступа DAO к объектам БД
*/
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
public abstract class dao_base {
protected String driver = null; // драйвер JDBC
protected String url = null; // строка подключения
protected Properties properties = null; // свойства подключения объекта Connection
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public dao_base(String driver) {
this.driver = driver;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Процедура регистрации драйвера JDBC
*/
protected void RegisterDriverManager() {
try {
Class.forName(driver).newInstance();
} catch (InstantiationException e) {e.printStackTrace();
} catch (IllegalAccessException e) {e.printStackTrace();
} catch (ClassNotFoundException e) {e.printStackTrace();}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Процедура определения строки подключения URL к серверу БД
* @param host - имя компьютера
* @param database - наименование БД (может быть пустой строкой)
* @param port - порт сервера
*/
public abstract void setURL (String host, String database, int port);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Функция получения объекта подключения
* @return Connection - объект подключения
*/
public abstract Connection getConnection ();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Процедура регистрации драйвера подключения к серверу СУБД JDBC и определения свойств
* @param login - логин подключения
* @param password - пароль подключения
*/
public void Connect (String login, String password) {
// Регистрация драйвера
RegisterDriverManager();
// Определение свойств подключения Connection
properties = new Properties();
properties.setProperty("password" , password);
properties.setProperty("user" , login );
properties.setProperty("useUnicode" , "true" );
properties.setProperty("characterEncoding", "utf8" );
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Процедура отключения от сервера БД
* @param connection объект подключения
*/
public void Disconnect (Connection connection) {
try {
connection.close();
connection = null;
} catch (SQLException e) {}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Функция создания схемы
* @param schema наименование схемы
* @return результат транзакции
*/
public boolean createSchema(final String schema) {
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Функция удаления схемы
* @param schema наименование схемы
* @return результат транзакции
*/
public boolean dropSchema(final String schema) {
return false;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/**
* Функция выполнения SQL-запроса
* @param sql текст запроса
* @return результат выполнения запроса
*/
public boolean execSQL (final String sql) {
boolean result = false;
try {
if (getConnection() != null) {
Statement statement = getConnection().createStatement();
statement.execute(sql);
statement.close();
statement = null;
result = true;
}
} catch (SQLException e) {
System.err.println ("SQLException : code = " + String.valueOf(e.getErrorCode()) +
" - " + e.getMessage());
System.err.println ("\tSQL : " + sql);
}
return result;
}
}
Базовый класс является абстрактным, включающим два абстрактных метода setURL() и getConnection(). Данные методы, определяющие строку подключения URL к серверу БД и возвращающие объект подключения Connection к серверу СУБД, должны быть реализованы в "наследниках". Метод RegisterDriverManager() подключает соответствующий JDBC драйвер к программе. Строка описания драйвера "driver" определяется в конструкторе. Подробнее о выборе и подключении драйвера JDBC можно познакомиться на странице "Класс DriverManager". Метод Connect() регистрирует драйвер JDBC и определяет свойства подключения. В связи с тем, что синтаксис создания схемы базы данных CREATE SCHEMA (и удаления "DROP SCHEMA") разных СУБД имеет отличия, то в базовом классе определены методы createSchema(final String schema) и dropSchema(final String schema), которые должны быть переопределены в наследующих классах. Метод execSQL(final String sql) используется для выполнения СУБД транзакций. В случае возникновения ошибки транзакции в консоль выводится код и сообщение об ошибке. Модули доступа к СУБДМодули доступа к серверам СУБД наследуют свойства базового класса и реализуют его функции. Исходный код dao_oracle.java
/**
* Модуль доступа к серверу СУБД Oracle
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleConnection;
public class dao_oracle extends dao_base
{
private OracleConnection connection = null;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public dao_oracle() {
super ("oracle.jdbc.OracleDriver");
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void setURL (String host, String service, int port) {
this.url = String.format("jdbc:oracle:thin:@%s:%d:%s", host, port, service);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public Connection getConnection () {
return (java.sql.Connection) connection;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void Connect (String login, String password) {
super.Connect(login, password);
try {
connection = (OracleConnection) DriverManager.getConnection(url, properties);
} catch (SQLException e) {
connection = null;
}
};
}
При создании объекта в родительский конструктор передается описание драйвера. Метод setURL() определяет строку подключения к серверу СУБД. Объект подключения connection создается из родного для драйвера класса - для Oracle это OracleConnection. В связи с тем, что в Oracle схема связана, как правило, с учетной записью пользователя и создается, "можно сказать", при создании пользователя (при создании пользователем первого объекта), то в модуле dao_oracle функции создания и удаления схемы не переопределены. Исходный код dao_mssql.java
/**
* Модуль доступа к серверу СУБД MS SQL Server
*/
import java.sql.SQLException;
import java.sql.DriverManager;
import java.sql.Connection;
import com.microsoft.sqlserver.jdbc.SQLServerConnection;
public class dao_mssql extends dao_base
{
private SQLServerConnection connection = null;
private final String DATABASE_CREATE = "CREATE DATABASE %s ";
private final String DROP_DATABASE = "DROP DATABASE %s" ;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public dao_mssql(){
super ("com.microsoft.sqlserver.jdbc.SQLServerDriver");
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void setURL (String host, String database, int port) {
if (database.length() > 0)
this.url = String.format("jdbc:sqlserver://%s:%d;databaseName=%s;", host, port, database);
else
this.url = String.format("jdbc:sqlserver://%s:%d;", host, port);;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public Connection getConnection (){
return (java.sql.Connection) connection;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void Connect (String login, String password) {
super.Connect (login, password);
try {
connection = (SQLServerConnection) DriverManager.getConnection(this.url, properties);
} catch (SQLException e) {
connection = null;
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean createSchema(final String schema) {
return execSQL (String.format(DATABASE_CREATE, schema));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean dropSchema(final String schema) {
return execSQL (String.format(DROP_DATABASE, schema));
}
}
В конструкторе класса определена строка описания драйвера. Формат строки подключения URL к серверу БД MS SQL представлен в методе setURL(String host, String database, int port). Если наименование базы данных "database" определить, то подключение будет выполнено к непосредственной базе данных, в противном случае к серверу. Исходный код dao_postgres.java
/**
* Модуль доступа к серверу СУБД PostgreSQL
*/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import org.postgresql.PGConnection;
public class dao_postgres extends dao_base
{
private PGConnection connection = null;
private final String SCHEMA_CREATE = "CREATE SCHEMA \"%s\"";
private final String DROP_SCHEMA = "DROP SCHEMA \"%s\"" ;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public dao_postgres() {
super ("org.postgresql.Driver");
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void setURL (String host, String database, int port) {
if (database.length() > 0)
this.url = "jdbc:postgresql://" + host + ":" + port + "/" + database;
else
this.url = "jdbc:postgresql://" + host + ":" + port;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public Connection getConnection () {
return (java.sql.Connection) connection;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void Connect (String login, String password) {
super.Connect(login, password);
try {
connection = (PGConnection) DriverManager.getConnection(url, properties);
} catch (SQLException e) {
connection = null;
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean createSchema(final String schema) {
return execSQL (String.format(SCHEMA_CREATE, schema));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean dropSchema(final String schema) {
return execSQL (String.format(DROP_SCHEMA, schema));
}
}
PostgreSQL в отличие от остальных реляционных СУБД позволяет создавать несколько баз данных "DATABASE", которые являются контейнерами схем "SCHEMA". База данных "postgres" создается по умолчанию. В нашем модуле доступа мы не рассматриваем вопрос создания базы данных, который практически ничем не отличается от создания схемы. По умолчанию мы будем подключаться к БД "postgres", внутри которой будем создавать схему. Исходный код dao_mysql.java
/**
* Модуль доступа к серверу СУБД MySQL
*/
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
public class dao_mysql extends dao_base
{
private com.mysql.jdbc.Connection connection = null;
private final String DATABASE_CREATE = "CREATE DATABASE IF NOT EXISTS %s " +
"CHARACTER SET utf8 " +
"COLLATE utf8_general_ci " ;
private final String DROP_DATABASE = "DROP DATABASE %s" ;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public dao_mysql() {
super ("com.mysql.jdbc.Driver");
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void setURL (String host, String database, int port) {
if (database.length() > 0)
this.url = "jdbc:mysql://" + host + ":" + port + "/" + database;
else
this.url = "jdbc:mysql://" + host + ":" + port;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public Connection getConnection () {
return connection;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void Connect (String login, String password) {
super.Connect(login, password);
try {
connection = (com.mysql.jdbc.Connection) DriverManager.getConnection(url, properties);
} catch (SQLException e) {
connection = null;
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean createSchema(final String schema) {
return execSQL (String.format(DATABASE_CREATE, schema));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean dropSchema(final String schema) {
return execSQL (String.format(DROP_DATABASE, schema));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
}
В СУБД MySQL понятия базы данных "DATABASE" и схемы "SCHEMA" можно сказать являются синонимами. Поэтому в синтаксисе создания базы данных можно использовать как "CREATE DATABASE database_name", так и "CREATE SCHEMA schema_name". Исходный код dao_derby.java
/**
* Модуль доступа к серверу СУБД Apache Derby
*/
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.DriverManager;
public class dao_derby extends dao_base
{
private Connection connection = null;
private final String SCHEMA_CREATE = "CREATE SCHEMA %s";
private final String SCHEMA_DROP = "DROP SCHEMA %s RESTRICT";
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public dao_derby()
{
super ("org.apache.derby.jdbc.EmbeddedDriver");
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void setURL (String host, String database, int port) {
if (database.length() > 0) {
File file = new File(database);
this.url = "jdbc:derby:" + file.getAbsolutePath();
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public Connection getConnection () {
return connection;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void Connect (String login, String password) {
super.Connect(login, password);
try {
connection = (Connection) DriverManager.getConnection(url, properties);
} catch (SQLException e) {
connection = null;
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean createSchema(final String schema) {
return execSQL (String.format(SCHEMA_CREATE, schema));
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public boolean dropSchema(final String schema) {
return execSQL (String.format(SCHEMA_DROP, schema));
}
}
Отличительная особенность СУБД Derby в режиме "EmbeddedDriver" заключается в том, что она работает под управлением виртуальной машины JVM вместе с примером. Для доступа к этой СУБД в "dao_derby" необходимо в строке подключения определить путь к БД. В нашем примере она располагается вместе с приложением. Тестирование JDBC модулей доступа к СУБДДля тестирования модулей доступа к серверам СУБД конечно необходимо использовать JUnit тесты. Но это не так наглядно. Использование JUnit при разработке приложения представлено на странице Тестирование программы, JUnit. В исходные коды примера в качестве образца включен тест подключения к серверу БД Apache Derby. Данная СУБД выбрана в качестве примера, поскольку управляется той же JVM, что и приложение и не требует дополнительной установки сервера СУБД. В модуле тестирования "test_jdbc.java" определим массив параметров подключения к серверу СУБД :
-- Идентификаторы параметров подключения
private final int HOST = 0; // хост (компьютер)
private final int SCHEMA = 1; // схема (база данных)
private final int LOGIN = 2; // логин подключения
private final int PWD = 3; // пароль подключения
private final int DBMS = 4; // СУБД
private final int ACTIVE = 5; // флаг активности
-- Параметры подключения
private String[][] params =
{{"localhost" , "" , "login", "password", "MySQL" , "true"}, // mysql
{"localhost\\SQLEXPRESS", "" , "login", "password", "MS SQL" , "true"}, // mssql
{"127.0.0.1" , "" , "login", "password", "Postgres", "true"}, // postgres
{"localhost" , "XE", "login", "password", "Oracle" , "true"}, // oracle
{"" , "db", "" , "" , "Derby" , "true"}}; // derby
-- Порты серверов СУБД
private final int [] ports = {3306, 1433, 5432, 1521, 0}; // порты СУБД
-- Идентификатор СУБД
private final int idx_mssql = 1;
private final int idx_postgres = 2;
private final int idx_oracle = 3;
private final int idx_derby = 4;
Параметры подключения "params" нужно настроить. Для этого необходимо в первом поле указать HOST сервера СУБД. Для MSSQL неоходимо наряду с хостом указать соответствующий сервис сервера СУБД. Во второй колонке необходимо только подкорректировать SID сервера Oracle. В тестовом примере указывается SID сервера разработчика "XE". Для Derby указан относительный путь к БД. В следующих 2-х колонках необходимо привести соответствующие значения логина и пароля. В последней колонке указывается значение флага активности ACTIVE, который позволяет исключить сервер из тестирования. Данные параметры подключения используются в процедуре подключения createConnecion, которой необходимо передать модуль доступа и идентификатор СУБД :
/**
* Поцедура подключения к серверу БД
* @param dao модуль доступа
* @param idx идентификатор сервера СУБД
*/
private void createConnecion (dao_base dm, final int idx) {
// Формирование строки подключения
dao.setURL(params[idx][HOST], params[idx][SCHEMA], ports[idx]);
// Подключение к серверу
dao.Connect(params[idx][LOGIN], params[idx][PWD]);
}
Дополнительно определяем флаги создания объектов (схемы, таблицы) и текстовые константы, которые используются при выводе сообщений. // Флаги создания схемы и таблицы private boolean schema_created = false; private boolean table_created = false; // Наименование схемы private final String SCHEMA_NAME = "MEDIA" ; // Строковые переменные для вывода сообщений в консоль private final String OBJ_SCHEMA = "Schema 'MEDIA'" ; private final String OBJ_TABLE = "Table 'USERS'" ; private final String OBJ_CREATED = "\t%s created" ; private final String OBJ_DROPED = "\t%s deleted" ; private final String OBJ_NOT_CR = "\t%s not created" ; private final String OBJ_NOT_DEL = "\t%s not created" ; private final String SUCCESS = "%s connection : success"; private final String FAILED = "%s connection : failed" ; SQL-скрипты создания и удаления таблицы :
// Скрипты удаления и создания таблицы пользователей USERS
private final String TABLE_DROP = "DROP TABLE %sUSERS" ;
private final String TABLE_CREATE = "CREATE TABLE %sUSERS( " +
"id INT PRIMARY KEY, " +
"name VARCHAR(128) NOT NULL, " +
"data TIMESTAMP )" ;
В SQL-скриптах присутствуют символы '%s', которые должны быть заменены либо на наименование схемы, либо на пустой символ. Процедура создания схемы и таблицы createObjectsВ процедуре "createObjects" схема создается во всех СУБД за исключением Oracle.
/**
* Процедура создания объектов СУБД
* @param dao модуль доступа к СУБД
* @param idx идентификатор СУБД
*/
private void createObjects(dao_base dao, final int idx)
{
// Создание схемы
if (idx != idx_oracle) {
// Создание схемы
schema_created = dao.createSchema(SCHEMA_NAME);
if (schema_created) {
// Schema created
System.out.println (String.format(OBJ_CREATED, OBJ_SCHEMA));
} else
// Schema not created
System.err.println (String.format(OBJ_NOT_CR, OBJ_SCHEMA));
// Переподключение к вновь созданной схеме
if ((idx != idx_derby) && (idx != idx_postgres)) {
dao.Disconnect(dao.getConnection());
params[idx][SCHEMA] = SCHEMA_NAME;
createConnecion (dao, idx);
}
// Создание таблицы
if (schema_created || (idx == idx_oracle)) {
if (((idx == idx_derby) || (idx == idx_postgres)))
table_created = dao.execSQL(String.format(TABLE_CREATE, "\"" + SCHEMA_NAME + "\"."));
else
table_created = dao.execSQL(String.format(TABLE_CREATE, ""));
if (table_created)
// Table created
System.out.println (String.format(OBJ_CREATED, OBJ_TABLE));
else
// Table not created
System.err.println (String.format(OBJ_NOT_CR, OBJ_TABLE));
}
}
После создания схемы СУБД MySQL и MSSQL выполняем переподключение к вновь созданной схеме для создания таблицы. В СУБД PostgreSQL и Derby создаем таблицу с указанием наименования схемы, т.е. "MEDIA".USERS . Процедура удаления схемы и таблицы dropObjectsПроцедура сначала удаляет таблицу, после чего удаляет схему, если СУБД не Oracle. Для удаления схемы в MS SQL необходимо "отключиться" от схемы, в противном случае будет ошибка с сообщением, что удалить невозможно в связи с имеющимися подключениями.
/**
* Процедура удаления объектов СУБД
* @param dao модуль доступа к СУБД
* @param idx идентификатор СУБД
*/
private void dropObjects(dao_base dao, final int idx)
{
// Удаление таблицы
if (table_created) {
if ((idx != idx_derby) && (idx != idx_postgres)) {
if (dao.execSQL(String.format(TABLE_DROP, "")))
// Table deleted
System.out.println (String.format(OBJ_DROPED, OBJ_TABLE));
else
// Table not deleted
System.err.println (String.format(OBJ_NOT_DEL, OBJ_TABLE));
} else {
if (dao.execSQL(String.format(TABLE_DROP, "\"" + SCHEMA_NAME + "\".")))
// Table deleted
System.out.println (String.format(OBJ_DROPED, OBJ_TABLE));
else
// Table not deleted
System.err.println (String.format(OBJ_NOT_DEL, OBJ_TABLE));
}
}
// Отключение от вновь созданной схемы
if (idx == idx_mssql) {
// Отключение от схемы для удаления
dao.Disconnect(dao.getConnection());
// Очищаем наименование схемы
params[idx][SCHEMA] = "";
// Подключение к СУБД
createConnecion (dao, idx);
}
// Удаление схемы
if (idx != idx_oracle) {
if (dao.dropSchema(SCHEMA_NAME)) {
// Schema deleted
System.out.println (String.format(OBJ_DROPED, OBJ_SCHEMA));
} else
// Schema not deleted
System.err.println (String.format(OBJ_NOT_DEL, OBJ_SCHEMA));
}
}
Исходный код dao_derby.javaВ исходных кодах приведем только описание конструктора "test_jdbc". Все остальные, используемые в примере переменные и методы, представлены выше.
public class test_jdbc
{
. . .
public test_jdbc()
{
// Определение "модуля доступа к СУБД"
dao_base dm = null;
// Цикл перебора параметров подключения к СУБД
for (int i = 0; i < params.length; i++) {
// Проверка флага активности СУБД
if (params[i][ACTIVE].equalsIgnoreCase(String.valueOf(true))) {
// Создание "модуля доступа" к СУБД
switch (i) {
case 0 : dm = new dao_mysql (); break;
case 1 : dm = new dao_mssql (); break;
case 2 : dm = new dao_postgres(); break;
case 3 : dm = new dao_oracle (); break;
case 4 : dm = new dao_derby (); break;
}
}
// Проверка создания dm
if (dm != null) {
// Подключение к серверу БД
createConnecion (dm, i);
// Вывод в консоль информации о подключении
if (dm.getConnection() != null) {
System.out.println (String.format(SUCCESS, params[i][DBMS]));
// Создание схемы и таблицы
createObjects(dm, i);
// Удаление таблицы и схемы
dropObjects(dm, i);
// Отключение от сервера БД
dm.Disconnect(dm.getConnection());
} else
System.err.println (String.format(FAILED, params[i][DBMS]));
}
dm = null;
}
}
public static void main(String[] args) {
new test_jdbc();
System.exit(0);
}
}
В конструкторе в цикле выполняется создание объекта "dao", после чего выполняется подключение к серверу БД, создается схема и таблица во вновь созданной схеме. После этого вновь созданные объекты удаляются и "dao" отключается от сервера СУБД. На следующем скриншоте представлены сообщения данного JDBC примера в консоли Eclipse.
|
