form example spring spring-jdbc

example - spring tags



¿Para qué se utiliza JdbcDaoSupport? (2)

Primero, indiquemos que la API especifica esta clase como una clase de conveniencia ("soporte"). Creo que JdbcDaoSupport admite, también conocido como, le proporciona, una implementación básica del diseño DAO para jdbc, mientras que una clase de plantilla (ver patrón de plantilla ) le dará un singleton que se utiliza para inyectar en sus clases DAO.

En mi experiencia, no he encontrado una razón para unir mi DAO a una * clase de soporte. En su lugar, creo mis beans jdbcTemplate específicos y los inyecto en mis clases DAO favoreciendo la composición sobre la herencia, generalmente una buena práctica orientada a objetos.

De los documentos de Spring , "Puede elegir si desea heredar de esta clase. La clase JdbcDaoSupport se proporciona solo para su comodidad".

Como afirma Spring, JdbcDaoSupport es solo una comodidad . No dicen nada sobre sus ventajas sobre el uso de una de las implementaciones de la plantilla.

En Spring, cuando estamos insertando en la base de datos, podemos usar JdbcDaoSupport o no. Mi pregunta es, ¿cuáles son las ventajas de usarlo y en qué circunstancias debemos usarlo?


Según estas respuestas:

JdbcDaoSupport , NamedParameterJdbcDaoSupport , SimpleJdbcDaoSupport son innecesarios y son polvo mental. No guardan ninguna línea de código porque necesita insertar fuente de datos o plantilla en.

Lo que recomiendo: crear plantillas en XML / class config por fuente de datos y reutilizarlas / inyectarlas, ya que las plantillas son seguras para subprocesos de acuerdo con la documentación:

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.

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

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

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

ACTUALIZACIÓN Declaración oficial sobre la apatridia (y por lo tanto, la seguridad de subprocesos) de JdbcTemplate / NamedParameterJdbcTemplate aquí https://jira.springsource.org/browse/SPR-11478