2

我的情况是,我必须在一个应用程序中支持多个数据库,而不使用任何 ORM,只使用核心 jdbc 连接。该情况在下文中详细描述。

我们有我们特定产品的 mysql 的遗留代码并且它是稳定的,现在对于新的客户需求,我们必须给他们对 MSSQL 的支持,我们建议我们的 CTO 使用任何 ORM 来做到这一点,但不幸的是他否认了,有很多mysql 遗留函数已在那里使用,他对在 ORM 中执行此操作不感兴趣,因为他是 MSSQL 专家,他说他将能够转换在 MYSQL 上编写的所有查询现在问题是什么是更好的方法来制作应用程序可管理、可持续并以这种方式创建,以便能够支持许多数据库处理能力。

我们正在考虑,也需要你的建议。

4

3 回答 3

0

他对 ORM 不感兴趣,因为他是 MSSQL 专家,他说他将能够转换所有用 MYSQL 编写的查询

这是否意味着每当他以外的其他人在 sql server 和 mysql 之间来回出现问题时,这就是他们不是专家的问题?听起来不好玩。

无论如何,您需要以某种方式验证和测试您生成的 sql 查询,以便它们适用于两个 rdbms,并且不会产生任何意外的副作用(尝试在 mssql 中插入 1753-01-01 之前的日期,然后尝试例如在 mysql 中)

祝你们好运。

于 2013-11-13T05:19:46.713 回答
0

使用 MyBatis 可以简化您的任务。如果您使用的是 Spring,则可以查看 Spring JDBC Templates。这两种方法都使您能够在 DB 类型之间切换,同时让您编写本机 SQL。我认为使用 MyBatis 会更简单。

于 2013-11-13T06:32:41.643 回答
0
Thank you all to give me yours suggestion. I also tried my self with core java solution and want to share.

1. Creating connection object first :
public abstract class ConnectionFactory {
    final static Connection getConnection() {
        Connection conn = null;
        DBVendor dbVendor = DBVendor.fromName(Config.MSSQL);

        switch (dbVendor) {
        case MSSQL:
            conn = new MSSQLConnection().getConnection();
            break;

        default:
            conn = new MYSQLConnection().getConnection();
            break;
        }

        return conn;
    }

}

2. Create factory class for the creation of query object and use this query object to appropriate class:


public abstract class QueryFactory {

    public static Query getQuery() {
        DBVendor dbVendor = DBVendor.fromName(Config.MSSQL);
        Query query = null;
        switch (dbVendor) {
        case MSSQL:
            query = new MSSQLQuery();
            break;
                         .
                         .
                         .
        default:
            query = new MYSQLQuer();
            break;
        }
        return query;
    }

}

All query will be separately implemented .

3. Use of query object

public class InfoDao {


    private static Query query = null;

    static {
        synchronized (query) {
            query = QueryFactory.getQuery();    
        }

    }

    public EmployeeInfo getEployeeInfo( int empId) {
        EmployeeInfo employeeInfo = null;
        try {
            DBHandler dbh = DBConnection.newConnection();
            ResultSet rs = dbh.select(query.getInfoSql(empId));

            if(rs.next()) {
                employeeInfo = new EmployeeInfo();

                employeeInfo.setFirstName(rs.getString("FIRST_NAME"));
                employeeInfo.setEmployeeType(rs.getString("EMP_TYPE"));
            }
        } catch(Exception ex) {

        }

        return employeeInfo;

    }
}

Still need better solution. 
于 2013-11-22T15:12:31.343 回答