Форум программистов, компьютерный форум, киберфорум
Java EE (J2EE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
1 / 1 / 0
Регистрация: 15.10.2019
Сообщений: 67

Паттерн DAO и роли пользователей

23.11.2020, 16:39. Показов 3885. Ответов 3

Студворк — интернет-сервис помощи студентам
Есть два класса в проекте: User и Role. Для того, чтобы связать пользователей и их роли, нужно в класс User добавить Set ролей. А как тогда в методах (GRUD-операциях, в сервлетах, например) обращаться конкретно к id роли или названию роли? Или как, например, в методе findAll() добавлять ещё и роль пользователю (опять же, используя этот Set<Role> roles)?

Класс User:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package domain;
 
import java.util.LinkedHashSet;
import java.util.Objects;
import java.util.Set;
 
public class User {
    private int id;
    private String login;
    private String password;
    private String name;
    private int age;
    private Set<Role> roles;
 
    public User() {
 
    }
 
    public User(int idUser, String login, String password, String name, int age) {
    }
 
    public User(String loginUser, String passwordUser) {
        this.login = loginUser;
        this.password = passwordUser;
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public String getLogin() {
        return login;
    }
 
    public void setLogin(String login) {
        this.login = login;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    public Set<Role> getRoles() {
        return roles;
    }
 
    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", login='" + login + '\'' +
                ", password='" + password + '\'' +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", roles=" + roles +
                '}';
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id &&
                age == user.age &&
                login.equals(user.login) &&
                password.equals(user.password) &&
                name.equals(user.name) &&
                roles.equals(user.roles);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(id, login, password, name, age, roles);
    }
 
}

Класс Role:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package domain;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
 
public class Role {
    private int idRole;
    private String nameOfRole;
 
    public Role() {
    }
 
    public Role(int idRole, String nameOfRole) {
        this.idRole = idRole;
        this.nameOfRole = nameOfRole;
    }
 
    public Role(String nameOfRole) {
    }
 
    public Role(int idRole) {
    }
 
    public int getIdRole() {
        return idRole;
    }
 
    public void setIdRole(int idRole) {
        this.idRole = idRole;
    }
 
    public String getNameOfRole() {
        return nameOfRole;
    }
 
    public void setNameOfRole(String nameOfRole) {
        this.nameOfRole = nameOfRole;
    }
 
 
    @Override
    public String toString() {
        return "Role{" +
                "idRole=" + idRole +
                ", nameOfRole='" + nameOfRole + '\'' +
                '}';
    }
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Role role = (Role) o;
        return idRole == role.idRole &&
                nameOfRole.equals(role.nameOfRole);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(idRole, nameOfRole);
    }
}
Работа с БД для User:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
package dao;
 
import dao.config.ConnectionDB;
import domain.Role;
import domain.User;
import java.sql.*;
import java.util.LinkedHashSet;
import java.util.Set;
 
public class UserDaoImpl implements UserDao {
 
    @Override
    public Set<User> findAll() {
        Set<User> users = new LinkedHashSet<>();
        String sqlSelect = "SELECT users.id, users.login, users.password, users.name, users.age, roles.\"idRole\", roles.name_of_role FROM users LEFT JOIN users_roles ON users_roles.usersid = users.id LEFT JOIN roles ON users_roles.rolesid = roles.\"idRole\" ORDER BY id ASC";
        try (Connection conn = ConnectionDB.getNewConnection();
             PreparedStatement preparedStatement = conn.prepareStatement(sqlSelect)) {
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                User user = new User();
                user.setId(resultSet.getInt("id"));
                user.setLogin(resultSet.getString("login"));
                user.setPassword(resultSet.getString("password"));
                user.setName(resultSet.getString("name"));
                user.setAge(resultSet.getInt("age"));
 
                users.add(user);
            }
        } catch (Exception ex) {
            System.out.println("Connection Failed : " + ex.getMessage());
        }
        return users;
    }
 
    @Override
    public User findById(int id, int idRole) {
        User user = null;
        String sqlId = "SELECT users.id, users.login, users.password, users.name, users.age, roles.\"idRole\" FROM users LEFT JOIN users_roles ON users_roles.usersid = users.id LEFT JOIN roles ON users_roles.rolesid = roles.\"idRole\" WHERE users_roles.usersid = ? AND  users_roles.rolesid = ? ";
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlId)) {
                preparedStatement.setInt(1, id);
                preparedStatement.setInt(2, idRole);
                ResultSet resultSet = preparedStatement.executeQuery();
                if (resultSet.next()) {
                    int idUser = resultSet.getInt("id");
                    String login = resultSet.getString("login");
                    String password = resultSet.getString("password");
                    String name = resultSet.getString("name");
                    int age = resultSet.getInt("age");
                    int idUserRole = resultSet.getInt("idRole");
                    user = new User(idUser, login, password, name, age);
                }
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return user;
    }
 
 
    @Override
    public User selectUserByLogin(String login, String password) {
        User user = null;
        String sqlId = "SELECT users.login, users.password, roles.\"idRole\", roles.name_of_role\n" +
                "FROM users \n" +
                "LEFT JOIN users_roles ON users_roles.usersid = users.id \n" +
                "LEFT JOIN roles ON users_roles.rolesid = roles.\"idRole\" \n" +
                "WHERE users.login = ? AND  users.password = ? ";
 
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlId)) {
                preparedStatement.setString(1, login);
                preparedStatement.setString(2, password);
                ResultSet resultSet = preparedStatement.executeQuery();
                if (resultSet.next()) {
                    String loginUser = resultSet.getString("login");
                    String passwordUser = resultSet.getString("password");
                    String roleUser = resultSet.getString("name_of_role");
                    user = new User(loginUser, passwordUser, roleUser);
                }
            }
 
        } catch (Exception ex) {
            System.out.println(ex);
        }
        return user;
    }
 
    @Override
    public int createUser(String login, String password, String name, int age, int rolesid) {
        String sqlInsert = "with insert_user as (INSERT INTO users (login, password, name, age)\n" +
                "VALUES (?, ?, ?, ?)\n" +
                "returning id\n" +
                ")\n" +
                "INSERT INTO users_roles (usersid, rolesid) SELECT insert_user.id, (?) from insert_user";
 
        try (Connection conn = ConnectionDB.getNewConnection()) {
 
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlInsert)) {
                preparedStatement.setString(1, login);
                preparedStatement.setString(2, password);
                preparedStatement.setString(3, name);
                preparedStatement.setInt(4, age);
                preparedStatement.setInt(5, rolesid);
 
                return preparedStatement.executeUpdate();
            }
 
        } catch (Exception ex) {
            System.out.println("Connection Failed : " + ex.getMessage());
        }
        return 0;
    }
 
 
    @Override
    public int editUser(int id, String login, String password, String name, int age, int rolesid) {
        String sqlUpdate = "with edit_user as (\n" +
                "  update users\n" +
                "  SET login = ?, password = ?, name = ?, age = ?\n" +
                "  WHERE id = ?\n" +
                "  returning *\n" +
                ")\n" +
                "update users_roles\n" +
                "set rolesid = ?\n" +
                "where usersid = ?";
 
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlUpdate)) {
                preparedStatement.setString(1, login);
                preparedStatement.setString(2, password);
                preparedStatement.setString(3, name);
                preparedStatement.setInt(4, age);
                preparedStatement.setInt(5, id);
                preparedStatement.setInt(6, rolesid);
                preparedStatement.setInt(7, id);
                return preparedStatement.executeUpdate();
            }
 
        } catch (SQLException throwable) {
            throwable.printStackTrace();
        }
        return 0;
    }
 
    @Override
    public int delete(int id) {
        String sqlDelete = "DELETE FROM users WHERE id = ?";
        try (Connection conn = ConnectionDB.getNewConnection()) {
            try (PreparedStatement preparedStatement = conn.prepareStatement(sqlDelete)) {
                preparedStatement.setInt(1, id);
                return preparedStatement.executeUpdate();
            }
 
        } catch (Exception ex) {
            System.out.println("Connection Failed : " + ex.getMessage());
        }
        return 0;
    }
 
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.11.2020, 16:39
Ответы с готовыми решениями:

Роли пользователей в Spring
Пытаюсь реализовать примитивную авторизацию/регистрацию с бд через SpringSecurity. Вопрос касательно этого блока: @Override ...

Spring Security и роли пользователей
В проекте на Spring MVC + ExtJS + Spring Security имеется такая конфигурация в файле applicationContext-security.xml &lt;?xml...

Описание DAO паттерн на русском. Где найти?
Кто-нибудь подскажет где можно найти информацию (описание)про DAO (Data Access Object) паттерн проектирования НА РУССКОМ? Нашел только...

3
2 / 3 / 0
Регистрация: 16.02.2017
Сообщений: 36
24.11.2020, 13:29
А в чем собственно проблема?
У тебя есть класс User. Создаешь объект:
Java
1
User newUser = new User(idUser, login, password, name, age)
Из запроса ты так же достаешь роль. Создай так же объект для нее:

Java
1
Role roleUser = new Role( idRole, nameOfRole)
И установи этот объект роли к юзеру:

Java
1
newUser.SetRole(roleUser);
И соответственно измени тип реквизита класса юзера
Java
1
private Role role;
Только хорошо бы было сделать проверку на наличие уже созданного объекта роли и пользователя
1
1 / 1 / 0
Регистрация: 15.10.2019
Сообщений: 67
24.11.2020, 16:03  [ТС]
CarpeDiem62, Тогда здесь не будет связи многие-ко-многим, а мне нужно именно в такой конструкции. Поэтому, и должен быть использован Set<Role> roles. Чтобы, по возможности, мы могли добавить несколько ролей одному пользователю
0
2 / 3 / 0
Регистрация: 16.02.2017
Сообщений: 36
24.11.2020, 17:08
Значит у тебя три таблицы.
Не знаю, может знатоки предложат что-то получше.

1. Делаешь запрос к пользователям, создаешь объекты, выгружаешь в массив (как ты это и делал)
Java
1
 users.add(user);
2. Делаешь запрос к таблице связей пользователей и их ролей:
SQL
1
2
SELECT ТаблицаСвязей.ИдПользователя, ТаблицаРолей.ИдРоли, ТаблицаРолей.НазваниеРоли
FROM ТаблицаСвязей  LEFT JOIN ТаблицаРолей ON ТаблицаСвязей.ИдРоли = ТаблицаРолей.ИдРоли
В итоге у тебя список из ИдПользователя, ИдРоли и ее названия.
Дальше создаешь роли с проверкой на уже существование. И по ИД пользователя привязываешь эту роль ему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.11.2020, 17:08
Помогаю со студенческими работами здесь

Как вывести всех пользователей, привязанных к роли, кроме текущего (того, кто тоже в этой роли)?
Есть роль User (identity).Текущий пользователь заходит в приложение и видит список всех пользователей в роли User, выведенных на экран,...

Роли пользователей
Есть две роли пользователей. Первая роль: имеет возможность только просматривать таблицу, после назначение. Вторая роль: создаёт...

Роли пользователей и их возможности
Всем доброго времени суток. Такой вопрос. При добавлении новой роли пользователя, нам нужно указать такой параметр как capabilities. ...

Роли в Acl и группы пользователей
Подскажите, пожалуйста, как решить следующую задачу. Есть база на сервере. В ACL этой базы определены роли. Как определить в LS,...

Роли, права, классы пользователей
Всем доброго времени суток. Меня интересует, есть ли какая нибудь система управление пользователями и правами их доступа? Раньше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru