2014-02-03 2 views
16

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

ответ

23

Согласно этим ответам:

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

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

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

} 

UPDATE Официальное заявление о без гражданства (и поэтому безопасность потока) из JdbcTemplate/NamedParameterJdbcTemplate здесь https://jira.springsource.org/browse/SPR-11478

6

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

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

От Spring docs «Вы можете выбрать, следует ли наследовать от этого класса. Класс JdbcDaoSupport предоставляется только в качестве удобства».

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

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