我们可以在java中创建一个通用的数据库类

时间:2011-08-17 12:10:07

标签: java mysql jdbc

我想知道我们是否可以像创建连接类一样创建一个公共数据库类,并在需要建立连接时调用getConnection。
基本上,我想要一个数据库管理器类,它可以处理数据库操作,而不管tablename,columncount等 tablename,columnname,要插入的值将作为servlet中的参数传递。 这样,我可以减少重复的代码。我尝试使用jsp-servlets创建一个简单的mvc应用程序。我的数据库是mysql。我不知道struts,spring,hibernate。

例如,servlet代码将调用(databaseManager是类名。):

int count=databaseManager.getCount("tableName", "columnName", "value");

并在databaseManager中,会有一个函数 -

public static int getCount(String tableName, String[] arrC, objectArray[] arrV)
{}

同样,对于其他功能。 我用Google搜索并发现可以使用元数据完成。 但我不知道如何使用它。 如果你可以为类似的方法发布一个函数的代码,将会很有帮助。

2 个答案:

答案 0 :(得分:3)

检查Apache Commons的DbUtils component。还有examples provided

答案 1 :(得分:1)

是的,确定你可以。我做了类似的事情(但不一样),可以有很多方法。我认为你应该谷歌更多,我敢肯定,有很多数据库管理/数据库客户端的开源应用程序。试着在那里获得灵感。

好的,这是一些灵感的代码。它不是完全通用的,或者你在寻找什么,但我认为,这可能会带你到某个地方。如果没有,扔石头。 : - )

数据库提供程序类:

import java.lang.reflect.Constructor;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.DynaProperty;

public class DatabaseProvider<T extends DatabaseObject> {
    private static DatabaseProvider databaseProvider;

    private static String connectionString = "";
    private static String password = "";
    private static String username = "";

    private static boolean initialized = true;

    public DatabaseProvider(){ }



    public static void initDatabaseProvider() {
        try {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        }
        catch(SQLException e){
            initialized = false;
            e.printStackTrace();
        }

        connectionString = "XXX";
        username = "XXX";
        password = "XXX";
    }

    public List<T> performSimpleSelectQuery(String table, String columns, String where, Class targetObj) throws SQLException {
        if(!initialized) return null;
        List<T> results = new ArrayList<T>();
        Constructor ct;
        DatabaseObject dbo;
        try {
            ct = targetObj.getConstructor(null);
            dbo = (DatabaseObject)ct.newInstance(null);
        }
        catch(Exception e){
            e.printStackTrace();
            return null;
        }

        String[] cols = columns.split(",");
        String[] properties = new String[cols.length];
        for(int i = 0; i < cols.length; i++){
            cols[i] = cols[i].trim();
            properties[i] = dbo.getMappingFromColumnName(cols[i]);
        }
        Connection conn = DriverManager.getConnection(connectionString, username, password);
        PreparedStatement pst = conn.prepareStatement("SELECT " + columns + " FROM " + table + (where.equals("") ? "" : " WHERE " + where));
        pst.execute();
        ResultSet rs = pst.getResultSet();
        while(rs.next()){
            try {
                dbo = (DatabaseObject)ct.newInstance(null);
                for(int i = 0; i < cols.length; i++){
                    BeanUtils.setProperty(dbo, properties[i], rs.getObject(cols[i]));
                }
                results.add((T)dbo);
            }
            catch(Exception e){
                e.printStackTrace();
                rs.close();
                pst.close();
                conn.close();
                return null;
            }
        }
        rs.close();
        pst.close();
        conn.close();
        return results;

    }

    public int performInsert(String columns, String values, String table) throws SQLException {
        String sqlInsert = "INSERT INTO " + table + " (" + columns + ") VALUES (" + values + ")"; 
        Connection conn = DriverManager.getConnection(connectionString, username, password);
        PreparedStatement pst = conn.prepareStatement(sqlInsert);
        int toReturn = 0;
        try {
            toReturn = pst.executeUpdate();
        }
        catch(Exception e){
            e.printStackTrace();
            pst.close();
            conn.close();
            return toReturn;
        }
        pst.close();
        conn.close();
        return toReturn;
    }

}

数据库对象类:

import java.util.HashMap;
public abstract class DatabaseObject {
    protected HashMap<String, String> dbToBeanMapping = new HashMap<String, String>();

    public DatabaseObject() {
        initialize();
    }

    protected abstract void initialize();

    public String getMappingFromColumnName(String columnName) {
        return dbToBeanMapping.get(columnName);
    }
}

示例类:

public class CounterParty extends DatabaseObject {
    private String name;

    private int instrument;
    private int partyId;

    public int getPartyId() {
        return partyId;
    }

    public void setPartyId(int partyId) {
        this.partyId = partyId;
    }


    public CounterParty(){}

    public int getInstrument() {
        return instrument;
    }

    public void setInstrument(int instrument) {
        this.instrument = instrument;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    protected void initialize() {
        this.dbToBeanMapping.put("company_name", "name");
        this.dbToBeanMapping.put("party_id", "partyId");
        this.dbToBeanMapping.put("inst_id", "instrument");

    }

}