Spring-JdbcTemplate使用

JdbcTemplate

  1. 爲了使 JDBC 更加易於使用, Spring 在 JDBC API 上定義了一個抽象層, 以此建立一個 JDBC 存取框架.
  2. 作爲 Spring JDBC 框架的核心, JDBC 模板的設計目的是爲不同類型的 JDBC 操作提供模板方法. 每個模板方法都能控制整個過程, 並允許覆蓋過程中的特定任務. 通過這種方式, 可以在儘可能保留靈活性的情況下, 將數據庫存取的工作量降到最低.

1. 配置JdbcTemplate(C3P0緩衝池)

涉及架包:

//	配置Jdbc所需架包
c3p0-0.9.1.2.jar
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
mysql-connector-java-5.1.7-bin.jar
spring-jdbc-4.0.0.RELEASE.jar

commons-logging-1.1.3.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar

1.1 添加db.properties文件

//	數據庫用戶名
jdbc.user = root 
//	數據庫用戶密碼
jdbc.password = 1234	
//	驅動
jdbc.driverClass = com.mysql.jdbc.Driver
//	連接URL:jdbc:mysql:/// -數據庫名
jdbc.jdbcUrl = jdbc:mysql:///spring

//	連接數
jdbc.initPoolSize=5
//	最大連接數
jdbc.maxPoolSize=10

1.2 配置xml文件

<?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:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
   http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/aop 
   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
   http://www.springframework.org/schema/tx 
   http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
   http://www.springframework.org/schema/context      
   http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 導入資源文件,
	 讀取db.properties文件中的數據 -->
    <context:property-placeholder location="classpath:db.properties"/>
    
<!-- 配置dataSource -->
	<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>

<!-- 配置Spring的jdbcTemplate -->
	<bean id="jdbc" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
</beans>

1.3 Test測試類

package com.nchu.test;

import java.sql.SQLException;
import javax.sql.DataSource;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

public class jdbcText {
    private ApplicationContext context = null;
    private JdbcTemplate jdbcTemplate; 
     //初始化連接池
    {
    	context = new ClassPathXmlApplicationContext("applicationContext.xml");
        // 獲取jdbcTemplate的bean
    	jdbcTemplate = (JdbcTemplate) context.getBean("jdbc");
    }
     //測試是否連接數據庫
    @Test
    public void testIsConnect() throws SQLException {
    	DataSource dataSource = (DataSource) context.getBean("dataSource");
        System.out.println("連接成功"+dataSource.getConnection());
        
    }
}

連接成功:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s7vFbnhx-1570362647692)(C:\Users\Leisure\AppData\Roaming\Typora\typora-user-images\1570263788168.png[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-P1v0yFKn-1570362648076)(C:\Users\Leisure\AppData\Roaming\Typora\typora-user-images\1570263914802.png)]]

2. JdbcTemplate使用

2.1 update

// 執行update
@Test
public void TestUpdate(){
	String sql = "Update book set bprice=? where bid = ?";
	jdbcTemplate.update(sql,222,1);
}

2.2 delete

// 執行delete
@Test
public void TestDelete(){
	String sql = "delete from book where bid = ?";
	jdbcTemplate.update(sql,2);
}

2.3 insert

// 執行insert
@Test
public void TestInsert(){
	String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?)";
	jdbcTemplate.update(sql,"C++",23,23);
}

2.4 select

 // query:查詢多行
    @Test
    public void testQueryForObject(){
    	String sql = "select bid,bname from book where bid> ?";
    	RowMapper<Book> rowMapper = new BeanPropertyRowMapper<>(Book.class);
    	List<Book> books = jdbcTemplate.query(sql, rowMapper,2);
    	
    	System.out.println(books);
    }

// queryForObject:查詢單個列的值,或做統計查詢
    @Test
    public void testQueryForObject2(){
    	String sql = "select bid from book ";
    	int count =  jdbcTemplate.queryForObject(sql, Integer.class);
    	System.out.println(count);
    }

2.5 batchUpate

// 執行批量更新:批量的Insert、update、delete
    // 最後一個參數是Object[] 的list類型:因爲修改一條爲一個Object的數組,多條就是多個Object的數組
    @Test
    public void TestBatchUpdate(){
    	String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?) ";
//    	jdbcTemplate.execute(sql);
    	List<Object[]> ls = new ArrayList<>();
    	ls.add(new Object[]{"C",20,18});
    	ls.add(new Object[]{"C",20,18});
    	ls.add(new Object[]{"C",20,18});
    	ls.add(new Object[]{"C",20,18});
    	ls.add(new Object[]{"C",20,18});
    	jdbcTemplate.batchUpdate(sql,ls);
    }

補充:

// execute:不能插入參數,功能上,update與其相似
jdbcTemplate.execute(sql);

3. Jdbc中使用具名參數

  1. 在經典的 JDBC 用法中, SQL 參數是用佔位符 ? 表示,並且受到位置的限制. 定位參數的問題在於, 一旦參數的順序發生變化, 就必須改變參數綁定.
  2. 在 Spring JDBC 框架中, 綁定 SQL 參數的另一種選擇是使用具名參數(named parameter).
  3. 具名參數: SQL 按名稱(以冒號開頭)而不是按位置進行指定. 具名參數更易於維護, 也提升了可讀性. 具名參數由框架類在運行時用佔位符取代
  4. 具名參數只在 NamedParameterJdbcTemplate 中得到支持

3.1 配置xml文件

	<!-- 配置namedParameterJdbcTemplate,該對象可以使用具名參數,其沒有無參構造器,所以 爲其構造器指定參數-->
	<bean id="namedParameterJdbcTemplate" 
		class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
		<constructor-arg ref="dataSource"></constructor-arg>
	</bean>

3.2 Test測試類

方法一:

    @Test
    public void TestInsert(){
    	//	傳統方式
//    	String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?)";
//    	jdbcTemplate.update(sql,"C++",23,23);
    	
    	//	使用具名參數
    	//	可以爲參數起名字。好處:利於後期維護;壞處:使用麻煩
        
        //	獲取 namedParameterJdbcTemplate的bean
        NamedParameterJdbcTemplate namedParameterJdbcTemplate = (NamedParameterJdbcTemplate) context.getBean("namedParameterJdbcTemplate");
    	String sql = "Insert into book(bname,bnumber,bprice) values(:b_name,:b_number,:b_price)";
    	Map<String,Object> paramMap = new HashMap<>();
    	paramMap.put("b_name", "English");
    	paramMap.put("b_number", 25);
    	paramMap.put("b_price", 30);
    	namedParameterJdbcTemplate.update(sql,paramMap);
    }

方法二:

    @Test
    public void TestInsert2(){
    	//	傳統方式
//    	String sql = "Insert into book(bname,bnumber,bprice) values(?,?,?)";
//    	jdbcTemplate.update(sql,"C++",23,23);
    	
    	//	使用具名參數
    	//	可以爲參數起名字。好處:利於後期維護;壞處:使用麻煩
    	String sql = "Insert into book(bname,bnumber,bprice) values(:bname,:bnumber,:bprice)";
    	//	使用Book對象來當載體時,具名參數要和類中參數名字一致
    	Book book =new Book();
    	book.setBname("P.E");
    	book.setBnumber(23);
    	book.setBprice(20);
    	//	使用BeanPropertySqlParameterSource將book類傳給paramSource
    	SqlParameterSource paramSource = new BeanPropertySqlParameterSource(book);
    	namedParameterJdbcTemplate.update(sql,paramSource);
    }
``
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章