我们在dao中要用jdbcTemplate的话,就要在每个dao中设置一个属性,如果采用注解的方式,那么只需在属性上写上@Autowired,如果采用xml中配置的方式,那么就要每个dao都写上属性及其set方法。
我XML中对 jt 和datasource的配置如下:
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="ds">
</constructor-arg>
</bean>
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
那么采用每个dao中都添加属性的写法就是这样:
@Autowired
private JdbcTemplate jt;
@Override
public void saveCustomer() {
List<User> list = jt.query("select * from user where id > ?", new BeanPropertyRowMapper<User>(User.class), 0);
System.out.println(list.get(0));
}
如果不是采用注解的方式,那么还要添加上set方法:
@Autowired
private JdbcTemplate jt;
public void setJt(JdbcTemplate jt) {
this.jt = jt;
}
@Override
public void saveCustomer() {
List<User> list = jt.query("select * from user where id > ?", new BeanPropertyRowMapper<User>(User.class), 0);
System.out.println(list.get(0));
}
那么如果我们不想在每个dao中都这么写一下的话,可以让我们的类继承JdbcDaoSupport:
public class CustomerDaoImpl2 extends JdbcDaoSupport implements ICustomerDao {
@Override
public void saveCustomer() {
List<User> list = getJdbcTemplate().query("select * from user where id > ?", new BeanPropertyRowMapper<User>(User.class), 0);
System.out.println(list.get(0));
}
}
xml中是这样配置的:
<bean id="custDaoImpl2" class="com.dimples.dao.impl.CustomerDaoImpl2">
<property name="jdbcTemplate" ref="jt"></property>
</bean>
<bean id="jt" class="org.springframework.jdbc.core.JdbcTemplate">
<constructor-arg name="dataSource" ref="ds">
</constructor-arg>
</bean>
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
我们可以看看JdbcDaoSupport里面源码:
public abstract class JdbcDaoSupport extends DaoSupport {
private JdbcTemplate jdbcTemplate;
public final void setDataSource(DataSource dataSource) {
if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
this.jdbcTemplate = createJdbcTemplate(dataSource);
initTemplateConfig();
}
}
protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
public final DataSource getDataSource() {
return (this.jdbcTemplate != null ? this.jdbcTemplate.getDataSource() : null);
}
public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
initTemplateConfig();
}
public final JdbcTemplate getJdbcTemplate() {
return this.jdbcTemplate;
}
}
通过源码我们看到了JdbcDaoSupport为我们提供了两种方式创建jt,一种是直接传jdbcTemplate触发setJdbcTemplate方法创建,另一种是直接传dataSource出发setDataSource方法来创建。那么我们的dao类继承了JdbcDaoSupport以后,也就可以通过这两种方式来注入jt了,然后通过它共有的方法getJdbcTemplate获取 jt 。
如果我们选择继承的方式,那么需要使用xml配置的方式去注入;如果我们选择自己写属性自己写set方法,那么注解和XML两种注入方式都可以。