1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/selfly-sonsure-dumper

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
persist-executor-hibernate.md 6.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 13:43 e04b5c0

Реализация персистентности: PersistExecutor

Интерфейс

Для выполнения конечных операций персистентности используется интерфейс PersistExecutor. Чтобы реализовать различные способы взаимодействия с базой данных, достаточно реализовать разные варианты PersistExecutor.

Интерфейс PersistExecutor очень прост и содержит всего два метода:

public interface PersistExecutor {

    /**
     * Получение диалекта базы данных
     *
     * @return
     */
    String getDialect();

    /**
     * Выполнение команды
     *
     * @param commandContext
     * @param commandType
     * @return
     */
    Object execute(CommandContext commandContext, CommandType commandType);
}

Метод getDialect получает диалект базы данных. Определённая реализация может быть фиксированной или статической конфигурацией, и здесь мы не будем вдаваться в подробности.

execute — это ключевой метод для взаимодействия. Все операции SQL выполняются через него.

Конечно, при выполнении необходимо различать операции CRUD. Абстрактный класс AbstractPersistExecutor расширяет метод execute, используя CommandType для различения:

public abstract class AbstractPersistExecutor implements PersistExecutor {

    //......

    @Override
    public Object execute(CommandContext commandContext, CommandType commandType) {
        switch (commandType) {
            case INSERT:
                return this.insert(commandContext);
            case QUERY_FOR_LIST:
                return this.queryForList(commandContext);
            case QUERY_SINGLE_RESULT:
                return this.querySingleResult(commandContext);
            case QUERY_FOR_MAP:
                return this.queryForMap(commandContext);
            case QUERY_FOR_MAP_LIST:
                return this.queryForMapList(commandContext);
            case QUERY_ONE_COL:
                return this.queryOneCol(commandContext);
            case QUERY_ONE_COL_LIST:
                return this.queryOneColList(commandContext);
            case UPDATE:
                return this.update(commandContext);
            case DELETE:
                return this.delete(commandContext);
            case EXECUTE:
                return this.doExecute(commandContext);
            default:
                throw new SonsureJdbcException("Неподдерживаемый CommandType:" + commandType);
        }
    }
    //.......
}

Почему бы не разделить интерфейс execute? Учитывая удобство расширения в будущем, например, унифицированный вывод SQL и добавление перехватчиков, было решено сохранить единственный вход.

После просмотра кода, вероятно, нет необходимости в дополнительных объяснениях. Теперь вы знаете, как расширить PersistExecutor.

По умолчанию предоставляется реализация Spring Jdbc под названием JdbcTemplatePersistExecutor (в предыдущих версиях также была реализация DBUtils, но она использовалась слишком редко). Вы можете ознакомиться с исходным кодом для получения дополнительной информации.

Пример реализации Hibernate

Это лишь пример, который призван показать, как можно расширить этот компонент.

Не рекомендуется использовать реализацию Hibernate. Если Hibernate используется таким образом в реальной ситуации, то, помимо вопроса о правильности подхода, могут возникнуть подозрения в «непристойном поведении».

Ниже приведён псевдокод для реализации интерфейса PersistExecutor с использованием Hibernate, который демонстрирует только функцию запроса списка. Если вы хотите использовать hql вместо nativeQuery, вы можете переопределить CommandContextBuilder:

public class HibernatePersistExecutor extends AbstractPersistExecutor {

    private SessionFactory sessionFactory;

    @Override
    protected String doGetDialect() {
        Session session = sessionFactory.openSession();
        String dialect = session.doReturningWork(new ReturningWork<String>() {
            @Override
            public String execute(Connection connection) throws SQLException {
                return connection.getMetaData().getDatabaseProductName().toLowerCase();
            }
        });
        session.close();
        return dialect;
    }

    @Override
    public List<?> queryForList(CommandContext commandContext) {
        Session session = sessionFactory.openSession();
        NativeQuery<?> nativeQuery = session.createNativeQuery(commandContext.getCommand(), commandContext.getResultType());
        List<Object> parameters = commandContext.getParameters();
        for (int i = 0; i < parameters.size(); i++) {
            nativeQuery.setParameter(i + 1, parameters.get(i));
        }
        List<?> resultList = nativeQuery.getResultList();
        session.close();
        return resultList;
    }
    
    //......
}

Затем в файле конфигурации добавьте объявление для Hibernate и установите HibernatePersistExecutor в JdbcEngine:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/selfly-sonsure-dumper.git
git@api.gitlife.ru:oschina-mirror/selfly-sonsure-dumper.git
oschina-mirror
selfly-sonsure-dumper
selfly-sonsure-dumper
master