Для чего используется JdbcDaoSupport?

В Spring, когда мы вставляем в базу данных, мы можем использовать JdbcDaoSupport или нет. Мой вопрос в том, каковы преимущества его использования и в каких обстоятельствах мы должны его использовать?

Ответы

Ответ 1

В соответствии с этими ответами:

JdbcDaoSupport, NamedParameterJdbcDaoSupport, SimpleJdbcDaoSupport не нужны и являются умственной пылью. Они не сохраняют ни одной строки кода, потому что вам нужно внедрить источник данных или шаблон в.

Что я рекомендую - создавать шаблоны в конфигурации XML/class для каждого источника данных и повторно использовать/внедрять их, поскольку шаблоны являются потокобезопасными в соответствии с документами:

Once configured, a JdbcTemplate instance is threadsafe.
You may want multiple JdbcTemplate instances if your application
accesses multiple databases, which requires multiple DataSources,
and subsequently multiple differently configured JdbcTemplates.

Сравнить applicationContext.xml:

<bean id="dataSource"
      class="org.apache.commons.dbcp.BasicDataSource"
      destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<bean id="jdbcTemplate" 
      class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"/>
</bean>

и YourDaoImpl.java:

public class YourDaoImpl implements YourDao {

    @Autowired
    private NamedParameterJdbcTemplate jdbcTemplate;

    @Override
    public int tableExists(String table) {
        String sql = "select count(*) from all_tables"
                + "  where table_name = :tbl";
        return jdbcTemplate.queryForObject(
                    sql, new MapSqlParameterSource("tbl", table), Integer.class);
    }
}

с JdbcDaoSupport:

public class YourDaoImpl extends NamedParameterJdbcDaoSupport implements YourDao {

   @Autowired
    public void setDs(DataSource dataSource) {
        setDataSource(dataSource);
    }

    @Override
    public int tableExists(String table) {
        String sql = "select count(*) from all_tables"
                + "  where table_name = :tbl";
        return getNamedParameterJdbcTemplate()
               .queryForObject(
                       sql,
                       new MapSqlParameterSource("tbl", table), Integer.class);
    }

}

ОБНОВЛЕНИЕ Официальное утверждение о безстоящем (и, следовательно, безопасности потоков) JdbcTemplate/NamedParameterJdbcTemplate здесь https://jira.springsource.org/browse/SPR-11478

Ответ 2

Сначала укажите, что API указывает этот класс как класс удобства ( "поддержка" ). Я полагаю, что поддержка JdbcDaoSupport также предоставляет вам базовую реализацию DAO design для jdbc, тогда как класс шаблона (см. шаблон шаблона) даст вам singleton, который используется для ввода в ваш DAO классы.

По моему опыту, я не нашел причины, чтобы связать мой DAO с классом поддержки *. Вместо этого я создаю свой конкретный jdbcTemplate beans и внедряю их в свои классы DAO, предпочитая композицию над наследованием - обычно хорошая объектно-ориентированная практика.

Из Spring docs: "Вы можете выбрать, следует ли наследовать от этого класса. Класс JdbcDaoSupport предоставляется только для удобства.".

Как указано Spring, JdbcDaoSupport - это только удобство. Они ничего не говорят о своих преимуществах по сравнению с использованием одной из реализаций шаблонов.