Dans quel cas JdbcDaoSupport est-il utilisé?

au printemps, lorsque nous insérons dans la base de données, nous pouvons utiliser JdbcDaoSupport ou pas. Ma question est, quels sont les avantages à utiliser et dans quelles circonstances, nous devrions l'utiliser?

16
demandé sur khateeb 2014-02-03 08:55:19

2 réponses

selon ces réponses:

JdbcDaoSupport, NamedParameterJdbcDaoSupport, SimpleJdbcDaoSupport sont inutiles et sont de la poussière mentale. Ils ne sauve aucune ligne de code parce que vous avez besoin d'injecter la source de données ou le modèle.

ce que je recommande - pour créer des modèles dans XML / class config par source de données et les réutiliser / injecter car les modèles sont thread safe selon docs:

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.

Comparer 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>

et 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 déclaration officielle sur les apatrides (et donc la sécurité du fil) de JdbcTemplate/NamedParameterJdbcTemplate ici https://jira.springsource.org/browse/SPR-11478

23
répondu gavenkoa 2017-05-23 11:53:24

tout d'abord, signalons le API spécifie cette classe comme une classe commodité ("support"). Je crois que JdbcDaoSupport prend en charge, aka vous fournit, une implémentation de base de la DAO design pour jdbc alors qu'une classe template (voir modèle de modèle) vous donnera un singleton qui est utilisé pour injecter dans vos classes DAO.

D'après mon expérience, je n'ai pas trouvé de raison d'associer mon DAO à un cours de soutien*. J'ai plutôt créer mes haricots jdbcctemplate spécifiques et les injecter dans mes classes DAO favorisant la composition plutôt que l'héritage -- généralement une bonne pratique orientée objet.

Printemps docs "Vous pouvez choisir d'hériter de cette classe. La classe JdbcDaoSupport est fournie à titre de commodité seulement.".

Ressort des états, JdbcDaoSupport est une commodité seulement. Ils ne disent rien de ses avantages par rapport à l'utilisation d'un modèle application.

7
répondu Prancer 2014-02-13 15:03:45