Работа с базами данных с помощью JDBC драйвера

В этом уроке я бы хотел вас научить работать с базами данных MySQL, PostgreSQL, Oracle. А именно как подключится и выполнять SQL запросы к базе с помощью java.

Что такое JDBC?

JDBC Driver — (Java DataBase Connectivity — соединение с базами данных на Java) — платформенно-независимый промышленный стандарт взаимодействия Java-приложений с различными СУБД, реализованный в виде пакета java.sql, входящего в состав Java SE.

 Зачем нужен JDBC?

JDBC — позволяет получать доступ к БД, а также выполнять к ней SQL запросы.

jdbc_scheme
 

Шаг 1.

Скачиваем jar файл JDBC драйвера.

MySQL — http://dev.mysql.com/downloads/connector/j/

PostqreSLQ — http://jdbc.postgresql.org/download.html

Oracle — http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html

Шаг 2.

Подключение к БД Mysql:

Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://hostname:port/dbname","username", "password");
conn.close();

Подключение к БД PostgreSQL:

Class.forName("org.postgresql.Driver");
Connection connection = DriverManager.getConnection("jdbc:postgresql://hostname:port/dbname","username", "password");
connection.close();

Подключение к БД Oracle:

Class.forName("oracle.jdbc.driver.OracleDriver");
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:mkyong","username","password");
connection.close();

В 1-й строке мы указываем наш JDBC драйвер. Не забудьте добавить его в ClassPath иначе его компилятор его не увидит.
Во 2-й строке JDBC Manager который открывает соединение с базой данных и обеспечит нам дальнейшее обращение к ней.
И последняя строка закрывает соединение с БД.

Желательно строку для определения JDBC поместить в блок try для того чтобы контролировать его наличия в вашем приложении.

try {
	Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
	System.out.println("Where is your MySQL JDBC Driver?");
	e.printStackTrace();
	return;
}

Шаг 3. Создание таблиц в БД.

Вынесем в отдельный метод соединение с БД.

private static Connection getDBConnection() {
	Connection dbConnection = null;
	try {
		Class.forName(DB_DRIVER);
	} catch (ClassNotFoundException e) {
		System.out.println(e.getMessage());
	}
	try {
		dbConnection = DriverManager.getConnection(DB_CONNECTION, DB_USER,DB_PASSWORD);
		return dbConnection;
	} catch (SQLException e) {
		System.out.println(e.getMessage());
	}
	return dbConnection;
}

Этот метод будет создавать в БД таблицу:

private static void createDbUserTable() throws SQLException {
	Connection dbConnection = null;
	Statement statement = null;

	String createTableSQL = "CREATE TABLE DBUSER("
			+ "USER_ID NUMBER(5) NOT NULL, "
			+ "USERNAME VARCHAR(20) NOT NULL, "
			+ "CREATED_BY VARCHAR(20) NOT NULL, "
			+ "CREATED_DATE DATE NOT NULL, " + "PRIMARY KEY (USER_ID) "
			+ ")";

	try {
		dbConnection = getDBConnection();
		statement = dbConnection.createStatement();

                // выполнить SQL запрос
		statement.execute(createTableSQL);
		System.out.println("Table \"dbuser\" is created!");
	} catch (SQLException e) {
		System.out.println(e.getMessage());
	} finally {
		if (statement != null) {
			statement.close();
		}
		if (dbConnection != null) {
			dbConnection.close();
		}
	}
}

и в main методе вызываем метод createDbTable() который создаст таблицу в БД.

public static void main(String[] argv) {
	try {
		createDbUserTable();
	} catch (SQLException e) {
		System.out.println(e.getMessage());
	}
}

В результате вы должны получить:

CREATE TABLE DBUSER(
  USER_ID NUMBER(5) NOT NULL, 
  USERNAME VARCHAR(20) NOT NULL, 
  CREATED_BY VARCHAR(20) NOT NULL, 
  CREATED_DATE DATE NOT NULL, 
  PRIMARY KEY (USER_ID) 
)
TABLE "user" IS created!

Шаг 4. Добавление новой записи в БД.

String insertTableSQL = "INSERT INTO DBUSER"
			+ "(USER_ID, USERNAME, CREATED_BY, CREATED_DATE) " + "VALUES"
			+ "(1,'mkyong','system', " + "to_date('"
			+ getCurrentTimeStamp() + "', 'yyyy/mm/dd hh24:mi:ss'))";

метод который будет возвращать текущую дату и время:

private static String getCurrentTimeStamp() { Date today = new Date(); return dateFormat.format(today.getTime()); }

И выполняем наш SQL запрос который лежит в переменной insertTableSQL 

statement.executeUpdate(insertTableSQL);

Шаг 5. Получение данных с БД.

String selectTableSQL = "SELECT USER_ID, USERNAME from DBUSER";

Выполняем запрос:

try {
	dbConnection = getDBConnection();
	statement = dbConnection.createStatement();

	// выбираем данные с БД
	ResultSet rs = statement.executeQuery(selectTableSQL);

	// И если что то было получено то цикл while сработает   
	while (rs.next()) {
		String userid = rs.getString("USER_ID");
		String username = rs.getString("USERNAME");

		System.out.println("userid : " + userid);
		System.out.println("username : " + username);
	}
} catch (SQLException e) {
	System.out.println(e.getMessage());
}

Шаг 6. Удаление данных с БД.

String deleteTableSQL = "DELETE DBUSER WHERE USER_ID = 1";

Выполняем запрос на удаление:

try {
	dbConnection = getDBConnection();
	statement = dbConnection.createStatement();

	// выполняем запрос delete SQL
	statement.execute(deleteTableSQL);
	System.out.println("Record is deleted from DBUSER table!");
} catch (SQLException e) {
	System.out.println(e.getMessage());
}

Шаг 7. Обновление данных в БД.

String updateTableSQL = "UPDATE DBUSER SET USERNAME = 'mkyong_new' WHERE USER_ID = 1";

Выполняем запрос на обновление записи:

try {
	dbConnection = getDBConnection();
	statement = dbConnection.createStatement();

	// выполняем запрос update SQL
	statement.execute(updateTableSQL);

	System.out.println("Record is updated to DBUSER table!");
} catch (SQLException e) {
	System.out.println(e.getMessage());
}

Выводы.

Все действия с любой базой данных выполняются через SQL запросы, то есть нам достаточно знать SQL для манипуляцией данными в БД.

Урок создан: 01 марта 2013 | Просмотров: 144918 | Автор: Александр Барчук | Правила перепечатки


Добавить комментарий

Добавить комментарий

Ваш e-mail не будет опубликован.

Комментарии:

  • 23 мая 2013 в 19:07

    Станислав

    Проблема с подключением jdbc к приложению для Android — заголовок комментария.

    Почему в жизни так бывает …

    строка Connection connection = DriverManager.getConnection(«jdbc:postgresql://хост:порт/имя_дб»,»пользователь», «пароль»);
    выдаёт ошибку Unhandled exception type SQLException
    ( строка connection.close(); — выдаёт туже ошибку )

    При добавлении строки import java.sql.SQLException; в MainActivity.java
    выводит сообщение …
    The import java.sql.SQLException is never used

    При этом файл postgresql-9.2-1002.jdbc4.jar лежит в /libs

    И в classpath добавлять пробовал, хотя многие источники говорят, что это не обязательно, достаточно держать файл postgresql-9.2-1002.jdbc4.jar в /libs

    При нажатие ctrl+shift+O Eclips добавляет только:

    import java.sql.Connection;
    import java.sql.DriverManager;

    А к чему приводит ручное добавление строки import java.sql.SQLException; описано в комментарии чуть выше.

    Поможете решить проблему?

  • 27 сентября 2013 в 17:45

    Paranoid User

    Есть подозрение, что в начале статьи JDBC драйвер для Oracle указан неверно. Oracle предлагает такой вариант: jdbc:oracle:thin:@localhost:1521/

  • 01 октября 2013 в 10:17

    влад

    statement = dbConnection.createStatement(); у меня здесь ошибка почему то показывается

  • 07 октября 2013 в 11:40

    Елена

    Статья мне понравилась, но у меня проблема package oracle.jdbc.driver does not exist. Я в среде переменных прописала путь к библиотеке.
    Что еще нужно сделать?

  • 06 декабря 2013 в 22:15

    Андрей

    в шаге 4 . возможно ошибка в «USER_ID NUMBER(5) NOT NULL, » posgres сервер сообщает «нет типа number» .

    • 06 декабря 2013 в 22:19

      Андрей

      ошибочка ,в 3 шаге , изменил на NUMERIC прокатило .

      • 08 декабря 2013 в 19:34

        Андрей

        и еще поправьте в шаге 6 — «DELETE FROM DBUSER WHERE USER_ID = 1»

        • 08 декабря 2013 в 19:35

          Андрей

          Спасибо Автору за урок =)

          • 08 декабря 2013 в 21:04

            Александр Барчук

            И вам спасибо за исправление. Мы будем переносить уроки на новую версию сайта и все исправим.

      • 28 ноября 2015 в 08:45

        Виталий

        +1

  • 20 декабря 2013 в 18:44

    Дмитрий

    Здравствуйте Александр. Спасибо за материал, особенно за видео курс. В Ваших видео курсах вы говорили что планируется сделать видео курсы по базам данных, очень жду.

  • 18 мая 2014 в 12:56

    Анатолий

    Привет!
    Автору спасибо за статью!
    Нашел ошибку или недочет, поэтому хочу поправить: в Шаг 4. Добавление новой записи в БД. в методе getCurrentTimeStamp() не хватает DateFormat dateFormat = DateFormat.getDateInstance();

    • 06 июня 2015 в 02:26

      Мимо проходил

      и в MySQL нет функции to_date, правильно будет так «str_to_date(‘» + getCurrentTimeStamp() + «‘, ‘%d.%m.%Y’))»;
      пытался ещё сделать с часами, минутами и секундами, но не получилось, для этого надо будет
      поменять тут DateFormat dateFormat = DateFormat.getDateTimeInstance();
      и ещё тут «str_to_date(‘» + getCurrentTimeStamp() + «‘, ‘%d.%m.%Y %h:%i:%s’))»;

      • 06 июня 2015 в 02:28

        Мимо проходил

        кавычки не те получились, ну вы поняли))

      • 06 июня 2015 в 02:33

        Мимо проходил

        если ещё при создании таблицы добавите строчку + «updated_at timestamp» , то при UPDATE, будет дата обновления в гггг-мм-дд чч:мм:сс
        ещё забыл сказать, огромное СПАСИБО!!! (-:

  • 06 августа 2014 в 13:15

    Алексей

    Помогите, пожалуйста, разобраться. Метод createDbUserTable() бросает экспешн SQLException. Но в тоже время в самом методе есть блок try-catch обработкой этого эксепшена. Не является ли что-либо из перечисленного лишним?

  • 22 декабря 2014 в 20:17

    Андрей

    А возможно ли получить исходный код данного урока?

  • 18 марта 2015 в 18:09

    Богдан

    Подскажите, пожалуйста, как выполнить запрос, который находится в текстовом файле с sql-запросами?

  • 19 декабря 2015 в 02:37

    Артем

    Sat Dec 19 02:23:37 EET 2015 WARN: Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
    Выводится при запуске. Не могу разобрать, что это означает. Помогите пожалуйста. Все работает, но вначале постоянно выводится эта строка.

  • 05 февраля 2016 в 10:40

    Антон

    Всем привет! Помогите решить проблемку одну. Сейчас изучаю JDBS … работаю с Android Studio в gradel добавил следующею строчку compile ‘mysql:mysql-connector-java:5.1.38’ теперь когда пытаюсь подключиться к базе получаю след. ошибку
    Error:Gradle: com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
    Error:Gradle: Execution failed for task ‘:app:transformClassesWithDexForDebug’.
    > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘C:\Program Files\Java\jdk1.7.0_79\bin\java.exe» finished with non-zero exit value 1
    Что я делаю не так собственно? =)

  • 17 апреля 2016 в 20:42

    Эмин

    а как создать таблицу и указать в ней внешний ключ? у меня почему-то при заполнении такой таблицы данными в этом поле стоит значение NULL

  • 01 февраля 2017 в 13:34

    Илья

    public Connection connectToDB(){
    Connection con=null;
    try{
    Class.forName(«oracle.jdbc.driver.OracleDriver»);
    con= DriverManager.getConnection(
    «jdbc:oracle:thin:@hostname:1521:SID»,»user»,»passw»);
    Toast.makeText(getApplicationContext(), «OK», Toast.LENGTH_LONG).show();
    }catch(Exception e){
    Toast.makeText(getApplicationContext(), «Error — » + e.getMessage(), Toast.LENGTH_LONG).show(); }
    return con;
    }
    падает на DriverManager.getConnection. Ошибка при ексепшене — null. На машинной яве работает нормально.

  • 17 февраля 2017 в 08:48

    Rossario

    Ребят подскажите пожалуйста для новичка как сконектить tarantool c веб-интерфейсом на java для доступа к БД, на github’e для новичка не очень понятно объясняется куда и как этот коннектор деть. Уже очень долго бьюсь, работаю в NetBeans.

  • 28 июня 2017 в 14:33

    Олег

    Добрый день!
    Вопрос: Как результат select * from dual перенести в TableView, если SQL запросы и Controller находятся в разных классах?