Spring JdbcTemplate詳解


為了使 JDBC 更加易於使用,Spring 在 JDBCAPI 上定義了一個抽象層, 以此建立一個JDBC存取框架.

作為 SpringJDBC 框架的核心, JDBC 模板的設計目的是為不同類型的JDBC操作提供模板方法. 每個模板方法都能控制整個過程,並允許覆蓋過程中的特定任務.通過這種

方式,可以在盡可能保留靈活性的情況下,將數據庫存取的工作量降到最低.

 

JdbcTemplate主要提供以下五類方法:

  • execute方法:可以用於執行任何SQL語句,一般用於執行DDL語句;

  • update方法:update方法用於執行新增、修改、刪除等語句;

  • batchUpdate方法:batchUpdate方法用於執行批處理相關語句;
  • query方法及queryForXXX方法:用於執行查詢相關語句;

  • call方法:用於執行存儲過程、函數相關語句。

 

1、首先在數據庫新建一張表

CREATE TABLE xwj_user (
   id VARCHAR(32) NOT NULL,
   last_name VARCHAR(32),
   age INT(2),
   email VARCHAR(32)
) ENGINE=INNODB DEFAULT CHARSET=utf8

 

2、在pom.xml文件中,增加依賴

<dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>4.2.5.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <!-- 獲取上下文 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
        <!-- 連接到mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.35</version>
        </dependency>
        <!-- 單元測試 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

 

3、在resource下面增加兩個配置文件db.properties、applicationContext.xml

  db.properties配置文件:

jdbc.user=root
jdbc.password=root
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://dev.yonyouccs.com:3001/icop-construct-busisubpack

initPoolSize=5
maxPoolSize=10

  在xml文件中,導入這個屬性文件以及配置c3p0數據源:

    <!-- 讀取配置文件 -->
    <context:property-placeholder location="classpath:db.properties" />
    
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="user" value="${jdbc.user}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="driverClass" value="${jdbc.driverClass}"></property>
        <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>

        <property name="initialPoolSize" value="${initPoolSize}"></property>
        <property name="maxPoolSize" value="${maxPoolSize}"></property>
    </bean>

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

 

4、創建一個實體類User

package com.xwj.bean;

public class User {

    private String id;
    private String lastName;
    private int age;
    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String toString() {
        return "User [id=" + id + ", lastName=" + lastName + ", email=" + email + ", age=" + age +"] ";
    }

}

 

5、創建一個測試類對JdbcTemplate的方法進行測試: 

package com.xwj.util;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.CollectionUtils;

import com.xwj.bean.User;

public class TestJdbc {

    private ApplicationContext ctx = null;
    private JdbcTemplate jdbcTemplate = null;

    {
        ctx = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");
    }

    /**
     * 執行 INSERT
     */
    @Test
    public void testInsert() {
        String sql = "INSERT INTO xwj_user(id, last_name, age) VALUES(?, ?, ?)";
        jdbcTemplate.update(sql, "1", "a-xwj", 0);
    }

    /**
     * 執行UPDATE
     */
    @Test
    public void testUpdate() {
        String sql = "UPDATE xwj_user SET last_name = ? WHERE id = ?";
        jdbcTemplate.update(sql, "b-xwj", 1);
    }

    /**
     * 執行 DELETE
     */
    @Test
    public void testDelete() {
        String sql = "DELETE from xwj_user WHERE id = ?";
        jdbcTemplate.update(sql, 1);
    }

    /**
     * 測試批量更新操作 最后一個參數是 Object[] 的 List 類型:因為修改一條記錄需要一個 Object 數組,修改多條記錄就需要一個
     * List 來存放多個數組。
     */
    @Test
    public void testBatchUpdate() {
        String sql = "INSERT INTO xwj_user(id, last_name, email) VALUES(?, ?, ?)";

        List<Object[]> batchArgs = new ArrayList<>();
        batchArgs.add(new Object[] { "2", "AA", "aa@atguigu.com" });
        batchArgs.add(new Object[] { "3", "BB", "bb@atguigu.com" });
        batchArgs.add(new Object[] { "4", "CC", "cc@atguigu.com" });
        batchArgs.add(new Object[] { "5", "DD", "dd@atguigu.com" });

        jdbcTemplate.batchUpdate(sql, batchArgs);
    }

    /**
     * 從數據庫中獲取一條記錄,實際得到對應的一個對象 注意:不是調用 queryForObject(String sql,Class<Employee> requiredType, Object... args) 方法! 
     * 而需要調用queryForObject(String sql, RowMapper<Employee> rowMapper, Object... args)
     * 1、其中的 RowMapper 指定如何去映射結果集的行,常用的實現類為 BeanPropertyRowMapper 
     * 2、使用SQL中的列的別名完成列名和類的屬性名的映射,例如 last_name lastName 
     * 3、不支持級聯屬性。 JdbcTemplate只能作為一個 JDBC 的小工具, 而不是 ORM 框架
     */
    @Test
    public void testQueryForObject() {
        String sql = "SELECT id, last_name lastName, email FROM xwj_user WHERE ID = ?";
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
        // 在將數據裝入對象時需要調用set方法。
        User user = jdbcTemplate.queryForObject(sql, rowMapper, 2);
        System.out.println(user);
    }
    
    /** 
     * 一次查詢多個對象 
     * 注意:調用的不是 queryForList 方法 
     */  
    @Test  
    public void testQueryForList() {  
        String sql = "SELECT id, name, email FROM xwj_user WHERE id > ?";  
        RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);  
        List<User> userList = jdbcTemplate.query(sql, rowMapper, 1);  
        if (!CollectionUtils.isEmpty(userList)) {
            userList.forEach(user -> {
                System.out.println(user);
            });
        }
    }  
    
    /** 
     * 獲取單個列的值或做統計查詢 
     * 使用 queryForObject(String sql, Class<Long> requiredType)  
     */  
    @Test  
    public void testQueryForCount() {  
        String sql = "SELECT count(id) FROM xwj_user";  
        long count = jdbcTemplate.queryForObject(sql, Long.class);  
          
        System.out.println(count);  
    }     

}

 

總結:JdbcTemplate是Spring框架自帶的對JDBC操作的封裝,目的是提供統一的模板方法使對數據庫的操作更加方便、友好,效率也不錯。但是功能還是不夠強大(比如不支持級聯屬性),在實際應用中還需要和hibernate、mybaties等框架混合使用。

 

  本文源碼地址:https://github.com/xuwenjin/xwj_repo/tree/master/springJdbc

  相關資源地址:JdbcTemplate使用簡介

           Spring的JDBCTemplate批量更新的性能問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM