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

DAO (PreparedStatement, DaoException)

27.05.2016, 22:56. Показов 2067. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, помогите пожалуйста разобраться, вопросы следующие были заданы:

"throws Exception, throws SQLException выбрасывайте свой подкласс Exception, например DaoException" - как это реализовать?
а так же "myStmt = myConn.prepareStatement("UPDATE profiles SET user_name=?, nick_name=?, user_name=?, password=?, gender=?, birth_date=?, country=?"); - в чем преимущество PreparedStatement и как его лучше использовать?"


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
import java.io.FileInputStream;
import java.sql.*;
import java.util.Properties;
 
public class ProfilesDAO {
 
    private Connection myConn;
 
    public ProfilesDAO() throws Exception {
        Properties prop = new Properties();
        prop.load(new FileInputStream("info.properties"));
 
        String user = prop.getProperty("user");
        String password = prop.getProperty("password");
        String dburl = prop.getProperty("dburl");
 
        myConn = DriverManager.getConnection(dburl, user, password);
        System.out.println("Подключено успешно к: " + dburl);
    }
 
    public void updateProfiles(Profiles theProfiles) throws SQLException {  
        PreparedStatement myStmt = null;
        try {
 
            myStmt = myConn.prepareStatement("UPDATE profiles SET user_name=?, nick_name=?, user_name=?, password=?, gender=?, birth_date=?, country=?");
            myStmt.setString(1, theProfiles.getUserName());
            myStmt.setString(2, theProfiles.getNickName());
            myStmt.setString(3, theProfiles.getUserMail());
            myStmt.setString(4, theProfiles.getPassword());
            myStmt.setString(5, theProfiles.getGender());
            myStmt.setDate(6, (Date) theProfiles.getBirthDate());
            myStmt.setString(7, theProfiles.getCountry());
 
            myStmt.executeUpdate();
 
        } finally {
 
            if (myConn != null) {
                myConn.close();
            }
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2016, 22:56
Ответы с готовыми решениями:

PreparedStatement
всем добрый день, есть код : package com.mysql; public class DaoAllSubjectsStudents implements...

PreparedStatement
Здравствуйте, необходимо сделать одно DAO, и в нём 2 PreparedStatement (для каждого из методов), один я создаю и использую, а второй не...

Синхронизация PreparedStatement
Вызываются разные статические процедуры одного класса которые используют одни и те же статические PreparedStatement. Можно ли...

20
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
27.05.2016, 23:09
Цитата Сообщение от PolkovnikJ Посмотреть сообщение
как это реализовать?
обычно исключение проходят до того как проходят работу с БД. Создайте свой класс исключение и выкидывайте его.
0
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
28.05.2016, 11:43  [ТС]
PreparedStatement как можно улучшить, чтобы был выигрыш?
0
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
30.05.2016, 00:00  [ТС]
в данный момент я не использую преимущества PreparedStatement, как это исправить?
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
30.05.2016, 08:24
Цитата Сообщение от PolkovnikJ Посмотреть сообщение
в данный момент я не использую преимущества PreparedStatement, как это исправить?
Наверное начать использовать, или не использовать вообще?

Один и тот же объект PreparedStatement может выполняться много раз, если нижестоящий драйвер или СУБД будут сохранять выражение (statement) в открытом состоянии даже после того как произойдет фиксация. Иначе не имеет смысла пытаться улучшить производительность заменой Statement на PreparedStatement.
http://www.javaportal.ru/java/... ement.html
0
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
30.05.2016, 10:43  [ТС]
как сделать так, чтобы запрос PreparedStatement был "закеширован"?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
30.05.2016, 17:49
PolkovnikJ, всё у вас нормально. PreparedStatement кэшируются всеми современными jdbc-драйверами.
Пара моментов, которые бросаются в глаза:
1. Используйте try-with-resource для того чтобы закрывать statement.
Java
1
2
3
try (PreparedStatement myStmt = connection.prepareStatement("...")) {
   //...
}
2. Какая сигнатура у метода theProfiles.getBirthDate? Очень странно видеть явный каст к Date в таком месте.
1
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
30.05.2016, 18:04  [ТС]
переписал вот так

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
import java.io.FileInputStream;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
 
public class ProfilesDAOTest {
 
 
    public ProfilesDAOTest() throws Exception{
        Connection con = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Properties prop = new Properties();
            prop.load(new FileInputStream("info.properties"));
            String user = prop.getProperty("user");
            String password = prop.getProperty("password");
            String dburl = prop.getProperty("dburl");
            con = DriverManager.getConnection(dburl, user, password);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    public void updateProfiles (HashMap<String,Integer> theProfiles) throws DAOException{
        PreparedStatement myStmt = null;
        Connection myConn = null;
        String sql = "UPDATE profiles SET user_name=?, nick_name=?, user_mail=?" +
                ", password=?, gender=?, country=?";
        try {
            myConn.setAutoCommit(false);
            myStmt = myConn.prepareStatement(sql);
 
 
            for (Map.Entry<String,Integer> e : theProfiles.entrySet()) {
 
                myStmt.setString(1, String.valueOf(e.getValue().intValue()));
                myStmt.setString(2, String.valueOf(e.getValue().intValue()));
                myStmt.setString(3, String.valueOf(e.getValue().intValue()));
                myStmt.setString(4, String.valueOf(e.getValue().intValue()));
                myStmt.setString(5, String.valueOf(e.getValue().intValue()));
                myStmt.setString(6, String.valueOf(e.getValue().intValue()));
                myStmt.executeUpdate();
                myConn.commit();
            }
 
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try{
                if (myConn != null) {
                myConn.close();
                }
                if (myStmt != null) {
                myStmt.close();
            }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}
просят кэшировать PreparedStatement, как это сделать?
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
31.05.2016, 13:25
Лучший ответ Сообщение было отмечено PolkovnikJ как решение

Решение

Цитата Сообщение от PolkovnikJ Посмотреть сообщение
переписал вот так
Стал какой-то ужас... Используйте try-with-resources вместо огромных try-catch-finnally
Цитата Сообщение от PolkovnikJ Посмотреть сообщение
просят кэшировать PreparedStatement
Вызвать myConn.prepareStatement(sql); один раз и запомнить PreparedStatement в поле, например.
1
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
31.05.2016, 13:58  [ТС]
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
import java.sql.*;
 
public class ProfilesDAO {
    Connection connection = null;
    ResultSet resultSet = null;
    PreparedStatement preparedStatement = null;
 
    private String dburl = "jdbc:mysql://localhost:3306/Profiles";
    private String user = "root";
    private String password = "password";
 
    public Connection getConnection() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            if (connection == null) {
                connection = DriverManager.getConnection(dburl, user, password);
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } return connection;
    }
 
    public void update(Profiles profiles) {
        String sql = "UPDATE profiles SET user_name=?, nick_name=?, user_mail=?, password=?;";
        try {
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, profiles.getUserName());
            preparedStatement.setString(2, profiles.getNickName());
            preparedStatement.setString(3, profiles.getUserMail());
            preparedStatement.setString(4, profiles.getPassword());
            preparedStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        closeConnection();
    }
 
    private void closeConnection() {
        try {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

как сделать так, чтобы preparedStatement инициализировался один раз, затем мог многократно быть использован без повторной инициализации, или проще говоря вот такая просьба ("Один раз открыть, много раз использовать, один раз закрыть"), на примере кода
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
31.05.2016, 15:23
Лучший ответ Сообщение было отмечено PolkovnikJ как решение

Решение

Вы читаете то, что Вам пишут?
Цитата Сообщение от PolkovnikJ Посмотреть сообщение
как сделать так, чтобы preparedStatement инициализировался один раз
Цитата Сообщение от turbanoff Посмотреть сообщение
Вызвать myConn.prepareStatement(sql); один раз и запомнить PreparedStatement в поле, например.
1
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
01.06.2016, 13:59  [ТС]
уже решил

Добавлено через 21 час 4 минуты
помогите пожалуйста с неисправностью программы, получаю NullPointerException в строке preparedStatement = connection.prepareStatement(sql); подозреваю проблема в соединении, в методе getConn, но не уверен.

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
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
 
 
public class ProfileDAOImpl implements ProfileDAO {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
 
        public Connection getConn() throws Exception{
            Properties properties = new Properties();
            try {
                properties.load(new FileInputStream("info.properties"));
                String user = properties.getProperty("user");
                String password = properties.getProperty("password");
                String dburl = properties.getProperty("dburl");
                String driver = properties.getProperty("driver");
                Class.forName(driver);
                if (connection == null) {
                    connection = DriverManager.getConnection(user, password, dburl);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            return connection;
        }
        private PreparedStatement getPreparedStatement(String sql) throws DAOException{
            if(preparedStatement == null) {
                try {
                    preparedStatement = connection.prepareStatement(sql);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            } return preparedStatement;
        }
        public void updateProfile(Profile profile) throws DAOException {
            String sql = "UPDATE profiles SET id=?, user_name=?," +
                    " nick_name=?, user_mail=?, password=?;";
            try {
                getPreparedStatement(sql);
                preparedStatement.setInt(1, profile.getId());
                preparedStatement.setString(2, profile.getUserName());
                preparedStatement.setString(3, profile.getNickName());
                preparedStatement.setString(4, profile.getUserMail());
                preparedStatement.setString(5, profile.getPassword());
                preparedStatement.executeUpdate();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    public void closeConnection() {
        try {
            if (preparedStatement != null) {
                preparedStatement.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            if (connection != null) {
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
Java
1
2
3
4
public interface ProfileDAO {
    public void updateProfile(Profile profile) throws DAOException;
    public void closeConnection();
}

Java
1
2
3
4
5
6
7
8
public class Main {
    public static void main(String[] args) throws DAOException {
        ProfileDAO profileDAO = new ProfileDAOImpl();
        Profile profile = new Profile(2,"Test","Nick","test@test","123q");
        profileDAO.updateProfile(profile);
        profileDAO.closeConnection();
    }
}
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
01.06.2016, 14:08
Цитата Сообщение от PolkovnikJ Посмотреть сообщение
подозреваю проблема в соединении, в методе getConn, но не уверен.
А Вы этот метод где то вызываете?
0
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
01.06.2016, 14:10  [ТС]
получается что нет, как правильно разрешить эту проблему?, если Вас не затруднит, покажите пожалуйста на примере кода
0
149 / 162 / 48
Регистрация: 19.10.2012
Сообщений: 530
01.06.2016, 14:11
Лучший ответ Сообщение было отмечено PolkovnikJ как решение

Решение

Цитата Сообщение от PolkovnikJ Посмотреть сообщение
как правильно разрешить эту проблему?
Вызвать его перед тем как использовать.
Как Вы хотите работать с базой, если вы не инициализировали коннекшен?
1
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
02.06.2016, 13:38  [ТС]
спасибо, не заметил этого

Добавлено через 21 час 59 минут
мне задали такой вот вопрос: "как именно метод getConn и другие методы выкидывают DAOExeption?"
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
02.06.2016, 14:10
Цитата Сообщение от PolkovnikJ Посмотреть сообщение
мне задали такой вот вопрос: "как именно метод getConn и другие методы выкидывают DAOExeption?"
а вы так отвечаете "А они вообще то ничего не выкидывают." да?
0
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
02.06.2016, 14:27  [ТС]
не задано поведение getConn так, чтобы выкидывать DAOE, как это правильно реализовать?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
02.06.2016, 16:24
PolkovnikJ, очевидно куда-то надо добавить throw new DAOException
куда сами подумайте
0
0 / 0 / 1
Регистрация: 11.05.2016
Сообщений: 31
03.06.2016, 12:50  [ТС]
"придумать" не получается, куда правильно эту строку помещать внутри метода?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.06.2016, 12:50
Помогаю со студенческими работами здесь

PreparedStatement не работатет
Доброе время суток. Код public Users getLoginAndPassword(String login) throws SQLException { PreparedStatement...

PreparedStatement + MySQL
Коллеги, привет! Столкнулся с такой проблемкой. Хочу с помощью PreparedStatement создать схему на MySQL, собственно использую такой...

JDBC: PreparedStatement
Возник вопрос: в каком месте я имею право ставить знак &quot;?&quot;? SELECT ? FROM some_table; SELECT * FROM some_table WHERE ? = 3; Нельзя ли...

Про Connection и PreparedStatement
Добрый день уважаемые форумчане... Имеется подключение к базе... private Connection connection; private PreparedStatement...

PostgreSQL autoincrement PreparedStatement
Коллеги кто нибудь работал с PostgreSQL? B MySQL всё просто задаешь колонке параметер AUTO_INCREMENT и всем хорошо в PostgreSQL всё...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru