Как обеспечить независимость базы данных в JDBC без использования Hibernate.?

0

Я пытаюсь решить эту проблему с помощью файла свойств, но в файле свойств мы можем обрабатывать только проблему с драйвером базы данных. Если я хочу переключить свою базу данных MySQL в Oracle, мне нужно изменить все мои запросы. Проблема в том, как сделать запрос независимым в JDBC?

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

public class DBIndependencyExample {
    public static void main(String[] args) {
        try {
            Properties pros = new Properties();
            InputStream fis = new FileInputStream(
                    "D:\\Programs\\Eclipse\\DBIndependecyByPropertiesFile\\src\\connectdb.properties");
            pros.load(fis);
            String Drivername = pros.getProperty("k1");
            //System.out.println(Drivername);
            String url = pros.getProperty("k2");
            String un = pros.getProperty("k3");
            String pw = pros.getProperty("k4");
            Class.forName(Drivername);
            Connection con = DriverManager.getConnection(url, un, pw);
            System.out.println("Driver Is Loaded With" + Drivername);
            System.out.println("Connection is Opened");
            Statement smt = con.createStatement();
            String sql = pros.getProperty("k5");
            //System.out.println(sql);
            ResultSet rs = smt.executeQuery(sql);
            while (rs.next()) {
                System.out.println("username is:" + rs.getString(1) + " password is:" + rs.getString(2));
            }
            con.close();
            System.out.println("Connection is closed");
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Файл свойств:

//Mysql Connectivity 
//Start Properties File Code
k1=com.mysql.jdbc.Driver
k2=jdbc:mysql://localhost:3306/practice
k3=root
k4=root
k5=select * from student

//Oracle  Connectivity

k1=oracle.jdbc.driver.OracleDriver
k2=jdbc:oracle:thin:@localhost:1521/orcla
k3=scott
k4=manish       
k5=select * from dept
  • 0
    select * from student и select * from dept должен работать как на Oracle и MySQL; у вас есть более сложные запросы, которые не работают с обеими RDBMS?
  • 0
    Есть некоторые конкретные запросы, основанные на mysql и oracle.suppose мое приложение основано на mysql db, и я хочу изменить свою db на любую другую db.в этом случае мне нужно изменить весь запрос, который мы применили в нашем приложении. то, что может принять любой запрос к базе данных в моем приложении. спасибо
Показать ещё 1 комментарий
Теги:
jdbc

3 ответа

1

Если я хочу переключить свою базу данных mysql в oracle, мне нужно изменить свой запрос.

Если ваши SQL-запросы полагаются только на ANSI SQL и никогда не связаны с проприетарными спецификациями (функция, ключевые слова и...), вы должны иметь возможность переключиться с СУБД на другую без каких-либо изменений в запросах.
Обратите внимание, что Hibernate не будет переводить для спецификаций СУБД на другой, например, перевести запрос в таблицу DUAL, написанную в Oracle, на способ MySQL.
Hibernate гарантирует, что ваши SQL-запросы будут переносимыми, в то время как вы не создадите собственные запросы, возможность по-прежнему предоставляется Hibernate.

Вот оригинальный проект SQL ANSI и здесь ссылка скачать последнюю версию информационной технологии - языки баз данных - SQL - Часть 1: Framework (SQL/Framework)

  • 0
    Сэр, есть любой другой способ, где я могу выполнить все запросы mysql и oracle.
  • 0
    @Manish Нет, чудесного пути нет, извини.
Показать ещё 2 комментария
0

Вы можете написать общий метод, который может обрабатывать любой SQL-запрос (независимо от используемой базы данных). Трюк здесь заключается в использовании метаданных базы данных для автоматического заполнения хэш-карты (хэш-карта удобна, потому что мы можем использовать имена столбцов в качестве ключей), содержащие результаты запроса. Для параметризованных запросов вам понадобится более сложный метод, который можно найти по ссылке, приведенной ниже (DBSelect.getRecordsForCustomQuery). Если все ваши запросы, предназначенные для разных баз данных, одинаковы, тогда вам даже не нужно использовать метаданные, просто перекодируйте имена столбцов.

public Map<String, Object> getQueryResults(String query, Connection conn){

    ResultSet rs=null; 
    PreparedStatement stmt=null; 
    Map<String, Object> objMap = new HashMap<>();

    stmt = conn.prepareStatement(sqlQuery); 
    rs = stmt.executeQuery();
    while(rs.next()){
    for (int i=1;i<=rs.getMetaData().getColumnCount();i++) { 
                objMap.put( rs.getMetaData().getColumnName(i), rs.getObject(i)); 
    }
 }
    return mapObj;

}

Вы можете, конечно, изменить этот метод в соответствии с вашими потребностями.

Несколько более сложное решение, использующее отражение и дженерики, можно найти здесь (https://github.com/IvanGH2/EasyORM), но вам даже не нужно использовать все это.

0

Я не думаю, что если вы переключитесь на спящий режим или на рамки orm. В случае спящего режима вы можете использовать hql для записи запросов таким образом, что вы независимы от базы данных, независимо от того, какая база данных вы переключите спящий режим. Вы даже можете посмотреть Spring CrudRepository. Я очень сомневаюсь, что вы можете выполнять независимые запросы к базе данных только с JDBC. Хорошо начинать с JDBC в долгосрочной перспективе, вы должны рассмотреть рамки orm.

  • 1
    Уважаемый сэр, я знаю, что мы можем достичь зависимости от базы данных с помощью hibernate ORM, но мое требование - я хочу сделать независимость от базы данных с помощью JDBC.
  • 0
    Если нет стороннего API, то вы должны написать свою реализацию для преобразования запросов, основанных на изменении файла свойств, перед выполнением вашего Statement.executeQuery вы можете изменить свой запрос в соответствии с вашей базой данных. Если это только для метода, это хорошо, но вы хотите сделать для всего приложения, предложите вашей команде перейти к orm. Это одна из главных причин, почему они ввели orm.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню