自己要写一个对数据库操作封装的模块,对外界提供接口。由于使用的数据库
不一样,可能是oracle,db2,sql server。如何屏蔽数据库的差异,提供一个固定
的接口。hibernate有方言可以屏蔽数据库的不同,但我们公司不用hibernate。
高手解答。

解决方案 »

  1.   

    写配置文件来保存驱动类名/连接字符串/用户名/密码。
    操作类的不要涉及到特定的数据库的类的使用。比如Oracle的STRUCT等等。
    参考:
    <?xml version="1.0" encoding="UTF-8" ?>
    <global>
    <category code="cartoon1" type="db">
    <param name="eid" value="CARTOON"/>
    <param name="expire" value="60000"/>
    <param name="driver" value="oracle.jdbc.driver.OracleDriver"/>
    <param name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/>
    <param name="uname" value="cartoon"/>
    <param name="pass" value="oracle"/>
    <param name="sharemin" value="1"/>
    <param name="sharemax" value="2"/>
    <param name="standardmin" value="1"/>
    <param name="standardmax" value="2"/>
    <param name="stmax" value="10"/>
    <param name="psmax" value="10"/>
    <param name="csmax" value="10"/>
    </category>
            <category code="cartoon2" type="db">
    <param name="eid" value="CARTOON"/>
    <param name="expire" value="60000"/>
    <param name="driver" value="oracle.jdbc.driver.OracleDriver"/>
    <param name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"/>
    <param name="uname" value="cartoon"/>
    <param name="pass" value="oracle"/>
    <param name="sharemin" value="1"/>
    <param name="sharemax" value="2"/>
    <param name="standardmin" value="1"/>
    <param name="standardmax" value="2"/>
    <param name="stmax" value="10"/>
    <param name="psmax" value="10"/>
    <param name="csmax" value="10"/>
    </category>
    </global>再加一个 category就可以再配一个数据库连接,分别有自己的连接池管理。
      

  2.   

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;public class DBCon {
    public static String driver="oracle.jdbc.driver.OracleDriver";
    public static String url="jdbc:oracle:thin:@192.168.0.174:1521:ORCL";
    public static String user="scott";
    public static String pwd="tiger";

    public static Connection getConnection(){
    try {
    Class.forName(driver);
    Connection con=DriverManager.getConnection(url, user, pwd);
    System.out.println("con success");
    return con;
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;
    }

    public static void close(Connection con,Statement stm,ResultSet rs){
    if(con!=null){
    try {
    con.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    if(stm!=null){
    try {
    stm.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    if(rs!=null){
    try {
    rs.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    }

    public static void main(String[] args) {
    DBCon.getConnection();
    }
    }
      

  3.   

    我能想到的:
    1.将数据库连接设置的参数由硬编码改为配置文件/资源文件(大家通常已经这么做了)
    2.把一些常见sql操作封成不同的接口,有不同的实现类,以区别sql上的差异,比如某个接口专门提供按下标取数据的服务,那么他的Mysql实现类就可以在内部写成limit x,y,sqlserver的实现类就可以写成top...等
      

  4.   

    理论上楼主的模块只要是面向Java对象设计而不是面向数据库设计时,都可以应用在不同的数据库间迁移,大不了像Hibernate一样加一层中间偶合层。
    好好研究JDBC底层代码。有成果时拿出来给大家分享!
      

  5.   

    sql数据库查询语句,针对每类不同的数据库,每个接口都要写一套不同的啦?
    有没有提高重用的方法呢?