JdbcTemplate

cuixiaoming1994發表於2018-03-25

JdbcTemplate

需要匯入額外的jar

  • Spring-jdbc.jar
  • Spring-tx.jar
  • c3p0.jar
  • mysql-connector.jar

操作步驟

  1. 建立jdbcTemplate物件
  2. 為jdbcTemplate物件設定資料來源
  3. 資料庫操作 update/query

jdbcTemplate的增刪改查

和普通的DBUtils的增刪改沒什麼兩樣
查的話有一些區別,因為封裝的物件不同了
如果查一行或多行,並把每行都封裝成一個物件的話,就用BeanPropertyRowMapper<XXX>(XXX.class)
如果聚合查詢,直接使用Long.class
返回值是多個的話使用query,返回單個的話使用queryForObject

//查詢多個物件
List<Account> accountList = jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<Account>(Account.class));

//查詢單個物件   注意,使用的是queryForObject
Account account = jdbcTemplate.queryForObject("select * from account where name=?", new BeanPropertyRowMapper<Account>(Account.class),"jerry");

//聚合查詢
Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);

在dao層使用jdbcTemplate的兩種方式

注意,如果使用繼承的方式,就不能使用全註解,如果想使用全註解,就必須使用第一種

(一).直接在dao層中注入JdbaTemplate

一個簡單的JavaBean

package com.cuixiaoming.domain;

public class Account {
    private String username;
    private double money;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

}

Dao層

package com.cuixiaoming.dao.impl;

import com.cuixiaoming.dao.AccountDao;
import com.cuixiaoming.domain.Account;
import org.springframework.jdbc.core.JdbcTemplate;

public class AccountDaoImpl implements AccountDao {

    //注入JdbcTemplate,提供set方法
    private JdbcTemplate jdbcTemplate;

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

    //增加資料,因為直接注入了JdbcTemplate,所以可以直接使用
    @Override
    public void save(Account account) {

        jdbcTemplate.update("insert into account values (?,?)",account.getUsername(),account.getMoney());

    }
}

XML中的配置

    <!--配置dao層檔案,其中注入jdbcTemplate-->
    <bean id="accountDao" class="com.cuixiaoming.dao.impl.AccountDaoImpl">
        <property name="jdbcTemplate" ref="jdbcTemplate"></property>
    </bean>

    <!--配置jdbcTemplate,裡面注入DataSource-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!--配置DataSource,裡面注入基本連線資訊,可以再向外抽取,現在先這樣吧-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql:///test0325"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>

寫一個測試類呼叫Dao層方法

package com.cuixiaoming.jdbcTemplateTest;

import com.cuixiaoming.dao.AccountDao;
import com.cuixiaoming.domain.Account;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class jdbcTemplateDaoTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        AccountDao accountDao = (AccountDao) app.getBean("accountDao");
        Account account = new Account();
        account.setUsername("王五");
        account.setMoney(1000);
        accountDao.save(account);
    }
}

(二)繼承JdbcDaoSupport

JdbcDaoSupport是一個Spring框架給我們提供的類,用於使用Jdbc運算元據庫的時候,該類中定義了一個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;
    }
}

所以,我們使用這種方式的時候可以不用手動注入了,但是我需要在XML中給jdbcTemplate 配置含有連線引數的dataSource
看一下XML的配置

<!--dao層,裡面注入dataSource!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-->
<bean id="accountDao" class="com.cuixiaoming.dao.impl.AccountDaoImpl2">
    <property name="dataSource" ref="dataSource"></property>
</bean>

<!--配置dataSource,裡面注入基本連線資料-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql:///test0325"></property>
    <property name="username" value="root"></property>
    <property name="password" value="root"></property>
</bean>

JdbcDaoSupport並沒有在XML中配置,原因是它是一個抽象類
所以,配置繼承了它的accountDao即可


讓我們疑惑的是,JdbcDaoSupport中命名注入了jdbcTemplate,
為什麼在XML中不給accountDao配置jdbcTemplate,反而直接配置了dataSource呢
我們再仔細看一下JdbcDaoSupport的原碼發現
首先,是可以注入jdbcTemplate的,因為有set方法

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

但是,他有這麼一個方法

    public final void setDataSource(DataSource dataSource) {
    if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) {             
    //如果提供了資料來源就建立JdbcTemplate,賦值給成員變數jdbcTemplate
            this.jdbcTemplate = createJdbcTemplate(dataSource);
            initTemplateConfig();
        }
    }

仔細看,這個方法的名字是setDataSource,是dataSource的set方法,所以可以對DataSource進行直接注入

我又使用了傳統的方式配置XML

<!--配置accountDao,注入jdbcTemplate-->
<bean id="accountDao" class="com.cuixiaoming.dao.impl.AccountDaoImpl2">
    <property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>

<!--配置jdbcTemplate,注入DataSource-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置dataSource,裡面注入基本連線資料-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url" value="jdbc:mysql:///test0325"></property>
    <property name="username" value="root"></property>
    <property name="password" value="root"></property>
</bean>

也獲得了成功

相關文章