Я пытаюсь решить эту проблему с помощью файла свойств, но в файле свойств мы можем обрабатывать только проблему с драйвером базы данных. Если я хочу переключить свою базу данных 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
Если я хочу переключить свою базу данных mysql в oracle, мне нужно изменить свой запрос.
Если ваши SQL-запросы полагаются только на ANSI SQL и никогда не связаны с проприетарными спецификациями (функция, ключевые слова и...), вы должны иметь возможность переключиться с СУБД на другую без каких-либо изменений в запросах.
Обратите внимание, что Hibernate не будет переводить для спецификаций СУБД на другой, например, перевести запрос в таблицу DUAL, написанную в Oracle, на способ MySQL.
Hibernate гарантирует, что ваши SQL-запросы будут переносимыми, в то время как вы не создадите собственные запросы, возможность по-прежнему предоставляется Hibernate.
Вот оригинальный проект SQL ANSI и здесь ссылка скачать последнюю версию информационной технологии - языки баз данных - SQL - Часть 1: Framework (SQL/Framework)
Вы можете написать общий метод, который может обрабатывать любой 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), но вам даже не нужно использовать все это.
Я не думаю, что если вы переключитесь на спящий режим или на рамки orm. В случае спящего режима вы можете использовать hql для записи запросов таким образом, что вы независимы от базы данных, независимо от того, какая база данных вы переключите спящий режим. Вы даже можете посмотреть Spring CrudRepository. Я очень сомневаюсь, что вы можете выполнять независимые запросы к базе данных только с JDBC. Хорошо начинать с JDBC в долгосрочной перспективе, вы должны рассмотреть рамки orm.
select * from student
иselect * from dept
должен работать как на Oracle и MySQL; у вас есть более сложные запросы, которые не работают с обеими RDBMS?