Spring学习笔记【part09】JdbcTemplate

导读:本篇文章讲解 Spring学习笔记【part09】JdbcTemplate,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

Spring 学习笔记 Part09

1. Spring提供的操作模板类

操作关系型数据的:JdbcTemplate、HibernateTemplate

操作 nosql 数据库的:RedisTemplate

操作消息队列的:JmsTemplate

在这里插入图片描述

我们今天的主角是 JdbcTemplate,它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装。

//JdbcTemplate的源码

    public JdbcTemplate() {

    }

    public JdbcTemplate(DataSource dataSource) {
        setDataSource(dataSource);
        afterPropertiesSet();
    }

    public JdbcTemplate(DataSource dataSource, boolean lazyInit) {
        setDataSource(dataSource);
        setLazyInit(lazyInit);
        afterPropertiesSet();
    }

	除了默认构造函数之外,都需要提供一个数据源。既然有set方法,依据我们之前学过的依赖注入,我们可以
在配置文件中配置这些对象。

2. JdbcTemplate配置

首先导入JdbcTmplate的坐标(两个都是JdbcTemplate)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

再导入 Spring 和 数据库连接器的坐标(还需要c3p0或druid连接池的坐标,这里就不做阐述)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
</dependency>

XML方式配置

xml里:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource"></property>
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> 
    <property name="url" value="jdbc:mysql:///springdemo09"></property> 
    <property name="username" value="root"></property> 
    <property name="password" value="123456"></property>
</bean>

Dao里:

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
	this.jdbcTemplate = jdbcTemplate;
}

但是如果Dao变多时,每个Dao都有上面的代码,重复性太高了,此时我们可以让Dao继承 JdbcDaoSupport类。

public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
    
}

JdbcDaoSupport :JdbcDaoSupport是 spring 框架为我们提供的一个类,该类中定义了一个 JdbcTemplate 对象,我们可以直接获取使用。

//super.getgetJdbcTemplate()即可获取到jdbctemplate对象

public class AccountDaoImpl extends JdbcDaoSupport implements IAccountDao {
    
    @Override
    public void updateAccount(Account account) {
            getJdbcTemplate().update("update account set money = ? where id = ? ",account.getMoney(),account.getId());
    }
}

但是要想创建该对象,需要为其提供一个数据源。

<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl">
	<!-- 注入 dataSource --> 
    <property name="dataSource" ref="dataSource"></property>
</bean>

原理:以下是JdbcDaoSupport源码,它提供了两个set注入方法,可以直接注入JdbcTemplate,也可以通过只注入DataSource数据源,由系统自动创建一个JdbcTemplate。所以要想创建JdbcTemplate对象,为其提供一个数据源即可啦。

public abstract class JdbcDaoSupport extends DaoSupport {
    
    //定义对象
    private JdbcTemplate jdbcTemplate;
    
    //set 方法注入数据源,判断是否注入了,注入了就创建 JdbcTemplate
    public final void setDataSource(DataSource dataSource) {
        if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) { 
        //如果提供了数据源就创建 JdbcTemplate
        this.jdbcTemplate = createJdbcTemplate(dataSource);
        initTemplateConfig();
	} 
    
    //使用数据源创建 JdcbTemplate
    protected JdbcTemplate createJdbcTemplate(DataSource dataSource) {
    	return new JdbcTemplate(dataSource);
    }

    //当然,我们也可以通过注入 JdbcTemplate 对象
    public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
        initTemplateConfig();
    }

    //使用 getJdbcTmeplate 方法获取操作模板对象
    public final JdbcTemplate getJdbcTemplate() {
         return this.jdbcTemplate; 
    }
}

注意:让Dao类继承JdbcDaoSupport类来优化重复代码的方式,只能用于基于XML的方式,注解不可使用。原始的方法,也就是在Dao类中定义JdbcTemplate的方式,才都适用于XML和注解。

3. JdbcTemplate的使用

//从IoC容器中获取JdbcTemplate
JdbcTemplate template = (JdbcTemplate) ac.getBean("jdbcTemplate");

1.增删改: 
    template.update( String sql , Object.. args )
参数:
    字符串类型的sql语句
    占位符中的参数(可变长参数)
    
2.查询所有:
    template.query( String sql , new BeanPropertyRowMapper<E>(E.class) , Object.. args )
参数:
    字符串类型的sql语句
    泛型E写入自建对象的类名,BeanPropertyRowMapper会为我们自动封装好该对象
    占位符中的参数(可变长参数)  
    
3.查询一行
    template.queryForObject( String sql , E.class , Object.. args )
参数:
	字符串类型的sql语句
    查询返回值的字节码文件,若是自建对象需用new BeanPropertyRowMapper<E>(E.class)来自动封装
	占位符中的参数(可变长参数)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84496.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!