1. 程式人生 > >Spring的JDBC模板的使用

Spring的JDBC模板的使用

1 Spring的JDBC模板的介紹

  • Spring是EE開發的一站式的框架,有EE開發的每層的解決方案。Spring對持久層也提供瞭解決方案:ORM模組和JDBC的模板
  • Spring提供了很多的模板用於簡化開發:

 2 Spring的JDBC模板入門

2.1 建立專案,引入jar包

2.2 建立資料庫和表

create database springjdbcdb;
use springjdbcdb;
create table account(
	id int primary key auto_increment,
	name varchar(20),
	money double
);

2.3 傳統的JDBCTemplate開發簡單示例

package com.itykd.spring.jdbc;

import org.junit.Test;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

public class JDBCDemo {
	@Test
	public void demo() {
		DriverManagerDataSource dataSource = new DriverManagerDataSource();
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		dataSource.setUrl("jdbc:mysql:///springjdbcdb");
		dataSource.setUsername("root");
		dataSource.setPassword("NULIFENDOU520");
		//建立JDBC模板
		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
		jdbcTemplate.update("insert into account values(null,?,?)","ykd",10000d);
	}

}
  • 由以上可知:JDBCTemplate與dataSource之間有依賴關係:JDBCTemplate依賴於dataSource,因此下面介紹另外一種:利用Spring建立

2.4 利用Spring建立連線池和模板開發

  • 在配置檔案中配置Spring預設的連線池和jdbc模板
	<!-- 配置Spring內建的資料庫連線池 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
	    <property name="url" value="jdbc:mysql:///springjdbcdb"/>
	    <property name="username" value="root"/>
	    <property name="password" value="NULIFENDOU520"/>	
	</bean>
	<!-- 配置Spring的JDBC模板 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	    <property name="dataSource" ref="dataSource"/>	
	</bean>
  •  測試類(用到了Spring整合Junit和註解,因此要把對應的包引進去)
package com.itykd.spring.jdbc;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class JDBCDemo {

	@Resource(name="jdbcTemplate")
	private JdbcTemplate jdbcTemplate;

	@Test
	public void demo() {
		jdbcTemplate.update("insert into account values(null,?,?)","kobe",1000d);
		
	}

上述使用的是Spring預設的連線池,也可以換成其他開源你的連線池,比如C3P0和DBCP,具體如下:

3 其他開源連線池的使用

3.1 DBCP的使用

  • 引入jar包

            com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar

            com.springsource.org.apache.commons.pool-1.5.3.jar

  • 配置DBCP連線池
	<!-- 配置DBCP資料庫連線池 -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
	    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
	    <property name="url" value="jdbc:mysql:///springjdbcdb"/>
	    <property name="username" value="root"/>
	    <property name="password" value="NULIFENDOU520"/>	
	</bean>
	<!-- 配置Spring的JDBC模板 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	    <property name="dataSource" ref="dataSource"/>	
	</bean>

3.2 C3P0的使用

  • 引入jar包

              com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

  • 配置C3P0連線池
    <!-- 配置C3P0連線池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
	    <property name="jdbcurl" value="jdbc:mysql:///springjdbcdb"/>
	    <property name="user" value="root"/>
	    <property name="password" value="NULIFENDOU520"/>		
	</bean>
	<!-- 配置Spring的JDBC模板 -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
	    <property name="dataSource" ref="dataSource"/>	
	</bean>

4 在Spring的配置檔案中引入屬性檔案

 通常資料庫的檔案不會直接配置到Spring中,而是會單獨管理,這樣也易於維護

4.1 定義一個屬性檔案(jdbc.properties)

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///springjdbcdb
jdbc.username=root
jdbc.password=NULIFENDOU520

4.2 在Spring的配置檔案中引入屬性檔案

  • 方式一(通過一個bean標籤引入,用的比較少)

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="location" value="classpath:jdbc.properties" />	
    </bean>
  • 方式二(用context標籤引入)
	<!-- 通過context標籤引入 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>

4.3 修改連線池的配置(以C3P0為例)

修改<property>標籤中的value屬性

		<!-- 配置C3P0連線池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
	    <property name="driverClass" value="${jdbc.driverClass}"/>
	    <property name="jdbcurl" value="${jdbc.url}"/>
	    <property name="user" value="${jdbc.username}"/>
	    <property name="password" value="${jdbc.password}"/>		
	</bean>

5 使用JDBC模板進行CRUD操作

5.1 儲存

	public void insertDemo() {
		jdbcTemplate.update("insert into account values(null,?,?)","kobe",1000d);
	}

5.2 修改

	public void updateDemo() {
		jdbcTemplate.update("update account set name=?,money=? where id=?","kobe",5000d,2);
	}

5.3 刪除

	public void deleteDemo() {
		jdbcTemplate.update("delete from account where id=?",2);
	}

5.4 查詢

5.4.1 查詢某個屬性

	public void findDemo() {
		//查詢id=2的名字
		String name = jdbcTemplate.queryForObject("select name from account where id=?", String.class,2);
		//統計查詢
		Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
	}

5.4.2 查詢返回物件或集合

  • 提供一個Account類
package com.itykd.domain;

public class Account {
	
	private Integer id;
	private String name;
	private Double money;
	public void setId(Integer id) {
		this.id = id;
	}
	public void setName(String name) {
		this.name = name;
	}
	public void setMoney(Double money) {
		this.money = money;
	}

}
  • 實現一個RowMapper介面
package com.itykd.domain;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class MyRowMapper implements RowMapper<Account>{

	@Override
	public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
		Account account = new Account();
		account.setId(rs.getInt("id"));
		account.setName(rs.getString("name"));
		account.setMoney(rs.getDouble("money"));		
		return account;
	}

}
  • 完成資料封裝
	public void findObjectDemo() {
		List<Account>list=jdbcTemplate.query("select * from account", new MyRowMapper());
		System.out.println(list.size());		
	}