Java 如何在JDBC中提供数据库独立性而不使用Hibernate。?

Java 如何在JDBC中提供数据库独立性而不使用Hibernate。?,java,mysql,jdbc,Java,Mysql,Jdbc,我试图借助属性文件来解决这个问题,但在属性文件中,我们只能处理数据库驱动程序问题。如果我想将MySQL切换到Oracle数据库,我需要更改我的all查询。问题是如何在JDBC中使查询独立 import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import jav

我试图借助属性文件来解决这个问题,但在属性文件中,我们只能处理数据库驱动程序问题。如果我想将MySQL切换到Oracle数据库,我需要更改我的all查询。问题是如何在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,而从不依赖专有的Specifites函数、关键字和。。。您应该能够在不改变查询的情况下从一个DBMS切换到另一个DBMS。 请注意,Hibernate不会将一个DBMS规范转换为另一个DBMS规范,例如,将在Oracle中编写的双表上的查询转换为MySQL方式。 Hibernate确保您的SQL查询在不创建本机查询时是可移植的,Hibernate仍然提供了这种可能性


是最新版本的信息技术-数据库语言-SQL-第1部分:框架SQL/Framework的原始SQL ANSI草稿和下载链接。如果您切换到hibernate或任何orm框架,我不这么认为。在使用hibernate的情况下,您可以使用hql编写查询,无论切换到哪个数据库,hibernate都是独立于数据库的。你甚至可以看看春天的积垢。我非常怀疑仅仅使用JDBC就可以实现独立于数据库的查询。从JDBC开始很长一段时间是很好的,你应该考虑ORM框架。

< P>你可以编写一个泛型的方法,不管使用的数据库是什么,都可以处理任何SQL查询。这里的技巧是使用数据库元数据自动 填充哈希映射哈希映射很方便,因为我们可以使用列名作为包含查询结果的键。对于参数化查询,您需要一个更复杂的方法,可以在DBSelect.getrecordsforcstomquery下面提供的链接中找到。如果所有针对不同数据库的查询都是相同的,那么您甚至不必使用元数据,只需对列名进行硬编码即可

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;

}
当然,您可以修改此方法以满足您的需要

这里可以找到一个使用反射和泛型的稍微复杂一点的解决方案,但您没有
甚至不得不使用所有这些

先生,我还有其他方法可以执行mysql和oracle的所有查询。@Manish这不是一个奇迹,对不起。感谢您宝贵的时间。问题是:来自金灯岁月普通mysql程序员的普通mysql代码是完全不可移植的。SQL查询必须严格遵守SQL ANSIDear先生,我知道我们可以在hibernate ORM工具的帮助下实现依赖数据库,但我的要求是我想在JDBC的帮助下实现依赖数据库。如果没有第三方api,那么在执行语句之前,您必须编写实现以根据属性文件更改转换查询。executeQuery您可以根据数据库更改查询。如果这只是一种方法,那也没关系,但如果你想对整个应用程序这样做,建议你的团队转向orm。这是他们引入orm的主要原因之一。从学生处选择*和从部门处选择*应该可以在Oracle和MySQL上工作;你有更复杂的查询不能同时使用RDBMS吗?有一些基于mysql和oracle的特定查询。假设我的应用程序基于mysql数据库,我想将我的数据库更改为任何其他数据库。在这种情况下,我必须更改应用程序中应用的整个查询。我需要一些可以在我的数据库中接受任何数据库查询的东西thanksI不认为存在一个实用程序可以自动将专有语法从一个供应商转换到另一个供应商。正如其他人所指出的,您要么需要坚持ANSI SQL语法,要么需要对不同的数据库进行单独的查询。