Как выполнить 7 подготовленных операторов select за один go в mysql? - PullRequest
0 голосов
/ 16 июня 2020
private void view(HttpServletRequest request , HttpServletResponse response) throws ServletException, IOException{

        String logined_email = (String) session.getAttribute("e-mail");
        data = dbconn.viewMyData(logined_email);
        request.setAttribute("mydata", data);
        RequestDispatcher rd = request.getRequestDispatcher("myData.jsp");
        rd.forward(request, response);
}
public void dbconn() {

        try {
            String JDBC_Driver = "com.mysql.cj.jdbc.Driver";
            Class.forName(JDBC_Driver);
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/connectiondb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "");
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }

public void viewMyData(String login_email_addr){

    dbconn();
    String sql1 = "SELECT * From art_culture WHERE email = ? ";
    String sql2 = "SELECT * From education WHERE email =  ? ";
    String sql3 = "SELECT * From fashion_beauty WHERE email = ? ";
    String sql4 = "SELECT * From food_travel WHERE email = ? "; 
    String sql5 = "SELECT * From health_fitness WHERE email = ? ";
    String sql6 = "SELECT * From literature WHERE email = ? ";
    String sql7 = "SELECT * From nature_wildlife WHERE email = ? ";

}

Значение email в условии одинаково для всех запросов. view метод находится в сервлете , который ведет себя как контроллер . viewMyData и dbconn - это методы в файле dbConnection . У меня есть эти 7 sql подготовленных операторов в методе viewMyData, и я хочу их выполнить, и я хочу получить данные из базы данных после успешного выполнения запросов, и результат будет отправлен на страницу сервлета, а затем из сервлета будет отображаться вывод на странице JSP. Как это сделать?

Ответы [ 4 ]

0 голосов
/ 16 июня 2020

Несколько проблем я вижу в вашем вопросе. Ваш код далек от того, что вы планируете делать, и есть много пробелов, которые необходимо заполнить (даже ошибки компиляции). Когда вы обращаетесь за помощью на форум, постарайтесь сформулировать свой вопрос.

Несколько предложений

  1. Создание подключения к базе данных при каждом вызове API не является хорошей практикой. Поскольку это дорогостоящая операция. Вы можете использовать какой-то механизм пула соединений. Есть библиотеки, которые сделают это за вас. См. Этот пост для получения дополнительной информации https://www.baeldung.com/java-connection-pooling.

  2. Использование объединенных данных из 7 таблиц также может вызвать проблемы с производительностью, если эти таблицы станут больше. Вы должны подумать о лучшем дизайне, если вам нужно, чтобы они работали быстро в долгосрочной перспективе. Вы также можете добавить в эти таблицы правильные первичные ключи и индексы и оптимизировать запрос sql, чтобы сделать его быстрым.

  3. Используйте некоторый файл .properties для хранения учетных данных базы данных.

Здесь я использовал inner join, чтобы присоединиться к вашим 7 столам.

Обратите внимание, что приведенный ниже код не является полным, поскольку я не могу написать полный код, когда ваш код неполный. Надеюсь, этого будет достаточно, чтобы вы составили представление.

    public Connection dbconn() // modified to return connection
    {
        Connection conn = null;
        try
        {
            String JDBC_Driver = "com.mysql.cj.jdbc.Driver";
            Class.forName( JDBC_Driver );
            conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/connectiondb?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC", "root", "" );
        }
        catch( Exception ex )
        {
            System.out.println( ex );
        }
        return conn;
    }

    public void viewMyData( String login_email_addr )
    {

        String sql = "SELECT * From art_culture ac\n" +
                "inner join education ed on ac.email =  ed.email\n" +
                "inner join fashion_beauty fb on fb.email = ac.email\n" +
                "inner join food_travel ft on ft.email = ac.email\n" +
                "inner join health_fitness hf on hf.email = ac.email\n" +
                "inner join literature lt on lt.email = ac.email\n" +
                "inner join nature_wildlife nw on nw.email = ac.email where ac.email = ? ;";
        try (Connection con = dbconn();
             PreparedStatement ps = con.prepareStatement( sql )) // try with resources will close db resources automatically
        {
            ps.setString( 1, login_email_addr );

            try (ResultSet rs = ps.executeQuery())
            {
                while(rs.next()){
                  // get your data here
                }

            }

        }
        catch( SQLException e )
        {
            e.printStackTrace();
        }

    }

Вы должны прочитать данные, заполнить свой объект данных и вернуть его из этого метода.

Надеюсь, это поможет.

0 голосов
/ 16 июня 2020

Вы можете попробовать:

  1. Через настройку свойства подключения к базе данных, чтобы разрешить несколько запросов (allowMultiQueries = true), разделенных точкой с запятой по умолчанию.

Отформатируйте запрос на подключение, как показано ниже:

String dbUrl = "jdbc:mysql:///test?allowMultiQueries=true";
Через вызов хранимой процедуры, которая неявно возвращает курсоры.
0 голосов
/ 16 июня 2020

Вы можете комбинировать ваши запросы следующим образом:

"SELECT * From art_culture,education, ..., nature_wildlife where email = ?".

с этим вы получите только 1 объект набора результатов. Замените многоточие на список всех ваших таблиц, разделенных запятыми.

0 голосов
/ 16 июня 2020
connection.setAutoCommit(false)

деактивирует автоматическую фиксацию, которая позволяет вам отправить пакет всех этих подготовленных заявлений, затем просто создайте метод, который выполняет все эти запросы к базе данных, и в блоке finally установите для autocommit значение true.

Autocommit по умолчанию делает так, что все транзакции мгновенно сохраняются в базе данных, с таким поведением вы можете безопасно запускать все эти запросы как один-единственный atomi c unit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...