1. 程式人生 > >Spring學習(穀粒學院spring4課程)第六節 JdbcTemplate

Spring學習(穀粒學院spring4課程)第六節 JdbcTemplate

一:配置資料庫連線池及jdbc Template或NamedParameterJdbcTemplate,

<!-- 匯入資原始檔 -->
<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>
<context:component-scan base-package="com.wh.spring"></context:component-scan>
<!-- 配置spring的jdbc Template -->
<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>

 二:使用jdbc Template

import static org.junit.Assert.*;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
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 JDBCTest {
private ApplicationContext ctx;
private JdbcTemplate jdbcTemplate;
private Spring4Dao spring4Dao;
private Spring4DaoUseDaoSupport spring4DaoUseDaoSupport;
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
{
ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");
spring4Dao=(Spring4Dao) ctx.getBean("spring4Dao");
spring4DaoUseDaoSupport=(Spring4DaoUseDaoSupport) ctx.getBean("spring4DaoUseDaoSupport");
namedParameterJdbcTemplate=(NamedParameterJdbcTemplate) ctx.getBean("namedParameterJdbcTemplate");
}
	//@Test
	public void testDataSource() throws SQLException {
DataSource dataSource=(DataSource) ctx.getBean("dataSource");
System.out.println(dataSource.getConnection());
	}
	/**
	 * 執行Insert,update,delete
	 */
	//@Test
	public void testUpdate() {
		String sql="insert into spring4 (name ,age) values('wh','23')";
		jdbcTemplate.update(sql);
	}
	/**
	 * 執行批量更新:批量的inset,Updata,Delete
	 * 最後一個引數是List<Object[]>,修改一條記錄需要一個Object[]
	 */
	//@Test
	public void testBatchUpdate() {
		String sql="insert into spring4(name,age) values(?,?)";
		List<Object[]> batchArgs=new ArrayList<>();
		batchArgs.add(new Object[] {"a",1});
		batchArgs.add(new Object[] {"b",2});
		batchArgs.add(new Object[] {"c",3});
		batchArgs.add(new Object[] {"d",4});
		jdbcTemplate.batchUpdate(sql,batchArgs);
	}
	/**
	 * 從資料庫中獲取一條記錄,實際得到對應的一個物件
	 * 表跟類對應,記錄跟物件對應(ORM)
	 * 注意,不是呼叫queryForObject(String sql, Class<Spring4> requiredType, @Nullable Object... args) 方法
	 * 該方法返回一個欄位的值
	 * 查詢一條記錄需要呼叫queryForObject(String sql, RowMapper<Spring4> rowMapper, @Nullable Object... args)方法
	 * 1:RowMapper指定如何對映結果的行,常用的實現類為BeanPropertyRowMapper;
	 * 2:使用SQL中的列的別名完成列名和類的屬性名的對映 , 例如last_name lastName
	 * 3:不支援級聯屬性,jdbcTemplate是JDBC的小工具,不是ORM框架
	 */
	//@Test
	public void testQueryForObject() {
		String sql="select * from spring4 where name=?";
		RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class);
		Spring4 spring4=jdbcTemplate.queryForObject(sql, rowMapper,"a");
		System.out.println(spring4);
	}
	
	/**
	 * 查到實體類的集合
	 * 注意,呼叫的不是queryForList
	 */
	//@Test
	public void testQueryForList() {
		String sql="select * from spring4 where name=?";		
		RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class);
		List<Spring4> spring4s=jdbcTemplate.query(sql, rowMapper,"wh");
		System.out.println(spring4s);
	}
	
	/**
	 *獲取單個列的值,或做統計查詢
	 *使用queryForObject(String sql, Class<Integer> requiredType) 方法
	 */
	//@Test
    public void testQueryForObject2() {
		String sql="select count(*) from spring4";		
        int count=jdbcTemplate.queryForObject(sql, Integer.class);
        System.out.println(count);
    }
    //@Test
    public void testSpring4Dao() {
    	System.out.println(spring4Dao.get("a"));
    }
    //@Test
    public void testSpring4DaoUseDaoSupport() {
    	System.out.println(spring4DaoUseDaoSupport.get("a"));
    }
    /**
     * 可以為引數起名字
     * 1:若有多個引數,則不用再對應位置,直接對應引數名,便於維護
     * 2:較為麻煩
     */
    //@Test
    public void testNamedParameterJdbcTemplate() {
    	String sql="insert into spring4(name,age) values(:na,:ag)";
    	Map<String, String> paramMap=new HashMap<>();
    	paramMap.put("na", "wa");
    	paramMap.put("ag", "12");
    	namedParameterJdbcTemplate.update(sql, paramMap);
    }
    /**
     * 使用具名引數時,可以使用update(String sql, SqlParameterSource paramSource) 方法進行更新操作
     * 1:SQL語句的引數名和屬性一致
     * 2:使用SqlParameterSource的BeanPropertySqlParameterSource實現類作為引數
     */
    @Test
    public void testNamedParameterJdbcTemplate2() {
    	String sql="insert into spring4(name,age) values(:name,:age)";
    	Spring4 spring4=new Spring4();
    	spring4.setAge(16);
    	spring4.setName("小葉子");
    	SqlParameterSource paramSource=new BeanPropertySqlParameterSource(spring4);
        namedParameterJdbcTemplate.update(sql, paramSource);
    }
}

三:使用 JdbcDaoSupport

注意:要為 JdbcDaoSupport配置DataSource或jdbc Template


import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.stereotype.Repository;
/**
 * 不推薦使用JdbcDaoSupport
 * 推薦使用jdbcTemplate作為Dao的成員變數
 */
@Repository
public class Spring4DaoUseDaoSupport extends JdbcDaoSupport{
//由於setDataSource被Final修飾
    @Autowired
	public void setDataSource2(DataSource dataSource) {
		setDataSource(dataSource);
	}
	
    public Spring4 get(String name) {
    	String sql="select * from spring4 where name=?";
		RowMapper<Spring4> rowMapper=new BeanPropertyRowMapper<>(Spring4.class);
    	return getJdbcTemplate().queryForObject(sql, rowMapper,name);
    }
}