2016-11-04 5 views
0

Я работаю с Spring Boot над проектом. JDbcNamedTemplates используются в моих DAO для доступа к данным. Я пишу запросы в своих даос, а затем сопоставляю некоторые параметры во время выполнения, чтобы получить правильные данные.Обработка имен разных таблиц с использованием JDBCTemplate в Spring Application

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

Я мог бы создать абстрактный класс с большей частью функциональности и конкретными классами, которые расширяют его, чтобы обрабатывать различия в именах таблиц (в основном, имеют метод getTableName() "). Это работает. Тем не менее, похоже, что я создаю много классов, и я хотел бы создать меньше их.

Есть ли лучшие способы сделать это?

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

UPDATE:

Просто давая пример того, что я хотел бы улучшить. До сих пор у меня есть пара абстрактных DAO вроде этого. Они ведут разговор с базой данных.

public abstract class Dao1 { 
    private static final String PARAM = "p"; 
    private final String QUERY1 = " SELECT * FROM " + getTableName() + " WHERE something"; 
    //here we would also have autowired jdbcNamedTemplate and maybe some other stuff. 
    public getAll() { 
     //map parameters, do query return results 
    } 
    protected abstract String getTableName(); 
} 

Далее у меня есть пара объектов доступа к данным, которые реализуют абстрактный метод getTableName(). Так что, если бы таблица была «Осень», я бы это сделал.

@Component 
public class AutumnDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "AUTUMN"; 
    } 
} 

Так как в примере выше вы можете видеть, что для каждого абстрактного дао я должен был бы сделать пару бетонных Daos (осень, зима, весна, лето). Это приемлемо на данный момент, но в какой-то момент это может вырасти до довольно значительной коллекции daos.

Я хотел бы знать, есть ли способ избежать этого, например, создавая только один класс/интерфейс для каждого «сезона»/имени и каким-то образом дорабатывая его до Dao1, Dao2 и т. Д. По мере необходимости. Я знаю только, какое имя имеет значение при поступлении запроса пользователя.

+0

«Мне нужно обрабатывать данные из нескольких идентичных таблиц в зависимости от запроса. Логика поиска такая же, за исключением того, что мне нужно использовать разные имена таблиц» - можете ли вы дать образец – kuhajeyan

+0

Вы можете попробовать использовать интерфейсы и внедрить различные реализации с помощью bean @Qualifier. – Nano

+0

@Nano, я ноб с аннотациями. Не могли бы вы рассказать о том, как это могло бы работать с учетом моего последнего обновления? – Riv

ответ

0

С помощью @Qualifier ("nameOfBean") вы можете ввести экземпляр, который вы ищете.

Если у вас есть, например:

@Component 
public class AutumnDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "AUTUMN"; 
    } 
} 

@Component 
public class SummerDao1 extends Dao1 { 
    @Override 
    protected String getTableName() { 
     return "SUMMER"; 
    } 
} 

В этом случае вы создаете два зерна, которые могут быть введены в родительском классе Dao1. Чтобы ввести правильный вариант, вы должны:

@Autowire 
@Qualifier("autumnDao1") 
private Dao1 autumnDao; 

@Autowire 
@Qualifier("summerDao1") 
private Dao1 summerDao; 

Попробуйте это!

+0

Спасибо за ответ! Есть ли способ выбрать Wualifier во время выполнения? – Riv

+0

Хм, у меня пока нет подсказки tbh. Проверьте этот вопрос и скажите мне, если это то, что вы искали! Http: // StackOverflow.ком/вопросы/26463393/как к инъекционные-разные-услуги ВЫСОКИЙ выполнения на основе-на-собственность-с-весна-с – Nano

 Смежные вопросы

  • Нет связанных вопросов^_^