JavaWeb 之 Spring JDBC 模板技术

Spring JDBC 模板技术


Spring 框架的 JDBC 模板技术


Spring 框架的 JDBC 模板技术概述

  1. Spring 框架中提供了很多持久层的模板类来简化编程,使用模板类编写程序会变的简单。

  2. 提供了 JDBC 模板,Spring 框架提供的

    JdbcTemplate

  3. Spring 框架可以整合 Hibernate 框架,也提供了模板类

    HibernateTemplate

演示 JDBC 的模板类

步骤一:创建数据库的表结构

1
2
3
4
5
6
7
create database spring04;
use spring04;
create table t_account(
id int primary key auto_increment,
name varchar(20),
money double
);

步骤二:引入开发的 jar 包

  • 先引入 IoC 基本的 jar 包(6个),还有1个 test 的包
  • 再引入 Spring-aop 的 jar 包(1个)
  • 最后引入 JDBC模板 需要的 jar 包:

    MySQL 数据库的驱动包:mysql-connector-java-5.1.7-bin.jar
    Spring-jdbc.jar
    事务管理:Spring-tx.jar

一共 11 个包。

步骤三:编写测试代码(自己来 new 对象的方式)

new 对象的方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {
/**
* 演示模板类
*/
@Test
public void run1() {
// Spring 框架提供了内置的连接池,不想使用内置,整合其他的连接池
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring04");
dataSource.setUsername("root");
dataSource.setPassword("541638");
// 创建模板类
JdbcTemplate template = new JdbcTemplate();
// 设置连接池
template.setDataSource(dataSource);
// 完成操作
template.update("insert into t_account values (null,?,?)", "小西", 10000);

}
}

使用 Spring 框架来管理模板类

现在应该把这些类交给 Spring 框架来管理。

Spring 框架管理开源的连接池

步骤一:Spring 配置内置的连接池

1
2
3
4
5
6
7
<!--配置内置的连接池-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring04"/>
<property name="username" value="root"/>
<property name="password" value="541638"/>
</bean>

步骤二:Spring 管理模板类

1
2
3
4
<!--配置 JDBC 的模板类-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>

步骤三:编写测试程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
* 测试 JDBC 的模板类,使用 IoC 的方式
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1_1 {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;

@Test
public void run1() {
jdbcTemplate.update("insert into t_account values (null,?,?)", "小关", 10000);
}
}

Spring 框架管理开源的连接池

管理 DBCP 连接池

  • 先引入 DBCP 的 2 个 jar 包

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

  • 编写配置文件:

1
2
3
4
5
6
7
<!--配置 DBCP 连接池-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring04"/>
<property name="username" value="root"/>
<property name="password" value="541638"/>
</bean>

使用方法类似。

管理 C3P0 连接池

  • 先引入 C3P0 的 jar 包

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

  • 编写配置文件:

1
2
3
4
5
6
7
<!--配置 C3P0 连接池-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///spring04"/>
<property name="user" value="root"/>
<property name="password" value="541638"/>
</bean>

使用方法类似。

Spring 框架的 JDBC 模板的简单操作

增删改查的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package com.renkaigis.demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
* 测试 JDBC 的模板类,使用 IoC 的方式
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1_1 {
@Resource(name = "jdbcTemplate")
private JdbcTemplate jdbcTemplate;

// 插入操作
@Test
public void run1() {
jdbcTemplate.update("insert into t_account values (null,?,?)", "小关", 10000);
}

// 修改操作
@Test
public void run2() {
jdbcTemplate.update("update t_account set name = ? where id = ? ", "小马", 2);
}

// 删除操作
@Test
public void run3() {
jdbcTemplate.update("delete from t_account where id = ? ", 2);
}

// 测试查询:通过主键查询一条记录
@Test
public void run4() {
Account account = jdbcTemplate.queryForObject("select * from t_account where id = ?", new BeanMapper(), 1);
System.out.println(account);
}

// 查询所有的数据
@Test
public void run5() {
List<Account> list = jdbcTemplate.query("select * from t_account", new BeanMapper());
System.out.println(list);
}
}

/**
* 自己手动封装数据(一行一行封装数据)
*/
class BeanMapper implements RowMapper<Account> {

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

查询部分所需要的 JavaBean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package com.renkaigis.demo1;

public class Account {
private Integer id;
private String name;
private Double money;

public Integer getId() {
return id;
}

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

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Double getMoney() {
return money;
}

public void setMoney(Double money) {
this.money = money;
}

@Override
public String toString() {
return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}';
}
}