0%

jdbcTemplate

dbcp在连接数超过最大值时,所有链接都会断开。没有自动回收空闲的功能。

c3p0在连接超过最大空闲连接时间时,会断掉当前连接。有自动回收空闲的功能。

jdbcTemplate是Spring提供的操作数据库的功能。

环境搭建

创建数据库和表

1
2
3
4
5
6
7
8
9
10
create databese spring;
use spring;
create table t_user(
id int primary key auto_increment,
username varchar(50),
password varchar(32)
);

insert into t_user(username,password)values('jack','123');
insert into t_user(username,password)values('rose','456');

创建bean,数据模型

1
2
3
4
5
6
public class User{
private Integer id;
private String username;
private String password;
//以及属性的setter和getter
}

API的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Demo{
@Test
public void test(){
//连接数据库
BasicDataSopurce ds = new BasicDataSource();
ds.setDicerClassName("com.nysql.jdbc.Driver");
ds.setUrl("jdbc:mysql:///spring");
ds.setUsername("root");
ds.setPassword("123456");

//创建模板
JdbcTemplate jt = new JdbcTempalte(dataSource);
jt.update("insertr into t_user(username,password) value(?,?);","name03","777");
}
}

XML配置

通过上面api使用中可以发现,用到的类有BasicDataSopurce,JdbcTemplate。以及实际在项目中,我们应该通过Dao类调用数据库。这些类都可以通过Spring创建。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--配置DBCP的datasource对象-->
<bean id="dataSource" class="com.apache.commons.dbcp.BasicDataSource">
<property name="dicerClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>

<!--配置jdbctemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.jdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置dao-->
<bean id="userDao" class="com.Retur0.dao.UserDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

上面是使用DBCP的数据源,下面使用c3p0的数据源,区别在于数据库连接的参数的属性名不一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!--配置c3p0的datasource对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="dicerClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///spring"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>

<!--配置jdbctemplate对象-->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.jdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--配置dao-->
<bean id="userDao" class="com.Retur0.dao.UserDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>

JdbcDaoSupport

JdbcDaoSupport类中含有jdbcTemplate和datasource,可以简化上面的过程。

dao成继承JdbcDaoSupport:

1
2
3
4
5
6
7
public class UserDaoImpl extends JdbcDaoSupport implements IUserDao{
@Override
public void add(User user){
//调用父类的getJdbcTemplate方法
getJdbcTemplate().update("insertr into t_user(username,password) value(?,?);","name03","777");
}
}

在xml中的配置就简化了:

1
2
3
4
5
6
7
8
9
10
11
12
<!--配置c3p0的datasource对象-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="dicerClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///spring"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</bean>

<!--配置dao-->
<bean id="userDao" class="com.Retur0.dao.UserDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>

抽取数据库信息

在src目录下写db.properties

1
2
3
4
driverClass=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql:///spring
user=root
password=123456

beans.xml

1
2
3
4
5
6
7
8
<context:proterty-placeholder location="classpath:db.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="dicerClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
</bean>