Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit c44ac98

Browse files
Added DAO folder in the MVCPracticeAdvanced section of a small course on Java EE
1 parent d003f15 commit c44ac98

File tree

4 files changed

+297
-0
lines changed

4 files changed

+297
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package AirportSimulatorTwo.DAO;
2+
3+
import java.util.List;
4+
import java.util.Optional;
5+
6+
public interface Dao<K, T> {
7+
8+
List<T> findAll();
9+
10+
Optional<T> findById(K id);
11+
12+
boolean delete(K id);
13+
14+
void update(T entity);
15+
16+
T save(T entity);
17+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package AirportSimulatorTwo.DAO;
2+
3+
import AirportSimulatorTwo.Entity.Flight;
4+
import AirportSimulatorTwo.Entity.EntityEnum.FlightStatus;
5+
import AirportSimulatorTwo.Util.ConnectionManager;
6+
7+
import java.sql.*;
8+
import java.util.*;
9+
10+
public class FlightDao implements Dao<Long, Flight>{
11+
private static final FlightDao INSTANCE = new FlightDao();
12+
private FlightDao() {
13+
}
14+
public static FlightDao getInstance(){
15+
return INSTANCE;
16+
}
17+
private static final String FIND_ALL = """
18+
SELECT *
19+
FROM flight
20+
""";
21+
@Override
22+
public List<Flight> findAll() {
23+
try(Connection myConnect = ConnectionManager.getBaseConnection();
24+
PreparedStatement myPrepStatement = myConnect.prepareStatement(FIND_ALL)){
25+
ResultSet resultOfQuery = myPrepStatement.executeQuery();
26+
List<Flight> flightsFromQuery = new ArrayList<>();
27+
while (resultOfQuery.next()){
28+
flightsFromQuery.add(buildFlight(resultOfQuery));
29+
}
30+
return flightsFromQuery;
31+
} catch (SQLException e) {
32+
throw new RuntimeException(e);
33+
}
34+
35+
}
36+
37+
@Override
38+
public Optional<Flight> findById(Long id) {
39+
return Optional.empty();
40+
}
41+
42+
@Override
43+
public boolean delete(Long id) {
44+
return false;
45+
}
46+
47+
@Override
48+
public void update(Flight entity) {
49+
50+
}
51+
52+
@Override
53+
public Flight save(Flight entity) {
54+
return null;
55+
}
56+
57+
private Flight buildFlight(ResultSet flightsFromQuery) throws SQLException {
58+
return new Flight(
59+
flightsFromQuery.getObject("id", Long.class),
60+
flightsFromQuery.getObject("flight_no", String.class),
61+
flightsFromQuery.getObject("departure_date", Timestamp.class).toLocalDateTime(),
62+
flightsFromQuery.getObject("departure_airport_code", String.class),
63+
flightsFromQuery.getObject("arrival_date", Timestamp.class).toLocalDateTime(),
64+
flightsFromQuery.getObject("arrival_airport_code", String.class),
65+
flightsFromQuery.getObject("aircraft_id", Integer.class),
66+
FlightStatus.valueOf(flightsFromQuery.getObject("status", String.class))
67+
);
68+
}
69+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package AirportSimulatorTwo.DAO;
2+
3+
import AirportSimulatorTwo.Entity.Ticket;
4+
import AirportSimulatorTwo.Util.ConnectionManager;
5+
6+
import java.math.BigDecimal;
7+
import java.sql.Connection;
8+
import java.sql.PreparedStatement;
9+
import java.sql.ResultSet;
10+
import java.sql.SQLException;
11+
import java.util.ArrayList;
12+
import java.util.List;
13+
import java.util.Optional;
14+
15+
public class TicketDao implements Dao<Long, Ticket> {
16+
17+
private static final TicketDao INSTANCE = new TicketDao();
18+
private TicketDao() {
19+
}
20+
public static TicketDao getInstance() {
21+
return INSTANCE;
22+
}
23+
private static final String FIND_ALL_BY_FLIGHT_ID = """
24+
SELECT *
25+
FROM ticket
26+
WHERE flight_id = ?
27+
""";
28+
29+
public List<Ticket> findAllByFlightId(Long flightId){
30+
try(Connection myConnection = ConnectionManager.getBaseConnection();
31+
PreparedStatement myPrepStatement =
32+
myConnection.prepareStatement(FIND_ALL_BY_FLIGHT_ID)) {
33+
myPrepStatement.setObject(1,flightId);
34+
35+
ResultSet resultOfQuery = myPrepStatement.executeQuery();
36+
List<Ticket> ticketsFromQuery = new ArrayList<>();
37+
while (resultOfQuery.next()){
38+
ticketsFromQuery.add(buildTicket(resultOfQuery));
39+
}
40+
return ticketsFromQuery;
41+
} catch (SQLException throwables) {
42+
throw new RuntimeException(throwables);
43+
}
44+
}
45+
46+
@Override
47+
public List<Ticket> findAll() {
48+
return null;
49+
}
50+
51+
@Override
52+
public Optional<Ticket> findById(Long id) {
53+
return Optional.empty();
54+
}
55+
56+
@Override
57+
public boolean delete(Long id) {
58+
return false;
59+
}
60+
61+
@Override
62+
public void update(Ticket entity) {
63+
64+
}
65+
66+
@Override
67+
public Ticket save(Ticket entity) {
68+
return null;
69+
}
70+
71+
private Ticket buildTicket(ResultSet resultOfQuery) throws SQLException {
72+
return new Ticket(
73+
resultOfQuery.getObject("id", Long.class),
74+
resultOfQuery.getObject("passenger_no", String.class),
75+
resultOfQuery.getObject("passenger_name", String.class),
76+
resultOfQuery.getObject("flight_id", Long.class),
77+
resultOfQuery.getObject("seat_no", String.class),
78+
resultOfQuery.getObject("cost", BigDecimal.class)
79+
);
80+
}
81+
}
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
package AirportSimulatorTwo.DAO;
2+
3+
import AirportSimulatorTwo.Entity.EntityEnum.Gender;
4+
import AirportSimulatorTwo.Entity.EntityEnum.Role;
5+
import AirportSimulatorTwo.Entity.User;
6+
import AirportSimulatorTwo.Util.ConnectionManager;
7+
import lombok.SneakyThrows;
8+
9+
import java.sql.*;
10+
import java.util.List;
11+
import java.util.Optional;
12+
13+
import static java.sql.Statement.RETURN_GENERATED_KEYS;
14+
15+
public class UserDao implements Dao <Integer, User>{
16+
private static final UserDao INSTANCE = new UserDao();
17+
18+
public UserDao() {
19+
}
20+
21+
public static UserDao getInstance() {
22+
return INSTANCE;
23+
}
24+
/*
25+
При размещении нового пользователя в базу
26+
нам не нужен ID т.к. он генерируется базой
27+
и мы его получим при запросе.
28+
*/
29+
private static final String SAVE_SQL_ENTER_USER =
30+
"INSERT INTO " +
31+
"users (name, birthday, email, password, role, gender, image) " +
32+
"VALUES " +
33+
"(?, ?, ?, ?, ?, ?, ?)";
34+
/* Делаем выборку из базы по email и password */
35+
private static final String GET_BY_EMAIL_AND_PASSWORD_SQL =
36+
"SELECT * FROM users WHERE email = ? AND password = ?";
37+
@Override
38+
public List<User> findAll() {
39+
return null;
40+
}
41+
42+
@Override
43+
public Optional<User> findById(Integer id) {
44+
return Optional.empty();
45+
}
46+
47+
@Override
48+
public boolean delete(Integer id) {
49+
return false;
50+
}
51+
52+
@Override
53+
public void update(User entity) {
54+
55+
}
56+
57+
@SneakyThrows
58+
public Optional<User> findByEmailAndPassword(String email, String password) {
59+
/* Создаем связь и формируем заготовленный параметризированный запрос */
60+
try(Connection connectionToBase = ConnectionManager.getBaseConnection();
61+
PreparedStatement prepStatement = connectionToBase.
62+
prepareStatement(GET_BY_EMAIL_AND_PASSWORD_SQL)){
63+
/* Задаем параметры запроса, соблюдаем порядок параметров */
64+
prepStatement.setString(1, email);
65+
prepStatement.setString(2, password);
66+
/* Отправляем запрос и получаем ответ */
67+
ResultSet resultSetOfQuery = prepStatement.executeQuery();
68+
User userFromBase = null;
69+
/*
70+
Есть вероятность того, что пользователя по заданным параметрам
71+
мы не найдем, отсюда и возвращаемый методом Optional объект,
72+
который при его наличии будет User.
73+
*/
74+
if(resultSetOfQuery.next()){
75+
userFromBase = buildEntity(resultSetOfQuery);
76+
}
77+
return Optional.ofNullable(userFromBase);
78+
}
79+
}
80+
/*
81+
Данный метод необходим, чтобы вернуть извлеченные
82+
из базы данные - объект класса User.
83+
*/
84+
private static User buildEntity(ResultSet resultSetOfQuery) throws SQLException {
85+
return User.builder().
86+
id(resultSetOfQuery.getObject("id", Integer.class)).
87+
name(resultSetOfQuery.getObject("name", String.class)).
88+
birthday(resultSetOfQuery.getObject("birthday", Date.class).toLocalDate()).
89+
email(resultSetOfQuery.getObject("email", String.class)).
90+
image(resultSetOfQuery.getObject("image", String.class)).
91+
password(resultSetOfQuery.getObject("password", String.class)).
92+
role(Role.find(resultSetOfQuery.getObject("role", String.class)).orElse(null)).
93+
gender(Gender.valueOf(resultSetOfQuery.getObject("gender", String.class))).
94+
build();
95+
}
96+
97+
/*
98+
Применяем аннотацию Lombok для обработки исключений, так же
99+
при генерации запроса мы хотим получить сгенерированный ID,
100+
поэтому применяется аргумент RETURN_GENERATED_KEYS
101+
*/
102+
@Override
103+
@SneakyThrows
104+
public User save(User saveUserEntity) {
105+
/* Получаем соединение с базой и формируем запрос к ней */
106+
try(Connection connection =
107+
ConnectionManager.getBaseConnection();
108+
/* Формируем запрос с возможностью извлечь ID внесенного пользователя */
109+
PreparedStatement preparedStatement =
110+
connection.prepareStatement(SAVE_SQL_ENTER_USER, RETURN_GENERATED_KEYS)){
111+
/* Передаем в запрос параметры переданные из формы */
112+
preparedStatement.setObject(1, saveUserEntity.getName());
113+
preparedStatement.setObject(2, saveUserEntity.getBirthday());
114+
preparedStatement.setObject(3, saveUserEntity.getEmail());
115+
preparedStatement.setObject(4, saveUserEntity.getPassword());
116+
preparedStatement.setObject(5, saveUserEntity.getRole().name());
117+
preparedStatement.setObject(6, saveUserEntity.getGender().name());
118+
preparedStatement.setObject(7, saveUserEntity.getImage());
119+
/* Передаем запрос в базу */
120+
preparedStatement.executeUpdate();
121+
/* Получаем сгенерированный базой данных ID */
122+
ResultSet generatedKeys = preparedStatement.getGeneratedKeys();
123+
generatedKeys.next();
124+
/* Помещаем в наш Entity объект USER полученный ID */
125+
saveUserEntity.setId(generatedKeys.getObject("id", Integer.class));
126+
127+
return saveUserEntity;
128+
}
129+
}
130+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /