На этом шаге мы приведем пример работы с БД
Приведем ниже пример демонстрирующий работу с базой данной. Мы будем использовать СУБД PostgreSQL. Вы можете использовать любую другую СУБД. В таком случае вы должны сами позаботиться, чтобы запросы в примере соответствовали диалекту выбранной СУБД, а также о подключении нужного JDBC драйвера.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>it.kgsu.ru</groupId> <artifactId>it.kgsu.ru</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.7.0</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.1.4</version> </dependency> </dependencies> </project>
package ru.kgsu.it; public class User { private String name; private String surname; private String login; User(String name, String surname, String login) { this.name = name; this.surname = surname; this.login = login; } @Override public String toString() { return "\tlogin = '" + login + "', name = '" + name + "',surname = '" + surname + "'"; } }
package ru.kgsu.it; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Utils { static final int ADD_USER = 1; static final int REMOVE_USER = 2; static final int UPDATE_USER = 3; static final int PRINT_USERS = 4; static final String URL_CONNECTION_DATABASE = "jdbc:postgresql://localhost:5432/usersdb"; static final String USER_KEY_PROPERTY = "user"; static final String USER = "sergey"; static final String PASSWORD_KEY_PROPERTY = "password"; static final String PASSWORD = "1"; private static final String CHECK_USER_SQL = "select * from Users where login = ?"; static final String SELECT_USER_SQL = "select * from Users"; static final String INSERT_USER_SQL = "insert into Users(login, name, surname) values(?, ?, ?)"; static final String DELETE_USER_SQL = "delete from Users where login = ?"; static final String UPDATE_USER_SQL = "update Users set name = ?, surname = ? where login = ?"; private static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); /** * Функция для вывода меню */ static void printMenu() { System.out.println("1) Добавление пользователя"); System.out.println("2) Удаление пользователя"); System.out.println("3) Редактирование пользователя"); System.out.println("4) Вывод списка пользователей"); System.out.println("5) Выход"); } /** * Функция для вывода разделителя строк * * @param blankLineBeforeSeparator Печатать ли пустую строку перед разделителем * @param blankLineAfterSeparator Печатать ли пустую строку после разделителя */ static void printSeparator(boolean blankLineBeforeSeparator, boolean blankLineAfterSeparator) { if (blankLineBeforeSeparator) { System.out.println(); } for (int i = 0; i < 70; i++) { System.out.print('-'); } System.out.println(); if (blankLineAfterSeparator) { System.out.println(); } } /** * Функция для чтения строки. Чтение будет продолжаться до тех пор, пока * не будет введена непустая строка. * * @param hint Строка, которая будет печататься перед каждой попыткой ввода * @return Введенная строка */ static String readString(String hint) throws IOException { String string = ""; while (string.isEmpty()) { System.out.print(hint); string = bufferedReader.readLine(); } return string; } /** * Функция для чтения числа. Чтение будет продолжаться до тех пор, пока * не будет введено число. * * @param hint Строка, которая будет печататься перед каждой попыткой ввода * @return Введенное число */ static int readNumber(String hint) throws IOException { String string = readString(hint); return Integer.parseInt(string); } /** * Функция для проверки наличия пользователя в базе * * @param conn Соединение с базой * @param login Логин пользователя. Логин пользователя уникален в таблице. * @return true, если пользователь есть в базе, false - в противном случае */ static boolean checkUser(Connection conn, String login) throws SQLException { PreparedStatement statement = conn.prepareStatement(CHECK_USER_SQL); statement.setString(1, login); ResultSet rs = statement.executeQuery(); return rs.next(); } }
package ru.kgsu.it; import java.io.IOException; import java.sql.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; import static ru.kgsu.it.Utils.*; public class Main { /** * Функция для получения соединения с базой * * @return Объект соединения с базой */ private static Connection getDBConnection() throws SQLException { Properties properties = new Properties(); properties.setProperty(USER_KEY_PROPERTY, USER); properties.setProperty(PASSWORD_KEY_PROPERTY, PASSWORD); return DriverManager.getConnection(URL_CONNECTION_DATABASE, properties); } /** * Функция для добавления пользователя в базу * * @param conn Соединение с базой */ private static void addUser(Connection conn) throws IOException, SQLException { printSeparator(true, false); System.out.println("Добавление нового пользователя"); String login = readString("Введите логин пользователя: "); if (checkUser(conn, login)) { System.out.println("Ошибка: Данный пользователь уже существует"); printSeparator(false, true); return; } String name = readString("Введите имя пользователя: "); String surname = readString("Введите фамилию пользователя: "); PreparedStatement insertStatement = conn.prepareStatement(INSERT_USER_SQL); insertStatement.setString(1, login); insertStatement.setString(2, name); insertStatement.setString(3, surname); insertStatement.execute(); System.out.println("Операция успешно выполнена"); printSeparator(false, true); } /** * Функция для удаления пользователя из базы * * @param conn Соединение с базой */ private static void removeUser(Connection conn) throws IOException, SQLException { printSeparator(true, false); System.out.println("Удаление пользователя"); String login = readString("Введите логин пользователя: "); if (!checkUser(conn, login)) { System.out.println("Ошибка: Данный пользователь не существует"); printSeparator(false, true); return; } PreparedStatement removeStatement = conn.prepareStatement(DELETE_USER_SQL); removeStatement.setString(1, login); removeStatement.executeUpdate(); System.out.println("Операция успешно выполнена"); printSeparator(false, true); } /** * Функция для измения информации о пользователе в базе * * @param conn Соединение с базой */ private static void updateUser(Connection conn) throws IOException, SQLException { printSeparator(true, false); System.out.println("Редактирование пользователя"); String login = readString("Введите логин пользователя: "); if (!checkUser(conn, login)) { System.out.println("Ошибка: Данный пользователь не существует"); printSeparator(false, true); return; } String name = readString("Введите новое имя пользователя: "); String surname = readString("Введите новую фамилию пользователя: "); PreparedStatement updateStatement = conn.prepareStatement(UPDATE_USER_SQL); updateStatement.setString(1, name); updateStatement.setString(2, surname); updateStatement.setString(3, login); updateStatement.execute(); System.out.println("Операция успешно выполнена"); printSeparator(false, true); } /** * Функция для вывода всех пользователей из базы * * @param conn Соединение с базой */ private static void printUsers(Connection conn) throws SQLException { List<User> users = getUsersFromDb(conn); printSeparator(true, false); if (users.size() == 0) { System.out.println("Список пользователей пуст"); printSeparator(false, true); return; } System.out.println("Список пользователей: "); users.forEach(System.out::println); printSeparator(false, true); } /** * Функция для получения всех пользователей из базы * * @param conn Соединение с базой * @return Список пользователей */ private static List<User> getUsersFromDb(Connection conn) throws SQLException { List<User> users = new ArrayList<>(); Statement statement = conn.createStatement(); ResultSet rs = statement.executeQuery(SELECT_USER_SQL); while (rs.next()) { String login = rs.getString("login"); String name = rs.getString("name"); String surname = rs.getString("surname"); User user = new User(name, surname, login); users.add(user); } return users; } public static void main(String[] args) throws SQLException, IOException { // Получаем соединение с базой Connection conn = getDBConnection(); while (true) { // Пока мы не нажали выход из программы // Выводим меню printMenu(); // Просим ввести номер пункта меню int number = 0; while (number < 1 || number > 5) number = readNumber("> "); // Выполняем команду соответствующую введенному номеру пункту меню if (number == ADD_USER) addUser(conn); else if (number == REMOVE_USER) removeUser(conn); else if (number == UPDATE_USER) updateUser(conn); else if (number == PRINT_USERS) printUsers(conn); else break; } // Закрываем соединение с базой conn.close(); } }
Проект можно взять здесь
Рис. 1. Вывод пользователей перед всеми операциями
Рис. 2. Добавление пользователя
Рис. 3. Редактирование пользователя
Рис. 4. Удаление пользователя
На следующем шаге мы начнем знакомиться с библиотекой JAXB