- •Доступ до баз даних з Java
- •Завантаження та реєстрація jdbc-драйвера
- •Формування jdbc-url-рядка
- •Отримання екземпляра об’єкта класу Connection
- •Формування sql запиту
- •Виконання і обробка sql-запиту
- •Закриття одержаних з'єднань (ResultSet, Statament, Connection)
- •Попередньо відкомпільовані (підготовлені) запити
- •Пакетное выполнение sql запросов
- •Вызов хранимых процедур и функций
- •Замечание об исключениях
Формування jdbc-url-рядка
У найзагальнішому випадку цей рядок має вигляд:
jdbc:id_бази:параметри
У разі MySql вона має вигляд:
jdbc:mysql://хост/база?user=пользователь
Наприклад:
jdbc:mysql://127.0.0.1/GENERAL?user=root
УВАГА! Необхідний відступ з приводу "особливостей" роботи драйверів mysql. Для підключення необхідна передача login/password в JDBC драйвер, проте JDBC-драйвера MySql які мені зустрічалися, сриймали тільки login прописаний в рядку JDBC-URL і ніякими іншими способами примусити сприйняти драйвер необхідні параметри не вийшло.
Отримання екземпляра об’єкта класу Connection
Для отримання Connection Ви повинні викликати DriverManager.getConnection() і передати у всередину login/password/jdbc-url:
String url="jdbc:mysql://127.0.0.1/GENERAL?user=root";
String user="";
String password="";
Connection c=null;
try{
c=DriverManager.getConnection(url,user,password);
} catch(SQLException e)
{
System.out.println("Exception getting connection: "+e);
}
Формування sql запиту
На даному етапі все просто - Вам необхідно сформувати звичайну SQL команду, наприклад:
String str="select * from Mytable";
String str="insert into Mytable (name,cnt) values ('"+name+"',"+cnt+"')";
Виконання і обробка sql-запиту
Для виконання запиту ми повинні у екземпляра об’єкта класа Connection одержати Statement і викликати один з його методів залежно від типу запиту:
public int executeUpdate(String sql) throws SQLException
Застосовується для SQL команд INSERT, UPDATE або DELETE. Повертає к-ть рядків над якими виконалася операція.
public ResultSet executeQuery(String sql) throws SQLException
Застосовується для SQL команди SELECT. Повертає ResultSet з якого можна витягнути інформація про шапку таблиці (ResultSetMetaData) і самі значення. Як це робиться буде показаний нижче в прикладі.
public boolean execute(String sql) throws SQLException
Даний метод повертає true/false - выполнился/не виконався запит. Застосовується в тих випадках коли SQL запит повертає декілька ResultSet'ів. Для їх отримання використовуйте getMoreResults().
Приклад:
String str="SELECT * FROM RASHOD WHERE USER_ID="+user;
System.out.println(str);
Statement statement = c.createStatement(); // створюємо оператор
ResultSet rs = statement.executeQuery(str); // виконуємо запит
ResultSetMetaData md = rs.getMetaData();
int cnt= md.getColumnCount(); // одержуємо к-ть колонок (1..cnt)
int row=0;
while(rs.next())
{
row++;
System.out.println("Row "+row); // висновок номера рядка в базі
for(int i = 1; i <= cnt; i++)
{ String name=md.getColumnName(i); // получаємо ім'я колонки
String val=rs.getString(i); // одержуємо значення
System.out.println(name+"="+val); // виводимо ім'я і значення поля
}
}
УВАГА! Застосовуйте executeUpdate/executeQuery/execute тоді коли вони доречні - не викликайте executeQuery для INSERT'а !!!
Закриття одержаних з'єднань (ResultSet, Statament, Connection)
У кожного з вказаних об’єктів них є метод
close();
Чому так важливо закривати з'єднання? Ті хто працював з Oracle посміхнуться подібному питанню - mysql дозволяє безболісно плодити незакриті з'єднання (він їх сам прибиває з часом), Oracle навпаки - число Connection у нього обмежено (це обмеження на к-ть клієнтів), тому вичерпавши к-ть Connection'ов Ви можете "повісити" свій додаток. Тому не варто привчатися до гіршого і утрудняти можливу міграцію додатку з MySql на інший SQL-сервер.