Вы находитесь на странице: 1из 8

JDBC. Работа с базой данных.

Для работы с базой данных мы можем использовать различные драйвера для соединения и запросов. Одним из популярнейших из них –
JDBC.
JDBC (Java DataBase Connectivity) — платформенно-независимый промышленный стандарт взаимодействия Java-приложений с различными
СУБД, реализованный в виде пакета java.sql, входящего в состав Java SE. JDBC основан на концепции так называемых драйверов, позволяющих
получать соединение с базой данных по специально описанному URL. Драйверы могут загружаться динамически (во время работы программы).
Мы прекрасно знаем, что в Мире существуют различные виды СУБД, такие как Oracle, MySQL, Postgre, SqlLite и.т.д. По программе нашего
курса мы будем использовать MySQL. Для этого нам нужно будет скачать драйвер, с официального сайта Maven Repository по ссылке:
http://central.maven.org/maven2/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar
После загрузки, нужно будет добавить данный JAR файл в наш проект, можно в принципе скопировать в папку src. Затем, после копирования,
нужно будет добавить файл в библиотеку нашего проекта:
File -> Project Structure
Выбираем Libraries. Нажмите на кнопку +, затем выберите Java. Укажите на наш файл с расширением .jar, и нажмите на OK.
Далее, нам нужно будет установить MYSQL сервер. Для этого достаточно скачать XAMPP с официального сайта:
https://www.apachefriends.org/
Скачиваете нужную версию для вашей операционной системы, и устанавливаете. После установки запускаете панель контроля (XAMPP control
panel). Запускаете Apache и MySQL (по умолчанию порт MySQL сервера равна 3306). Для входа в админ панель базы данных, наберите в
браузере:
http://localhost/phpmyadmin/
Затем, давайте попробуем создать собственную базу, назовем его testing_db.
В админ панели, выбираем вкладку "Базы Данных", и заполняем поле "Создать базу данных". Для кодировки, из выпадающего списка
выберем "utf8_general_ci". (Данная кодировка нужна нам для хранения любых видов шрифта, такие как латинские и кириллица.)
Затем, внутри базы создаем таблицу, например, cars, у которого будет 4 столбца.
Первое поле у нас будет - id, идентификатор. Типом мы выберем – int, с длиной 11. Для идентификатора нам обязательно нужно будет
выбрать галочку A_I (Auto Increment - чтобы наш идентификатор автоматический генерировался по возрастанию) и поставить индекс PRIMARY
(Первичный ключ, чтобы больше таких цифр не повторялось).
Второе поле у нас будет – name, имя машины. Типом мы выберем – varchar, с длинной 200. Это как String в Java.
Третье поле – price, цена. Типом будет – int, с длинной 9 (максимум девять цифр).
Последнее поле – engine_volume, объем двигателя. Типом будет – double, но вот длину мы не укажем.
После создания, мы можем уже полноценно пользоваться данной таблицей.
Теперь нам нужно будет соединится со стороны приложения.
Сперва мы создадим класс сущности таблицы cars, и назовем его Cars.java:
public class Cars {

private Long id;


private String name;
private int price;
private double engineVolume;

public Cars() {
}

public Cars(Long id, String name, int price, double engineVolume) {


this.id = id;
this.name = name;
this.price = price;
this.engineVolume = engineVolume;
}

public Long getId() {


return id;
}

public void setId(Long id) {


this.id = id;
}

public String getName() {


return name;
}

public void setName(String name) {


this.name = name;
}

public int getPrice() {


return price;
}

public void setPrice(int price) {


this.price = price;
}

public double getEngineVolume() {


return engineVolume;
}

public void setEngineVolume(double engineVolume) {


this.engineVolume = engineVolume;
}

Далее, создадим класс DBManager.java, в котором мы будем соединятся с базой данных.


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

public class DBManager {

private Connection connection;

public void connect() {

try {

Class.forName("com.mysql.cj.jdbc.Driver");
connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/testing_db?useUnicode=true&serverTimezone=UTC","root", ""
);

} catch (Exception e) {
e.printStackTrace();
}
}

public void addCar(Cars car){

try{

PreparedStatement statement = connection.prepareStatement("" +


"INSERT INTO cars (id, name, price, engine_volume) " +
"VALUES (NULL, ?, ?, ?)"
);
statement.setString(1, car.getName());
statement.setInt(2, car.getPrice());
statement.setDouble(3, car.getEngineVolume());

int rows = statement.executeUpdate();

statement.close();

}catch (Exception e){


e.printStackTrace();
}
}

public ArrayList<Cars> getAllCars(){

ArrayList<Cars> carList = new ArrayList<>();

try{

PreparedStatement statement = connection.prepareStatement("SELECT * FROM cars");


ResultSet resultSet = statement.executeQuery();

while(resultSet.next()){
Long id = resultSet.getLong("id");
String name = resultSet.getString("name");
int price = resultSet.getInt("price");
double engineVolume = resultSet.getDouble("engine_volume");

carList.add(new Cars(id, name, price, engineVolume));

statement.close();

}catch (Exception e){


e.printStackTrace();
}

return carList;

public void deleteCar(Long id){

try{

PreparedStatement statement = connection.prepareStatement("" +


"DELETE FROM cars WHERE id = ?"
);
statement.setLong(1, id);
int rows = statement.executeUpdate();

statement.close();

}catch (Exception e){


e.printStackTrace();
}
}

В этом классе мы создадим 4 главных метода, это init(), addCar(Cars car), getAllCars() и deleteCar(Long id).
В первом методе мы инициализируем соединение с базой данных, который называется testing_db, с пользователем root и без пароля (в
случае отсутствия пароли, мы вводим "" а иначе ее значение). То что в url базы мы вводим значение jdbc:mysql://localhost:3306/testing_db
означает что мы подключаемся к локальному серверу используя порт 3306 (по умолчанию номер порта MySQL равна 3306).
Далее, после соединения мы можем использовать объект connection, для отправки запросов в базу данных.
Метод addCar(Cars car) предназначена для добавления машин в базу данных. Заметьте, мы в аргумент передаем не поля таблицы cars, а
объект класса Cars. Почему? Чтобы не было зависимостей. Для абстрагирования. Представьте, что наш метод будет выглядеть таким образом:
public void addCar(Long id, String name, int price, double engineVolume){
...
}

То есть мы напрямую передадим параметры машин. А теперь представьте что мы в таблицу cars добавим еще несколько полей. В таком случае,
и нам придется менять структуру аргументов метода addCar(). И придется менять код везде, где вызывается этот метод. В плане рефакторинга
(изменения) это очень непрактично или как программисты говорят - костыль. Так что лучше сразу создать класс сущности нашей таблицы и
упаковать их в объект.
Далее, внутри этого метода мы создаем объект PreparedStatement. Это интерфейс, включающий команду SQL отправленный в базу данных для
анализа, обобщения, планирования и выполнения. Мы заранее заготовим запрос, в котором внедряем свои параметры из объекта класса Cars
в нужном порядке. Как вы заметили, SQL в запросе "INSERT INTO cars (id, name, price, engine_volume) VALUES (NULL, ?, ?, ?)" мы используем
NULL и вопросительные знаки. NULL мы передаем в поле id, потому что id генерируется самостоятельно. Нам не нужно вводить никаких
параметров для этого поля. Символ "?" означает что я передам в эти поля значения в нужном порядке.
Например, если в запросе первым стоит поле name, то мы будем использовать метод setString(1, car.getName()). Для второго поля мы
используем метод setInt(2, car.getPrice()). В интерфейсе PreparedStatement есть методы для каждого типа данных, такие как setLong(),
setDouble(), setFloat(), setBoolean() и.т.д.
В конце запускаем запрос при помощи executeUpdate().
Метод getAllCars() возвращает нам массив с машинами. В нем также мы используем PreparedStatement получаем результат в объекте ResultSet.
ResultSet представляет набор записей, извлеченных из-за выполнения запроса. При помощи итерации мы можем по отдельности обратиться к
каждому элементу результата. Метод next() возвращает true и переходит в следующий элемент пока не дойдет до последнего. Таким образом,
при помощи методов getString(), getInt(), getDouble() и getLong() мы возвращаем каждое поле как значение, и упаковываем их в объект Cars.
Каждый объект добавляется в массив и возвращается как результат метода.
Метод deleteCar(Long id) будете удалять машину в зависимости от введенного поля id.
Теперь нам остается реализовать класс Main, чтобы использовать наши методы.
Main.java
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {

DBManager manager = new DBManager();


manager.connect();

Scanner in = new Scanner(System.in);

while(true){

System.out.println("PRESS 1 TO ADD CAR");


System.out.println("PRESS 2 TO LIST CARS");
System.out.println("PRESS 3 TO DELETE CAR");
System.out.println("PRESS 0 TO EXIT");

String choice = in.next();

if(choice.equals("1")){

System.out.println("Insert name:");
String name = in.next();
System.out.println("Insert engine volume:");
double volume = in.nextDouble();
System.out.println("Insert price:");
int price = in.nextInt();
Cars c = new Cars(null, name, price, volume);
manager.addCar(c);

}else if(choice.equals("2")){

ArrayList<Cars> cars = manager.getAllCars();

for (Cars c : cars){


System.out.println(c);
}

}else if(choice.equals("3")){

System.out.println("Insert id of a car");
Long id = in.nextLong();
manager.deleteCar(id);

} else if(choice.equals("0")){
System.exit(0);
}

В нашем основном классе Main, мы инициализируем один объект класса DBManager, и будем использовать его пока не завершим работу.
Таким образом, грамотно разделив структуру проекта, мы смело можем создавать собственные приложения, которые взаимодействуют с базой
данных. Конечно для улучшения знания вам потребуется самостоятельно практиковаться и изучить как правильно писать SQL запросы.
Параллельно, советую вам изучить MYSQL или ORACLE.
Со стороны JAVA вам нужно знать о JDBC следующие классы:
DriverManager:
Это класс, использующийся для управления списком Driver (database drivers).
Driver:
Это интерфейс, использующийся для соединения коммуникации с базой данных, управления коммуникации с базой данных. Когда
загружается Driver, программисту не нужно конкретно вызывать его.
Connection:
Интерфейс со всеми методами связи с базой данных. Он описывает коммуникационный контекст. Вся связь с базой данных
осуществляется только через объект соединения (connection).
PreparedStatement:
Это интерфейс, включающий команду SQL отправленный в базу данных для анализа, обобщения, планирования и выполнения.
ResultSet:
ResultSet представляет набор записей, извлеченных из-за выполнения запроса.

Вам также может понравиться