25
Углубленное программирование на Java Лекция 3.1 «Базы данных» Виталий Чибриков

Java осень 2014 занятие 7

Embed Size (px)

DESCRIPTION

Java осень 2014 занятие 7

Citation preview

Page 1: Java осень 2014 занятие 7

Углубленное программирование на

Java Лекция 3.1

«Базы данных»

Виталий Чибриков

Page 2: Java осень 2014 занятие 7

План лекции

2

1. JDBC

2. Executor

3. Транзакции

Page 3: Java осень 2014 занятие 7

Термины и сокращения

3

JDBC Java Database Connectivity

ORM Object Relational Mapping

JPA Java Persistency API

Hibernate популярная библиотека для ORM, implements JPA

DAO Data Access Object

Page 4: Java осень 2014 занятие 7

Инструменты

4

MySQL Community Server

MySQL Workbench

MySQL Connector: Connector/J

http://dev.mysql.com/downloads/

<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency>

Page 5: Java осень 2014 занятие 7

JDBC

5

Java Database Connectivity ― API для работы с базами из приложений на Java

Предназначена для работы с реляционными базами данных

Предоставляет методы для получения и обновления данных

Не зависит от конкретного типа базы

Page 6: Java осень 2014 занятие 7

ResultSet

Connection

JDBC API

6

Объект отвечает за соединение с базой и режим работы с ней

Объект с результатом запроса, который вернула база

Statement

Объект представляет выражение обращения к базе

Page 7: Java осень 2014 занятие 7

JDBC Driver Manager

7

Название класса драйвера: com.mysql.jdbc.Driver

(Driver) Class.forName("com.mysql.jdbc.Driver").newInstance()

Создаем объект драйвера при помощи reflection:

java.sql.DriverManager – класс хелпер для работы с драйверами

Регистрируем драйвер:

DriverManager.registerDriver(driver);

Page 8: Java осень 2014 занятие 7

Connection

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("db_example?"). //db name append("user=tully&"). //login append("password=tully"); //password

// URL: “jdbc:mysql://localhost:3306/lecture_db?user=tully&password=tully”

Connection connection = DriverManager.getConnection(url.toString());

Page 9: Java осень 2014 занятие 7

Statements

9

JDBC позволяет создавать и выполнять запросы к базе

Update statements: CREATE, DELETE, INSERT…

Query statements: SELECT

Интерфейсы

Statement

PreparedStatement

CallableStatement

Query statements возвращают ResultSet

Update statements возвращают число измененных строк

Page 10: Java осень 2014 занятие 7

ResultSet

10

Содержит результат запроса

Доступ к полям текущей строки:

По имени колонки: getBoolean(String name), getLong(String name)…

По индексу колонки: getBoolean(int index), getLong(int index)…

Перемещение по строкам:

next()

previous()

isLast()

Page 11: Java осень 2014 занятие 7

stmt = con.createStatement(); ResultSet resultSet = stmt.executeQuery(query); while (resultSet.next()) { boolean deleted = resultSet.getBoolean(1); … }

ResultSet

11

Page 12: Java осень 2014 занятие 7

Все обращения надо закрывать вручную

close()

12

resultSet.close()

statement.close()

connection.close()

Page 13: Java осень 2014 занятие 7

План лекции

13

1. JDBC

2. Executor

3. Транзакции

Page 14: Java осень 2014 занятие 7

Executor

14

Объект, который содержит методы для работы с запросами

execUpdate(Connection connection, String update)

execQuery(Connection connection, String query, ResultHandler handler)

Обработка запроса на создание, вставку, обновление и удаление

Обработка запроса на получение данных

public interface ResultHandler { void handle(ResultSet result) throws SQLException; }

Page 15: Java осень 2014 занятие 7

Update Statement

15

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')");

Page 16: Java осень 2014 занятие 7

Select Statement

16

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(); }

Page 17: Java осень 2014 занятие 7

Вызов execQuery

17

String query = “select * from users where name = ‘tully’”; ResultHandler handler = new ResultHandlerImpl() execQuery(connection, query, handler);

class ResultHandlerImpl implements ResultHandler{ public void handle(ResultSet result) throws SQLException { result.next(); System.out.append("User: " + result.getString("name") + '\n'); } }

Page 18: Java осень 2014 занятие 7

Типизация

18

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; } }

Page 19: Java осень 2014 занятие 7

Типизация

19

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');

Page 20: Java осень 2014 занятие 7

План лекции

20

1. JDBC

2. Executor

3. Транзакции

Page 21: Java осень 2014 занятие 7

Transactions

21

По-умолчанию auto-commit после выполнения каждого statement-а

void setAutoCommit(boolean autoCommit) – вкл/выкл автокоммита

void commit()

void rollback()

Page 22: Java осень 2014 занятие 7

Transactions

22

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(); connection.setAutoCommit(true); } catch (SQLException ignore) {} } }

Page 23: Java осень 2014 занятие 7

Prepared Statements

23

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(); } }

Page 24: Java осень 2014 занятие 7

Демонстрация кода

24

в

Page 25: Java осень 2014 занятие 7

Спасибо за внимание

Виталий Чибриков [email protected]