мы можем создать общий класс базы данных в Java - PullRequest
2 голосов
/ 17 августа 2011

Я хочу знать, можем ли мы создать общий класс базы данных так же, как мы создаем класс соединения и просто вызываем getConnection, когда нам нужно установить соединение.
По сути, мне нужен класс менеджера баз данных, который может обрабатывать операции с базой данных независимо от имени таблицы, столбца и т. Д.
имя таблицы, имя столбца, значения для вставки будут передаваться как параметры из сервлета. таким образом, я могу уменьшить дублирование кода. Я пытаюсь сделать простое приложение mvc, используя jsp-сервлеты. моя база данных MySQL я не знаю распорки, весна, спячка.

Например, код сервлета будет вызывать (databaseManager - это имя класса.):

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

и в databaseManager будет функция -

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

аналогично для других функций. Я погуглил и обнаружил, что это можно сделать с помощью метаданных. но я не знаю, как его использовать. было бы полезно, если бы вы могли опубликовать код одной функции для аналогичного подхода.

Ответы [ 2 ]

3 голосов
/ 17 августа 2011

Проверка Компонент DbUtils Apache Commons. Также есть примеры .

1 голос
/ 17 августа 2011

Да, конечно, вы можете. Я сделал нечто подобное (но не то же самое), и может быть много подходов. Я думаю, что вы должны Google больше, я уверен, что есть много приложений с открытым исходным кодом для управления базами данных / клиентов баз данных. Постарайтесь найти там вдохновение.

Хорошо, вот код для вдохновения. Это не совсем общее, или то, что вы ищете, но я думаю, это может привести вас куда-то. Если нет, бросьте камень. : -)

Класс провайдера базы данных:

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");

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...