Задать вопрос
Профиль пользователя заблокирован сроком с 24 марта 2024 г. и навсегда по причине: систематические нарушения пункта 5.2 правил сервиса
Ответы пользователя по тегу MySQL
  • Ошибка Mysql query error: (1062) Duplicate entry 'iblock-seometa_99_4062_063_99_1' for key 'UX_B_SEARCH_CONTENT' при переиндексации?

    @My1Name
    Duplicate entry 'iblock-seometa_99_4062_063_99_1'

    Поле помечено как PRIMARY KEY или UNIQUE KEY. Посмотрите как вы создаёте таблицу... Эти ключи запрещают дубликаты. Используйте просто INDEX или вспомогательную таблицу если данные могут быть одинаковы.
    Ответ написан
  • Как при удачной авторизации изменить кнопку Log In на кнопку Log Out и скрыть кнопку от обычных пользователей?

    @My1Name
    Вам нужен CustomAuthenticationProvider, а не CustomUserDetails. Там делегируются права (role) пользователям при аутентификации.

    Вот это вот лишнее:
    @PostMapping("/process_register")
        public String processRegister(User user) {
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
            String encodedPassword = passwordEncoder.encode(user.getPassword());
            user.setPassword(encodedPassword);
            user.setRole("USER");
            userRepo.save(user);
            return "register_success";
        }

    Возможно имеет смысл в экспериментальных (в учебных) целях, но на практике это лишнее... PasswordEncoder достаточно добавить 1 раз через RegisterGlobalAuthentication в классе WebSecurityConfig; а также добавив соответствующий бин:
    @Bean
    public PasswordEncoder pass(){
    return new BCryptPasswordEncoder();
    }

    После регистрации, если она прошла успешно, обычно делается autoLogin через SecurityContextHolder и return "redirect:/index";

    Если вы хотите шифровать данные в БД, то имеет смысл вынести BCryptPasswordEncoder() в глобальную переменную (в final поле) на уровне класса - контроллера.

    Смысл PasswordEncoder() в Spring Security заключается в том, что на время сессии создаётся "хэш-отпечаток" (цифровая подпись) кроме прочей информации в памяти... Его в принципе невозможно декодировать не зная реальный пароль и правила преобразования. Поэтому без него Spring Security и не работает.

    Вот старая модель CHA-1 кодирования в соответствии со спецификацией Oracle к PasswordEncoder. А BCryptPasswordEncoder использует более новые и более продуманные алгоритмы.
    Ответ написан
    Комментировать
  • Как составить оптимизированный SQL-запрос для поиска по нескольким таблицам?

    @My1Name
    Приведённый в пример запрос, очень похож на структуру хранения данных Lucene Core


    Такой запрос оптимален или есть варианты получше?

    Полнотекстовый поиск с ElasticSearch, наверно будет более оптимальным решением.
    Ответ написан
    Комментировать
  • В каком виде хранить данные для графиков?

    @My1Name
    Если это сбор данных в течение года, то такую информацию нужно хранить в файле/ах, делая (каждый час/день/неделю/месяц) дозапись. Для удобства, можно присваивать соответствующие имена в виде дат (и времени). Например: 01-01-2023.txt 01-02-2023.txt и т.д. А при построении графиков, просто парсить эти файлы.

    Суть вопроса, узнать на сколько это практично

    Если я правильно понял суть вопроса, то обычно такую информацию пишут и хранят в Excel.
    Ответ написан
    Комментировать
  • Как сделать INSERT в две таблицы в одном запросе?

    @My1Name Автор вопроса
    Как сделать INSERT в две таблицы в одном запросе?

    Использовать batchUpdate. Например так:
    jdbcTemplate.batchUpdate(new String [] {
    "DELETE FROM statusChat WHERE id IN("+id1+", "+id2+") LIMIT 2",
    "DELETE FROM invites WHERE id="+id1+" AND idInviter="+id2
    });

    Для более сложных запросов с неизвестным количеством параметров, можно использовать BatchPreparedStatementSetter. Например:
    ArrayList <Long> listID;
    		String SQL = "DELETE FROM statusChat WHERE id IN(?";
    		for(int i=0; i<(listID.size()-1; i++)
    			SQL = SQL+",?"; SQL=SQL+")";
    		jdbcTemplate.batchUpdate(SQL, new BatchPreparedStatementSetter() {
    			@Override
    			public void setValues(PreparedStatement ps, int i) throws SQLException {
    				i=1;
    				for (int x=0; x<listID.size(); x++, i++) {
    					long id = listID.get(x);
    					ps.setLong(i, id));
    				}
    			}
    Ответ написан
    Комментировать
  • Как правильно создать БД в одном execute?

    @My1Name Автор вопроса
    Скачиваем JDBC драйвер и добавляем в проект через Build Puth. Тренируемся создавать запросы и проверяем:
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.Statement;
    
    public class Main {
    	public static void main(String[] args) {
    		String command = "C:\\ путь к файлу .exe для запуска MySQL сервера с приложения \\MySQL Server 8.0\\bin\\mysqld.exe";
    		try{
    	   Runtime.getRuntime().exec(command); //run MySql
                String url = "jdbc:mysql://localhost/";
                String username = "root";
                String password = "byDefault";
                Class.forName("com.mysql.cj.jdbc.Driver").getDeclaredConstructor().newInstance();
                try (Connection conn = DriverManager.getConnection(url, username, password)){
                	 Statement statement = conn.createStatement();
                	 statement.execute("CREATE DATABASE IF NOT EXISTS usersdb");
                	 statement.execute("USE usersdb");
                	 statement.execute("CREATE TABLE IF NOT EXISTS users"+
                	    		"(id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,"+
                	    		"email VARCHAR(256) NOT NULL,"+
                	    		"password VARCHAR(128),"+
                	    		"UNIQUE KEY(email));");
                		}
            }
    		catch(Exception e){
                e.printStackTrace();
            }
    }

    Всё работает. Зашивать JDBC коннектор в проект, запускать или создавать базу данных с приложения, решать только разработчику. https://www.mysqltutorial.org/mysql-unique/
    Ответ написан