Skip to content
This repository was archived by the owner on Jun 11, 2022. It is now read-only.

Commit 22a219d

Browse files
committed
Make DatabaseProxy and DaoManager static, so there's no longer need to create new instances for every request
1 parent 1f89c3e commit 22a219d

File tree

13 files changed

+84
-92
lines changed

13 files changed

+84
-92
lines changed

server/src/main/java/com/balinski/api_project/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ static void runApplication() {
2727

2828
static void testDatabase() {
2929
try {
30-
List<Film> list = new DaoManager().getFilmDao().getAll();
30+
List<Film> list = DaoManager.getFilmDao().getAll();
3131
for(var film : list)
3232
System.out.println(film.getTitle());
3333
} catch (DaoException e) {

server/src/main/java/com/balinski/api_project/database/DatabaseException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.balinski.api_project.database;
22

3-
public class DatabaseException extends Exception {
3+
public class DatabaseException extends RuntimeException {
44
public DatabaseException(String message) {
55
super(message);
66
}

server/src/main/java/com/balinski/api_project/database/DatabaseProxy.java

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,23 @@
88
import java.util.stream.Stream;
99

1010
public class DatabaseProxy {
11-
protected BasicDataSource dataSource;
12-
protected Connection connection;
13-
protected String driver;
14-
protected String url;
15-
protected String username;
16-
protected String password;
17-
18-
public DatabaseProxy() throws DatabaseException {
11+
protected static BasicDataSource dataSource;
12+
protected static Connection connection;
13+
protected static String driver;
14+
protected static String url;
15+
protected static String username;
16+
protected static String password;
17+
18+
static {
1919
loadDatabaseProperties("server/src/main/resources/database.properties");
2020
loadDriver();
2121
testConnection();
2222
initDataSource();
2323
}
2424

25-
public List<Map<String, Object>> querySelect(String sql) throws DatabaseException {
25+
private DatabaseProxy(){};
26+
27+
public static List<Map<String, Object>> querySelect(String sql) throws DatabaseException {
2628
List<Map<String, Object>> data;
2729

2830
try(Connection connection = getConnection()) {
@@ -51,7 +53,7 @@ public List<Map<String, Object>> querySelect(String sql) throws DatabaseExceptio
5153
return data;
5254
}
5355

54-
public int queryUpdate(String sql, boolean transaction) throws DatabaseException {
56+
public static int queryUpdate(String sql, boolean transaction) throws DatabaseException {
5557
int rowsAffected = 0;
5658

5759
try(Connection connection = getConnection()) {
@@ -75,28 +77,28 @@ public int queryUpdate(String sql, boolean transaction) throws DatabaseException
7577
return rowsAffected;
7678
}
7779

78-
protected Connection getConnection() throws DatabaseException {
80+
protected static Connection getConnection() throws DatabaseException {
7981
try {
80-
this.connection = dataSource.getConnection();
82+
connection = dataSource.getConnection();
8183
} catch (SQLException e) {
8284
throw new DatabaseException("Could not obtain an instance of connection from given data source.", e);
8385
}
8486

85-
return this.connection;
87+
return connection;
8688
}
8789

88-
protected void closeConnection() throws DatabaseException {
89-
if(this.connection == null)
90+
protected static void closeConnection() throws DatabaseException {
91+
if(connection == null)
9092
return;
9193

9294
try {
93-
this.connection.close();
95+
connection.close();
9496
} catch (SQLException e) {
9597
throw new DatabaseException("Cannot close the connection.", e);
9698
}
9799
}
98100

99-
private void testConnection() throws DatabaseException {
101+
private static void testConnection() throws DatabaseException {
100102
if(Stream.of(url, driver, username, password).anyMatch(Objects::isNull)) {
101103
throw new DatabaseException("One of the database properties (url, driver, username, password) is missing. " +
102104
"Check the file containing database properties.");
@@ -109,7 +111,7 @@ private void testConnection() throws DatabaseException {
109111
}
110112
}
111113

112-
protected void initDataSource() {
114+
protected static void initDataSource() {
113115
dataSource = new BasicDataSource();
114116
dataSource.setUrl(url);
115117
dataSource.setUsername(username);
@@ -119,7 +121,7 @@ protected void initDataSource() {
119121
dataSource.setMaxOpenPreparedStatements(100);
120122
}
121123

122-
protected void loadDatabaseProperties(String path) throws DatabaseException {
124+
protected static void loadDatabaseProperties(String path) throws DatabaseException {
123125
Properties props;
124126
try {
125127
props = FilePropertiesLoader.load(path);
@@ -134,7 +136,7 @@ protected void loadDatabaseProperties(String path) throws DatabaseException {
134136
password = props.getProperty("password");
135137
}
136138

137-
private void loadDriver() throws DatabaseException {
139+
private static void loadDriver() throws DatabaseException {
138140
try {
139141
Class.forName(driver);
140142
} catch (ClassNotFoundException e) {

server/src/main/java/com/balinski/api_project/database/dao/ActorDao.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,20 @@
55
import java.util.*;
66

77
public class ActorDao extends Dao<Actor> {
8-
public ActorDao(DaoManager manager, boolean transaction) {
9-
super(manager, DaoType.ACTOR, transaction);
8+
public ActorDao(boolean transaction) {
9+
super(DaoType.ACTOR, transaction);
1010
}
1111

1212
public List<Actor> getByFirstName(String firstName) throws DaoException {
13-
List<Map<String, Object>> result = manager.getData(
13+
List<Map<String, Object>> result = DaoManager.getData(
1414
String.format("SELECT * FROM ACTOR A WHERE lower(A.FIRST_NAME) = '%s';", firstName.toLowerCase())
1515
);
1616

1717
return toListOfObjects(result);
1818
}
1919

2020
public List<Actor> getByLastName(String lastName) throws DaoException {
21-
List<Map<String, Object>> result = manager.getData(
21+
List<Map<String, Object>> result = DaoManager.getData(
2222
String.format("SELECT * FROM ACTOR A WHERE lower(A.LAST_NAME) = '%s';", lastName.toLowerCase())
2323
);
2424

server/src/main/java/com/balinski/api_project/database/dao/Dao.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,40 @@
55
import java.util.*;
66

77
abstract class Dao<T extends DatabaseModel> {
8-
protected DaoManager manager;
98
protected boolean transaction;
109
protected DaoType type;
1110

12-
protected Dao(DaoManager manager, DaoType type, boolean transaction) {
13-
this.manager = manager;
11+
protected Dao(DaoType type, boolean transaction) {
1412
this.type = type;
1513
this.transaction = transaction;
1614
}
1715

1816
public int getCount() throws DaoException {
19-
List<Map<String, Object>> result = manager.getData(
17+
List<Map<String, Object>> result = DaoManager.getData(
2018
String.format("SELECT COUNT(*) AS COUNT FROM %s;", type.toString())
2119
);
2220

2321
return ((Long)result.get(0).get("COUNT")).intValue();
2422
}
2523

2624
public T getById(int id) throws DaoException {
27-
List<Map<String, Object>> result = manager.getData(
25+
List<Map<String, Object>> result = DaoManager.getData(
2826
String.format("SELECT * FROM %s T WHERE T.%s_ID = %d;", type.toString(), type.toString(), id)
2927
);
3028

3129
return result.size() > 0 ? toListOfObjects(result).get(0) : null;
3230
}
3331

3432
public List<T> getAll() throws DaoException {
35-
List<Map<String, Object>> result = manager.getData(
36-
String.format("SELECT * FROM %sa;", type.toString())
33+
List<Map<String, Object>> result = DaoManager.getData(
34+
String.format("SELECT * FROM %s;", type.toString())
3735
);
3836

3937
return toListOfObjects(result);
4038
}
4139

4240
public List<T> getIdBetween(int start, int stop) throws DaoException {
43-
List<Map<String, Object>> result = manager.getData(
41+
List<Map<String, Object>> result = DaoManager.getData(
4442
String.format("SELECT * FROM %s T WHERE T.%s_ID BETWEEN %d AND %d;",
4543
type.toString(), type.toString(), start, stop)
4644
);
@@ -54,7 +52,7 @@ public int add(T obj) throws DaoException {
5452

5553
String sql = String.format("INSERT INTO %s VALUES (%s);", type.toString(), obj.asCsv());
5654

57-
return manager.modifyData(sql, transaction);
55+
return DaoManager.modifyData(sql, transaction);
5856
}
5957

6058
public int addAll(List<T> list) throws DaoException {
@@ -71,7 +69,7 @@ public int addAll(List<T> list) throws DaoException {
7169

7270
sql.replace(sql.lastIndexOf(", "), sql.length(), ";");
7371

74-
return manager.modifyData(sql.toString(), transaction);
72+
return DaoManager.modifyData(sql.toString(), transaction);
7573
}
7674

7775
protected List<T> toListOfObjects(List<Map<String, Object>> listOfMaps) throws DaoException {

server/src/main/java/com/balinski/api_project/database/dao/DaoManager.java

Lines changed: 21 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,59 +7,51 @@
77
import java.util.Map;
88

99
public class DaoManager {
10-
protected DatabaseProxy databaseProxy;
10+
private DaoManager(){}
1111

12-
public DaoManager() throws DaoException {
13-
try {
14-
this.databaseProxy = new DatabaseProxy();
15-
} catch (DatabaseException e) {
16-
throw new DaoException("DaoManager could not be initialized due to database connection error.", e);
17-
}
18-
}
19-
20-
public ActorDao getActorDao() {
21-
return new ActorDao(this, false);
12+
public static ActorDao getActorDao() {
13+
return new ActorDao(false);
2214
}
2315

24-
public FilmDao getFilmDao() {
25-
return new FilmDao(this, false);
16+
public static FilmDao getFilmDao() {
17+
return new FilmDao(false);
2618
}
2719

28-
public LanguageDao getLanguageDao() {
29-
return new LanguageDao(this, false);
20+
public static LanguageDao getLanguageDao() {
21+
return new LanguageDao(false);
3022
}
3123

32-
public UserDao getUserDao() {
33-
return new UserDao(this, false);
24+
public static UserDao getUserDao() {
25+
return new UserDao(false);
3426
}
3527

36-
public ActorDao getActorDao(boolean transaction) {
37-
return new ActorDao(this, transaction);
28+
public static ActorDao getActorDao(boolean transaction) {
29+
return new ActorDao( transaction);
3830
}
3931

40-
public FilmDao getFilmDao(boolean transaction) {
41-
return new FilmDao(this, transaction);
32+
public static FilmDao getFilmDao(boolean transaction) {
33+
return new FilmDao(transaction);
4234
}
4335

44-
public LanguageDao getLanguageDao (boolean transaction) {
45-
return new LanguageDao(this, transaction);
36+
public static LanguageDao getLanguageDao (boolean transaction) {
37+
return new LanguageDao( transaction);
4638
}
4739

48-
public UserDao getUserDao (boolean transaction) {
49-
return new UserDao(this, transaction);
40+
public static UserDao getUserDao (boolean transaction) {
41+
return new UserDao(transaction);
5042
}
5143

52-
List<Map<String, Object>> getData(String sql) throws DaoException {
44+
static List<Map<String, Object>> getData(String sql) throws DaoException {
5345
try {
54-
return this.databaseProxy.querySelect(sql);
46+
return DatabaseProxy.querySelect(sql);
5547
} catch (DatabaseException e) {
5648
throw new DaoException(e.getMessage());
5749
}
5850
}
5951

60-
int modifyData(String sql, boolean transaction) throws DaoException {
52+
static int modifyData(String sql, boolean transaction) throws DaoException {
6153
try {
62-
return this.databaseProxy.queryUpdate(sql, transaction);
54+
return DatabaseProxy.queryUpdate(sql, transaction);
6355
} catch (DatabaseException e) {
6456
throw new DaoException(e.getMessage());
6557
}

0 commit comments

Comments
 (0)