Spring4 JDBC詳解

Spring4 JDBC詳解

在以前的Spring4 IOC詳解 的文章中,並無介紹使用外部屬性的知識點。如今利用配置c3p0鏈接池的契機來一塊兒學習。本章內容主要有兩個部分:配置c3p0(重點)和 使用 Spring JDBC模版。java

準備環境

導入spring-jdbc的jar包mysql

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

建立數據表spring

SET FOREIGN_KEY_CHECKS=0;  
-- ----------------------------  
-- Table structure for `itdragon`  
-- ----------------------------  
DROP TABLE IF EXISTS `itdragon`;  
CREATE TABLE `itdragon` (  
  `id` int(11) NOT NULL AUTO_INCREMENT,  
  `account` varchar(255) NOT NULL,  
  `password` varchar(255) NOT NULL,  
  PRIMARY KEY (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

配置c3p0

c3p0的外部屬性文件(能夠在無需重啓系統的狀況下修改系統環境變量):db.properties。
db.properties文件中,user 和 password 分別表示 mysql鏈接 的帳號和密碼。driverClass 是加載的驅動。
jdbcUrl 是鏈接數據庫的路徑。格式是 jdbc:mysql://ip:port/數據庫名(jdbc:mysql://localhost:3306/spring)
若是ip地址是本地,port是3306 是能夠簡寫爲 jdbc:mysql:///+數據庫名。
initPoolSize 是 池內初始的數據鏈接個數,maxPoolSize是最大鏈接個數。和線程池是同樣的概念。
若是你對這個不是很瞭解,能夠先看看jdbc操做mysql數據庫sql

jdbc.user=root  
jdbc.password=root  
jdbc.driverClass=com.mysql.jdbc.Driver  
jdbc.jdbcUrl=jdbc:mysql:///spring  
  
jdbc.initPoolSize=5  
jdbc.maxPoolSize=10

核心文件applicationContext.xml ,首先要指定導入的資源context:property-placeholder , location從類路徑下加載外部屬性文件db.properties。
配置一個c3p0的bean,和普通bean同樣。只是賦值採用el表達式${}。再配置兩個jdbc的模版bean就能夠了。數據庫

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">  
      
    <!-- 導入資源文件 -->  
    <context:property-placeholder location="classpath:db.properties"/>  
      
    <!-- 配置 C3P0 數據源 -->  
    <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="jdbcUrl" value="${jdbc.jdbcUrl}"></property>  
        <property name="driverClass" value="${jdbc.driverClass}"></property>  
  
        <property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>  
        <property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>  
    </bean>  
      
    <!-- 配置 Spirng 的 JdbcTemplate -->  
    <bean id="jdbcTemplate"   
        class="org.springframework.jdbc.core.JdbcTemplate">  
        <property name="dataSource" ref="dataSource"></property>  
    </bean>  
      
    <!-- 配置 NamedParameterJdbcTemplate, 該對象可使用具名參數 -->  
    <bean id="namedParameterJdbcTemplate"  
        class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">  
        <constructor-arg ref="dataSource"></constructor-arg>      
    </bean>  
      
</beans>

值得注意的是,在配置JdbcTemplate是用屬性注入的方式,固然也能夠用構造注入。但在配置NamedParameterJdbcTemplate只能經過構造注入的方式。源碼以下:segmentfault

/*      */   public JdbcTemplate(DataSource dataSource)
/*      */   {
/*  166 */     setDataSource(dataSource);
/*  167 */     afterPropertiesSet();
/*      */   }

/*     */   public NamedParameterJdbcTemplate(DataSource dataSource)
/*     */   {
/*  89 */     Assert.notNull(dataSource, "DataSource must not be null");
/*  90 */     this.classicJdbcTemplate = new JdbcTemplate(dataSource);
/*     */   }

Spring JDBC模版

先溫故一下Mysql的基本語法
新增:INSERT [INTO] 表名 [(列名1, 列名2, 列名3, ...)] VALUES (值1, 值2, 值3, ...);
修改:UPDATE 表名 SET 列名=新值 WHERE 更新條件;
刪除:DELETE FROM 表名 WHERE 刪除條件;
查詢:SELECT 列名稱 FROM 表名稱 [查詢條件];
操做Mysql的測試方法,JdbcTemplate只是一個 JDBC的小工具。不少功能還不能實現,好比級聯操做。真正的數據處理,仍是交給Hibernate等ORM框架。數組

import java.sql.SQLException;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.Map;  
import javax.sql.DataSource;  
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.jdbc.core.namedparam.BeanPropertySqlParameterSource;  
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;  
import org.springframework.jdbc.core.namedparam.SqlParameterSource;  
  
public class MyJDBCMain {  
      
    private ApplicationContext ctx = null;  
    private JdbcTemplate jdbcTemplate = null; // JdbcTemplate 只是一個 JDBC的小工具,不支持級聯屬性  
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate = null; // 支持具名參數,提升代碼的可讀性。  
      
    // 構造塊,在建立對象的時候調用  
    {  
        ctx = new ClassPathXmlApplicationContext("applicationContext.xml");  
        jdbcTemplate = (JdbcTemplate) ctx.getBean("jdbcTemplate");  
        namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");  
    }  
  
    // 測試是否連上數據庫鏈接池  
    @Test  
    public void connectionDataSource() {  
        System.out.println("----------- connectionDataSource ----------");  
        DataSource dataSource = (DataSource) ctx.getBean("dataSource");  
        try {  
            // 若能打印com.mchange.v2.c3p0.impl.NewProxyConnection 說明鏈接成功。  
            System.out.println(dataSource.getConnection());  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        System.out.println("^^^^^^^^^^^ connectionDataSource ^^^^^^^^^^^");  
    }  
      
    /** 
     * 直接對Mysql數據進行增,刪,改,查,統計的操做 
     */  
    @Test  
    public void crudMysqlOperation() {  
        System.out.println("----------- crudMysqlOperation ----------");  
        // 插入  
        String insertSql = "INSERT INTO ITDragon (account, password) VALUES (?,?)";  
        System.out.println("insert result : " + jdbcTemplate.update(insertSql, "itdragon", "pwdItdragon"));  
        // 修改  
        String updateSql = "UPDATE ITDragon SET password = ? WHERE account = ?";  
        System.out.println("update result : " + jdbcTemplate.update(updateSql, "passwordItdragon", "itdragon"));  
        // 查詢  
        String querySql = "SELECT * FROM ITDragon";  
        List<Map<String, Object>> results = jdbcTemplate.queryForList(querySql);  
        System.out.println("query result : " + results);  
        // 刪除  
        String deleteSql = "DELETE FROM ITDragon WHERE account = ?";  
        System.out.println("delete result : " + jdbcTemplate.update(deleteSql, "itdragon"));  
        // 統計  
        String countSql = "SELECT count(id) FROM ITDragon";  
        System.out.println("count result : " + jdbcTemplate.queryForObject(countSql, Long.class));  
        System.out.println("^^^^^^^^^^^ crudMysqlOperation ^^^^^^^^^^^");  
    }  
      
    /** 
     * 直接對Mysql數據進行批量的增,刪,改的操做 
     */  
    @Test  
    public void batchCrudMysqlOperation() {  
        System.out.println("----------- batchCrudMysqlOperation ----------");  
        // 批量插入  
        String insertSql = "INSERT INTO ITDragon (account, password) VALUES (?,?)";  
        List<Object[]> insertArgs = new ArrayList<>();  
        insertArgs.add(new Object[]{"itdragon", "pwdItdragon"});  
        insertArgs.add(new Object[]{"blog", "pwdBlog"});  
        System.out.println("batch insert result : " + jdbcTemplate.batchUpdate(insertSql, insertArgs));  
        // 查詢  
        String querySql = "SELECT * FROM ITDragon";  
        List<Map<String, Object>> results = jdbcTemplate.queryForList(querySql);  
        System.out.println("query result : " + results);  
        // 批量修改  
        String updateSql = "UPDATE ITDragon SET password = ? WHERE account = ?";  
        List<Object[]> updateArgs = new ArrayList<>();  
        updateArgs.add(new Object[]{"passwordItdragon", "itdragon"});  
        updateArgs.add(new Object[]{"passwordBlog", "blog"});  
        System.out.println("batch udpate result : " + jdbcTemplate.batchUpdate(updateSql, updateArgs));  
        // 批量刪除  
        String deleteSql = "DELETE FROM ITDragon WHERE account = ?";  
        List<Object[]> deleteArgs = new ArrayList<>();  
        deleteArgs.add(new Object[]{"itdragon"});  
        deleteArgs.add(new Object[]{"blog"});  
        System.out.println("batch delete result : " + jdbcTemplate.batchUpdate(deleteSql, deleteArgs));  
        // 統計  
        String countSql = "SELECT count(id) FROM ITDragon";  
        System.out.println("count result : " + jdbcTemplate.queryForObject(countSql, Long.class));  
        System.out.println("^^^^^^^^^^^ batchCrudMysqlOperation ^^^^^^^^^^^");  
    }  
      
    /** 
     * 對象的增刪改查,改用 NamedParameterJdbcTemplate 
     * 要求:參數名要和類的屬性名同樣 
     * 好處:以前的參數用?表示,不直觀,代碼的可讀性較差,出錯率較高。 
     * 缺點:多敲幾個字母 
     */  
    @Test  
    public void crudObjectOperation() {  
        System.out.println("----------- crudObjectOperation ----------");  
        // 插入  
        String insertSql = "INSERT INTO ITDragon (account, password) VALUES (:account,:password)";  
        ITDragon itDragon = new ITDragon();  
        itDragon.setAccount("itdragon");  
        itDragon.setPassword("pwdItdragon");  
        SqlParameterSource paramSource = new BeanPropertySqlParameterSource(itDragon);  
        System.out.println("insert object result : " + namedParameterJdbcTemplate.update(insertSql, paramSource));  
        // 查詢  
        String querySql = "SELECT * FROM ITDragon";  
        // 使用 RowMapper 指定映射結果集的行  
        RowMapper<ITDragon> rowMapper = new BeanPropertyRowMapper<>(ITDragon.class);  
        List<ITDragon> results = namedParameterJdbcTemplate.query(querySql, rowMapper);  
        System.out.println("query object result : " + results);  
        // 更新和刪除 也是update方法,這裏不作過多的描述   
        System.out.println("^^^^^^^^^^^ crudObjectOperation ^^^^^^^^^^^");  
    }  
  
}
public class ITDragon {
    
    private Integer id;
    private String account;
    private String password;
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getAccount() {
        return account;
    }
    public void setAccount(String account) {
        this.account = account;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    @Override
    public String toString() {
        return "ITDragon [id=" + id + ", account=" + account + ", password="
                + password + "]";
    }

}
----------- connectionDataSource ----------  
com.mchange.v2.c3p0.impl.NewProxyConnection@16ba2b8  
^^^^^^^^^^^ connectionDataSource ^^^^^^^^^^^  
----------- crudMysqlOperation ----------  
insert result : 1  
update result : 1  
query result : [{id=4, account=itdragon, password=passwordItdragon}]  
delete result : 1  
count result : 0  
^^^^^^^^^^^ crudMysqlOperation ^^^^^^^^^^^  
----------- batchCrudMysqlOperation ----------  
batch insert result : [I@3c9dd8  
query result : [{id=10, account=itdragon, password=pwdItdragon}, {id=11, account=blog, password=pwdBlog}]  
batch udpate result : [I@c094f6  
batch delete result : [I@1917d6d  
count result : 0  
^^^^^^^^^^^ batchCrudMysqlOperation ^^^^^^^^^^^  
----------- crudObjectOperation ----------  
insert object result : 1  
query object result : [ITDragon [id=12, account=itdragon, password=pwdItdragon]]  
^^^^^^^^^^^ crudObjectOperation ^^^^^^^^^^^

從打印的結果能夠看出,若是插入,修改,刪除一條數據,成功就返回1。若是是批量操做,則返回的是一個int[] 數組。
好了!到這裏,Spring4 的JDBC就講完了。有關jdbc的事務,就放到下一章介紹。喜歡的話能夠點個贊哦!app

一點點成長,一點點優秀。若是有什麼建議和疑問能夠留言。
20170925181846790框架

相關文章
相關標籤/搜索