Spring中的数据库操作
静态代码+动态变量 = jdbc编程
静态代码构成了模板,而动态变量则是需要传入的参数
JdbcTemplate
1)简化了我们对JDBC的操作:完成了SQL语句的创建和执行、资源的创建和释放的工作
总结:节省代码,不管连接、不管事务、不管异常、不管关闭
2)仅需要传递DataSource就可以把它实例化
3)JdbcTemplate只需要创建一次
4)JdbcTemplate是线程安全的,故可以使用单例模式
使用JdbcTemplate
总结:自己写的dao只需要把dataSource注入到jdbcTemplate中即可
方法一:dao类继承JdbcDaoSupport,直接(调用JdbcDaoSupport的setDataSource方法)注入DataSource。
注:查看JdbcDaoSupport的setDataSource方法的源码就可以明白DataSource是怎样注入到jdbcTemplate的
<bean id="personDao" class="com.jxn.PersonDao">
<!-- -->
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
public class PersonDao extends JdbcDaoSupport{
public void update(){
this.getJdbcTemplate().execute("update person set pname='a' where pid=3");
}
public void query(){
List<Person> persons = this.getJdbcTemplate().query("select * from person", new PersonRowMapper());
for(Person person:persons){
System.out.println(person.getPname());
}
}
}
public class PersonRowMapper implements RowMapper{
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
Person person = new Person();
person.setPid(rs.getLong("pid"));
person.setPname(rs.getString("pname"));
person.setPsex(rs.getString("psex"));
return person;
}
}
方法二:dao类继承JdbcTemplate,通过JdbcTemplate把DataSource注入
<bean id="personDao" class="com.jxn.PersonDao">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>
public class PersonDao extends JdbcTemplate{
public PersonDao2(DataSource dataSource){
super(dataSource);
}
public void update(){
this.execute("update person set pname='aa' where pid=2");
}
}
方法三:dao类里封装一个JdbcTemplate属性,JdbcTemplate把DataSource注入,然后PersonDao再把JdbcTemplate注入
<bean id="personDao" class="com.jxn.PersonDao">
<property name="jdbcTemplate"><ref bean="jdbcTemplate"/></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource"><ref bean="dataSource"/></property>
</bean>
public class PersonDao{
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void update(){
this.jdbcTemplate.execute("update person set pname='aaa' where pid=2");
}
}
------------------------------------------------------------
【JdbcDaoSupport、JdbcTemplate、JdbcAccessor的部分源码】
JdbcDaoSupport 封装了 JdbcTemplate
JdbcTemplate 继承了 JdbcAccessor
JdbcAccessor 封装了 DataSource
org.springframework.jdbc.core.JdbcTemplate
org.springframework.jdbc.core.support.JdbcDaoSupport
org.springframework.jdbc.support.JdbcAccessor
javax.sql.DataSource;
------------------------
// JdbcDaoSupport 封装了 JdbcTemplate
public abstract class JdbcDaoSupport extends DaoSupport {
private JdbcTemplate jdbcTemplate;
public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
initTemplateConfig();
}
public final JdbcTemplate getJdbcTemplate() {
return this.jdbcTemplate;
}
// 可以通过Spring的DI直接把DataSource注入进来
public final void setDataSource(DataSource dataSource) {
if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {
this.jdbcTemplate = createJdbcTemplate(dataSource);
initTemplateConfig();
}
}
public final DataSource getDataSource() {
return (this.jdbcTemplate != null ? this.jdbcTemplate.getDataSource() : null);
}
protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
------------------------
// JdbcTemplate 继承了 JdbcAccessor
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {
public JdbcTemplate() {
}
public JdbcTemplate(DataSource dataSource) {
setDataSource(dataSource);
}
// 在这里,JdbcTemplate封装了很多的jdbc的操作
}
------------------------
// JdbcAccessor 封装了 DataSource
public abstract class JdbcAccessor implements InitializingBean {
private DataSource dataSource;
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getDataSource() {
return this.dataSource;
}
}
Spring中的数据库操作--使用JdbcTemplate
最新推荐文章于 2020-10-31 14:32:08 发布