SlideShare uma empresa Scribd logo
1 de 28
Лекция 8. «Базы данных»
MySQL Community Server
MySQL Workbench
MySQL Connector: Connector/J
http://dev.mysql.com/downloads/
Java Database Connectivity – API для работы с базами из приложений на Java
Предназначена для работы с реляционными базами данных
Предоставляет методы для получения и обновления данных
Не зависит от конкретного типа базы
Название класса драйвера: com.mysql.jdbc.Driver
(Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()
Создаем объект драйвера при помощи reflection:
java.sql.DriverManager – класс хелпер для работы с драйверами
Регистрируем драйвер:
DriverManager.registerDriver(driver);
Объект отвечает за соединение с базой и ражим работы с ней
Объект представляет выражение обращения к базу
Объект с результатом запроса, который вернула база
Statement createStatement()
CallableStatement prepareCall()
PreparedStatement prepareStatement()
Создание Statement объекта:
Транзакционность:
По-умолчанию auto-commit после выполнения каждого statement-а
void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита
void commit()
void rollback()
Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance();
DriverManager.registerDriver(driver);
StringBuilder url = new StringBuilder();
url.
append("jdbc:mysql://"). //db type
append("localhost:"). //host name
append("3306/"). //port
append("lecture8?"). //db name
append("user=tully&"). //login
append("password=tully"); //password
// URL: “jdbc:mysql://localhost:3306/lecture8?user=tully&password=tully”
Connection connection = DriverManager.getConnection(url.toString());
Поток посылает запрос к базе и ждет ответа
Если в приложении много потоков обращаются к базе
Можно собрать коннекты в connection pool
Если приложение однопоточное или потоков мало
Можно в каждом потоке держать открытый connection
JDBC позволяет создавать и выполнять запросы к базе
Update statements: CREATE, DELETE, INSERT…
Query statements: SELECT
Интерфейсы:
Statement
PreparedStatement
CallableStatement
Query statements возвращают ResultSet
Update statements возвращают число измененных строк
Содержит результат запроса
Доступ к полям текущей строки:
По имени колонки: getBoolean(String name), getLong(String name)…
По индексу колонки: getBoolean(int index), getLong(int index)…
Перемещение по строкам:
next()
previous()
isLast()
Объект, который содержит методы для работы с запросами
execUpdate(Connection connection, String update)
execQuery(Connection connection, String update, ResultHandler handler)
Обработка запроса на создание, вставку, обновление и удаление
Обработка запроса на получение данных
public interface ResultHandler {
void handle(ResultSet result) throws SQLException;
}
public static int execUpdate(Connection connection, String update) {
Statement stmt = connection.createStatement();
stmt.execute(update);
int updated = stmt.getUpdateCount();
stmt.close();
return updated;
}
execUpdate(connection, "create table users (id bigint auto_increment, name varchar(256),
primary key (id))");
execUpdate(connection, "insert into users (name) values ('tully')");
public interface ResultHandler {
void handle(ResultSet result) throws SQLException;
}
private static void execQuery(Connection connection, String query, ResultHandler handler){
Statement stmt = connection.createStatement();
stmt.execute(query);
ResultSet result = stmt.getResultSet();
handler.handle(result);
result.close();
stmt.close();
}
execQuery(connection, "select * from users", new ResultHandler(){
public void handle(ResultSet result) throws SQLException {
result.next();
System.out.append("User: " + result.getString("name") + 'n');
}
});
resultSet.close()
statement.close()
connection.close()
public void execUpdate(Connection connection, String[] updates) {
try {
connection.setAutoCommit(false);
for(String update: updates){
Statement stmt = connection.createStatement();
stmt.execute(update);
stmt.close();
}
connection.commit();
} catch (SQLException e) {
try {
connection.rollback();
} catch (SQLException ignore) {}
}
}
public void execUpdate(Connection connection, Map<Integer, String> idToName) {
try{
String update = "insert into users(id, user_name) values(?, ?)";
PreparedStatement stmt = connection.prepareStatement(update);
for(Integer id: idToName.keySet()){
stmt.setInt(1, id);
stmt.setString(2, idToName.get(id));
stmt.executeUpdate();
}
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public interface TResultHandler<T> {
T handle(ResultSet resultSet) throws SQLException;
}
public class TExecutor {
public <T> T execQuery(Connection connection, String query, TResultHandler<T>
handler) throws SQLException {
Statement stmt = connection.createStatement();
stmt.execute(query);
ResultSet result = stmt.getResultSet();
T value = handler.handle(result);
result.close();
stmt.close();
return value;
}
}
TExecutor execT = new TExecutor();
String query = “select user_name from users where id=1”;
String name = execT.execQuery(connection, query, new TResultHandler<String>(){
public String handle(ResultSet result) throws SQLException {
result.next();
return result.getString("user_name");
}
});
System.out.append("User: " + name + 'n');
DataSet – объект содержащий данные одной строки таблицы
На каждую таблицу свой DataSet
Извечние и встаку данных удобно проводить через DataSet-ы
public class UsersDataSet {
private long id;
private String name;
public UsersDataSet(long id, String name){ this.id = id; this.name = name; }
public UsersDataSet(String name){ this.id = -1; this.name = name; }
public String getName() {
return name;
}
public long getId() {
return id;
}
}
Объект доступа к данным
Шаблон проектирования скрывающий детали работы с базой
Обычно один DAO на одну таблицу
Высокоуровневый доступ к данным через DataSet-ы
Варианты операций над базой:
Вставка строки – добавление DataSet
Поиск строки по ключу – возврат DataSet-а
Поиск строк по признаку – возврат List<DataSet>
Удаление строки
public interface UsersDAO {
UsersDataSet get(long id) throws SQLException;
UsersDataSet getByName(String name) throws SQLException;
void add(UsersDataSet dataSet) throws SQLException;
void delete(long id) throws SQLException;
}
DatabaseService – служба в отдельном потоке. Abonent
Каждый DatabaseService при старте открывает Connection к базе
UsersDAO – объект доступа к данным таблицы USERS
UsersDataSet – объект с даннм одной строки таблицы USERS
public UsersDAO(Connection connection){…}
Executor – класс с типизированными методами для работы с запросами
Поддерживает транзакционность
Поддерживает prepared staements
ResultsDAO – объект доступа к данным таблицы RESULTS
Java осень 2012 лекция 8

Mais conteúdo relacionado

Mais procurados

Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
Technopark
 
Kirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталяхKirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталях
DneprCiklumEvents
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
tvaleev
 
Yii development
Yii developmentYii development
Yii development
MageCloud
 
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Provectus
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
Technopark
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
HappyDev
 

Mais procurados (20)

Android - 13 - Database
Android - 13 - DatabaseAndroid - 13 - Database
Android - 13 - Database
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
Алексей Андросов "Яндекс.Почта: архитектура фронтенда как она есть"
 
Java весна 2013 лекция 8
Java весна 2013 лекция 8Java весна 2013 лекция 8
Java весна 2013 лекция 8
 
Kirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталяхKirill Zotin клиент серверное взаимодействие под android в деталях
Kirill Zotin клиент серверное взаимодействие под android в деталях
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
Влад Ковташ — Yap Database
Влад Ковташ — Yap DatabaseВлад Ковташ — Yap Database
Влад Ковташ — Yap Database
 
Sql
SqlSql
Sql
 
Agile Instrumentation
Agile InstrumentationAgile Instrumentation
Agile Instrumentation
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
Yii development
Yii developmentYii development
Yii development
 
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...Василий Захарченко: "Взгляд на  queryDsl-sql фреймворк как альтернатива Hiber...
Василий Захарченко: "Взгляд на queryDsl-sql фреймворк как альтернатива Hiber...
 
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин Как навести порядок в коде вашего web-приложения, Андрей Чебукин
Как навести порядок в коде вашего web-приложения, Андрей Чебукин
 
Java осень 2012 лекция 7
Java осень 2012 лекция 7Java осень 2012 лекция 7
Java осень 2012 лекция 7
 
Grails & Groovy
Grails & GroovyGrails & Groovy
Grails & Groovy
 
JSP
JSPJSP
JSP
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Doctrine 2
Doctrine 2Doctrine 2
Doctrine 2
 
Введение в Spring
Введение в SpringВведение в Spring
Введение в Spring
 
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
2015-12-06 Максим Юнусов - Проектирование REST приложения, или нужно ли прогр...
 

Destaque

Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
Technopark
 
Web осень 2012 лекция 1
Web осень 2012 лекция 1Web осень 2012 лекция 1
Web осень 2012 лекция 1
Technopark
 
Highload осень 2012 лекция 3
Highload осень 2012 лекция 3Highload осень 2012 лекция 3
Highload осень 2012 лекция 3
Technopark
 
Java осень 2012 лекция 2
Java осень 2012 лекция 2Java осень 2012 лекция 2
Java осень 2012 лекция 2
Technopark
 
СУБД осень 2012 Лекция 3
СУБД осень 2012 Лекция 3СУБД осень 2012 Лекция 3
СУБД осень 2012 Лекция 3
Technopark
 
Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7
Technopark
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9
Technopark
 
СУБД осень 2012 лекция 6
СУБД осень 2012 лекция 6СУБД осень 2012 лекция 6
СУБД осень 2012 лекция 6
Technopark
 

Destaque (8)

Web весна 2012 лекция 9
Web весна 2012 лекция 9Web весна 2012 лекция 9
Web весна 2012 лекция 9
 
Web осень 2012 лекция 1
Web осень 2012 лекция 1Web осень 2012 лекция 1
Web осень 2012 лекция 1
 
Highload осень 2012 лекция 3
Highload осень 2012 лекция 3Highload осень 2012 лекция 3
Highload осень 2012 лекция 3
 
Java осень 2012 лекция 2
Java осень 2012 лекция 2Java осень 2012 лекция 2
Java осень 2012 лекция 2
 
СУБД осень 2012 Лекция 3
СУБД осень 2012 Лекция 3СУБД осень 2012 Лекция 3
СУБД осень 2012 Лекция 3
 
Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7Алгоритмы и структуры данных осень 2013 лекция 7
Алгоритмы и структуры данных осень 2013 лекция 7
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9
 
СУБД осень 2012 лекция 6
СУБД осень 2012 лекция 6СУБД осень 2012 лекция 6
СУБД осень 2012 лекция 6
 

Semelhante a Java осень 2012 лекция 8

паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
Vitaliy Trenkenshu
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
Ciklum
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9
Technopark
 

Semelhante a Java осень 2012 лекция 8 (20)

Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
JDBC
JDBCJDBC
JDBC
 
Database (Lecture 14 – database)
Database (Lecture 14 – database)Database (Lecture 14 – database)
Database (Lecture 14 – database)
 
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Основы Java. 5. Databases
Основы Java. 5. DatabasesОсновы Java. 5. Databases
Основы Java. 5. Databases
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Unit test быстрый старт
Unit test быстрый стартUnit test быстрый старт
Unit test быстрый старт
 
Шаблоны проектирования 1
Шаблоны проектирования 1Шаблоны проектирования 1
Шаблоны проектирования 1
 
C# Desktop. Занятие 12.
C# Desktop. Занятие 12.C# Desktop. Занятие 12.
C# Desktop. Занятие 12.
 
C# Web. Занятие 04.
C# Web. Занятие 04.C# Web. Занятие 04.
C# Web. Занятие 04.
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
Mikhail Valkov_Antipatterns
Mikhail Valkov_AntipatternsMikhail Valkov_Antipatterns
Mikhail Valkov_Antipatterns
 
Lec 13
Lec 13Lec 13
Lec 13
 
Java осень 2012 лекция 9
Java осень 2012 лекция 9Java осень 2012 лекция 9
Java осень 2012 лекция 9
 
C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.C++ Базовый. Занятие 17.
C++ Базовый. Занятие 17.
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
HTML 5
HTML 5HTML 5
HTML 5
 

Mais de Technopark

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
Technopark
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
Technopark
 

Mais de Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 

Java осень 2012 лекция 8

  • 1. Лекция 8. «Базы данных»
  • 2.
  • 3. MySQL Community Server MySQL Workbench MySQL Connector: Connector/J http://dev.mysql.com/downloads/
  • 4. Java Database Connectivity – API для работы с базами из приложений на Java Предназначена для работы с реляционными базами данных Предоставляет методы для получения и обновления данных Не зависит от конкретного типа базы
  • 5. Название класса драйвера: com.mysql.jdbc.Driver (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance() Создаем объект драйвера при помощи reflection: java.sql.DriverManager – класс хелпер для работы с драйверами Регистрируем драйвер: DriverManager.registerDriver(driver);
  • 6. Объект отвечает за соединение с базой и ражим работы с ней Объект представляет выражение обращения к базу Объект с результатом запроса, который вернула база
  • 7. Statement createStatement() CallableStatement prepareCall() PreparedStatement prepareStatement() Создание Statement объекта: Транзакционность: По-умолчанию auto-commit после выполнения каждого statement-а void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита void commit() void rollback()
  • 8. Driver driver = (Driver) Class.forName("com.mysql.jdbc.Driver").newInstance(); DriverManager.registerDriver(driver); StringBuilder url = new StringBuilder(); url. append("jdbc:mysql://"). //db type append("localhost:"). //host name append("3306/"). //port append("lecture8?"). //db name append("user=tully&"). //login append("password=tully"); //password // URL: “jdbc:mysql://localhost:3306/lecture8?user=tully&password=tully” Connection connection = DriverManager.getConnection(url.toString());
  • 9. Поток посылает запрос к базе и ждет ответа Если в приложении много потоков обращаются к базе Можно собрать коннекты в connection pool Если приложение однопоточное или потоков мало Можно в каждом потоке держать открытый connection
  • 10.
  • 11. JDBC позволяет создавать и выполнять запросы к базе Update statements: CREATE, DELETE, INSERT… Query statements: SELECT Интерфейсы: Statement PreparedStatement CallableStatement Query statements возвращают ResultSet Update statements возвращают число измененных строк
  • 12. Содержит результат запроса Доступ к полям текущей строки: По имени колонки: getBoolean(String name), getLong(String name)… По индексу колонки: getBoolean(int index), getLong(int index)… Перемещение по строкам: next() previous() isLast()
  • 13. Объект, который содержит методы для работы с запросами execUpdate(Connection connection, String update) execQuery(Connection connection, String update, ResultHandler handler) Обработка запроса на создание, вставку, обновление и удаление Обработка запроса на получение данных public interface ResultHandler { void handle(ResultSet result) throws SQLException; }
  • 14. public static int execUpdate(Connection connection, String update) { Statement stmt = connection.createStatement(); stmt.execute(update); int updated = stmt.getUpdateCount(); stmt.close(); return updated; } execUpdate(connection, "create table users (id bigint auto_increment, name varchar(256), primary key (id))"); execUpdate(connection, "insert into users (name) values ('tully')");
  • 15. public interface ResultHandler { void handle(ResultSet result) throws SQLException; } private static void execQuery(Connection connection, String query, ResultHandler handler){ Statement stmt = connection.createStatement(); stmt.execute(query); ResultSet result = stmt.getResultSet(); handler.handle(result); result.close(); stmt.close(); } execQuery(connection, "select * from users", new ResultHandler(){ public void handle(ResultSet result) throws SQLException { result.next(); System.out.append("User: " + result.getString("name") + 'n'); } });
  • 17.
  • 18. public void execUpdate(Connection connection, String[] updates) { try { connection.setAutoCommit(false); for(String update: updates){ Statement stmt = connection.createStatement(); stmt.execute(update); stmt.close(); } connection.commit(); } catch (SQLException e) { try { connection.rollback(); } catch (SQLException ignore) {} } }
  • 19. public void execUpdate(Connection connection, Map<Integer, String> idToName) { try{ String update = "insert into users(id, user_name) values(?, ?)"; PreparedStatement stmt = connection.prepareStatement(update); for(Integer id: idToName.keySet()){ stmt.setInt(1, id); stmt.setString(2, idToName.get(id)); stmt.executeUpdate(); } stmt.close(); } catch (SQLException e) { e.printStackTrace(); } }
  • 20. public interface TResultHandler<T> { T handle(ResultSet resultSet) throws SQLException; } public class TExecutor { public <T> T execQuery(Connection connection, String query, TResultHandler<T> handler) throws SQLException { Statement stmt = connection.createStatement(); stmt.execute(query); ResultSet result = stmt.getResultSet(); T value = handler.handle(result); result.close(); stmt.close(); return value; } }
  • 21. TExecutor execT = new TExecutor(); String query = “select user_name from users where id=1”; String name = execT.execQuery(connection, query, new TResultHandler<String>(){ public String handle(ResultSet result) throws SQLException { result.next(); return result.getString("user_name"); } }); System.out.append("User: " + name + 'n');
  • 22.
  • 23. DataSet – объект содержащий данные одной строки таблицы На каждую таблицу свой DataSet Извечние и встаку данных удобно проводить через DataSet-ы public class UsersDataSet { private long id; private String name; public UsersDataSet(long id, String name){ this.id = id; this.name = name; } public UsersDataSet(String name){ this.id = -1; this.name = name; } public String getName() { return name; } public long getId() { return id; } }
  • 24. Объект доступа к данным Шаблон проектирования скрывающий детали работы с базой Обычно один DAO на одну таблицу Высокоуровневый доступ к данным через DataSet-ы Варианты операций над базой: Вставка строки – добавление DataSet Поиск строки по ключу – возврат DataSet-а Поиск строк по признаку – возврат List<DataSet> Удаление строки
  • 25. public interface UsersDAO { UsersDataSet get(long id) throws SQLException; UsersDataSet getByName(String name) throws SQLException; void add(UsersDataSet dataSet) throws SQLException; void delete(long id) throws SQLException; }
  • 26.
  • 27. DatabaseService – служба в отдельном потоке. Abonent Каждый DatabaseService при старте открывает Connection к базе UsersDAO – объект доступа к данным таблицы USERS UsersDataSet – объект с даннм одной строки таблицы USERS public UsersDAO(Connection connection){…} Executor – класс с типизированными методами для работы с запросами Поддерживает транзакционность Поддерживает prepared staements ResultsDAO – объект доступа к данным таблицы RESULTS