Для выполнения конечных операций персистентности используется интерфейс 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
используется таким образом в реальной ситуации, то, помимо вопроса о правильности подхода, могут возникнуть подозрения в «непристойном поведении».
Ниже приведён псевдокод для реализации интерфейса 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 )