您的位置:首页 > 编程语言 > Java开发

手把手教你如何配置Spring JDBC

2016-03-20 02:50 525 查看

1 Spring的JDBC基本框架

Spring的JDBC框架是通过DAO层支持类来访问数据库的,DAO是数据访问对象(data access object)的缩写,如图所示是Spring的JDBC连接的基本步骤:



首先对图中的几个概念了解一下:

持久层框架(Persistence framework):Spring对多种持久层框架都支持,除了Spring自身以外,还对Hibernate和iBatis等框架也提供支持,这里主要将Spring的JDBC。

数据访问模板(Data acess template):数据访问模板类是Spring用来直接进行数据库操作的类,其中最基本的是我们非常熟悉的jdbc.core.JdbcTemplate,但是这里推荐使用的是jdbc.core.simple.SimpleJdbcTemplate,该模板类利用Java5的一些特性,如自动装箱、泛型以及可变参数列表来简化JDBC模板的使用。

DAO支持类(DAO support):DAO支持类是基于数据访问模板使用的,提供数据库支持的类。最基本的DAO支持类是jdbc.core.support.JdbcDaoSupport,它对应模板jdbc.core.JdbcTemplate;这里还是推荐使用jdbc.core.simple.SimpleJdbcDaoSupport,它对应于jdbc.core.simple.SimpleJdbcTemplate。具体如何使用呢,对于JdbcTemplate,调用其getJdbcTemplate()方法就可以获得JdbcTemplate并使用它。

应用程序DAO(Application DAO):实际开发中用来进行数据库操作的类,也就是我们熟悉的DAO层。只要在其中装配数据访问模板类(如SimpleJdbcTemplate),或者是让其继承DAO支持类(如SimpleJdbcDaoSupport)即可。

从上图我们可以知道Spring JDBC进行数据库操作是以下几个步骤:

应用程序DAO类继承DAO支持类

DAO支持类提供数据访问模板类

每一种数据访问模板都对应一种持久化框架,比如Spring的JdbcTemplate对应于Spring框架,Hibernate的HibernateTemplate对应于Hibernate框架

最后通过具体的某个持久化框架实现访问数据库

当然,由于实际进行数据库访问操作的类是数据访问模板类,所有我们也可以不继承DAO支持类,而是直接获取数据访问模板类。

2 在Spring中使用JDBC

2.1 配置数据源

Spring并没有提供数据源连接池实现,但是apache的DBCP是一个不错 选择,DBCP包含了多个提供连接池功能的数据源,其中BasicDataSource是最常使用的,在XML中的配置如下:

<!-- 数据源定义 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
<property name="username" value="KFDB" />
<property name="password" value="KFDB" />
<!-- 池启动时创建的连接数量 -->
<property name="initialSize" value="1" />
<!-- 同一时间可从池中分配的最多连接数,如果设置为0,表示无限制 -->
<property name="maxActive" value="50" />
<!-- 池里不会被释放的最多空闲连接数,如果设置为0,表示无限制 -->
<property name="maxIdle" value="5" />
<!-- 在不创建新连接的情况下,池中保持空闲的最小连接数 -->
<property name="minIdle" value="15" />
<!-- 在抛出异常之前,池等待连接回收的最大时间(当没有可用连接时),如果设置为-1,表示无限等待(毫秒) -->
<property name="maxWait" value="10000" />
<!-- 空闲池空闲连接激活线程的运行间隔时间(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 连接在池中保持空闲而不被回收的最大时间(毫秒) -->
<property name="minEvictableIdleTimeMillis" value="10000" />
</bean>


2.2 使用SimpleJdbcTemplate访问数据库

在DAO层装配SimpleJdbcTemplate

package com.trigl.springjdbc;

import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;

public class UserDao1 {

private SimpleJdbcTemplate jdbcTemplate;

public void setJdbcTemplate(SimpleJdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}

......
}


注意这里必须有setter方法,因为装配bean就是通过setter方法实现的。

XML中配置SimpleJdbcTemplate

<!-- SimpleJdbcTemplate -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean>

<!-- userDao1 -->
<bean id="userDao1" class="com.trigl.springjdbc.UserDao1">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>


执行insert操作

// insert语句
private static final String SQL_INSERT_USER =
"insert into jdbc_test (user_id, name, password, realname, email) values (seq_user.nextval, ?, ?, ?, ?)";

public void addUser(User user) {
jdbcTemplate.update(SQL_INSERT_USER,
user.getUsername(),
user.getPassword(),
user.getRealName(),
user.getEmail());
System.out.println("新增用户成功!用户信息为:" + user);
}


insert语句中的seq_user.nextval是oracle自动生成序列号的语法,其中seq_user是oracle数据库中的一个自增序列,如何创建自增序列见我的另一篇文章:

Oracle中常用的sql操作

其中User类如下:

package com.trigl.springjdbc;

public class User {
private String username; // 用户名
private String password; // 密码
private String realName; // 真实姓名
private String email; // 邮箱

public User() {}

public User(String username, String password, String realName, String email) {
super();
this.username = username;
this.password = password;
this.realName = realName;
this.email = email;
}

@Override
public String toString() {
return "User [username=" + username + ", password=" + "******"
+ ", realName=" + realName + ", email=" + email + "]";
}

public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}

}


测试类

package com.trigl.springjdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDao1Test {

public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/bean.xml");
UserDao1 userDao1 = (UserDao1)ctx.getBean("userDao1");
User user = new User("Trigl", "123456", "白鑫", "18810690994@163.com");
userDao1.addUser(user);
}

}


输出结果

新增用户成功!用户信息为:User [username=Trigl, password=******, realName=白鑫, email=18810690994@163.com]


2.3 使用SimpleJdbcDaoSupport访问数据库

DAO层类

package com.trigl.springjdbc;

import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;

public class UserDao2 extends SimpleJdbcDaoSupport {

// insert语句
private static final String SQL_INSERT_USER =
"insert into jdbc_test (user_id, name, password, realname, email) values (SEQ_USER.nextval, ?, ?, ?, ?)";

public void addUser(User user) {
this.getSimpleJdbcTemplate().update(SQL_INSERT_USER,
user.getUsername(),
user.getPassword(),
user.getRealName(),
user.getEmail());
System.out.println("新增用户成功!用户信息为:" + user);
}

}


XML配置

<!-- userDao1 -->
<bean id="userDao2" class="com.trigl.springjdbc.UserDao2">
<property name="dataSource" ref="dataSource"></property>
</bean>


测试类

package com.trigl.springjdbc;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserDao2Test {

public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("config/bean.xml");
UserDao2 userDao2 = (UserDao2)ctx.getBean("userDao2");
User user = new User("Trigl", "123456", "白鑫", "18810690994@163.com");
userDao2.addUser(user);
}

}


输出结果

新增用户成功!用户信息为:User [username=Trigl, password=******, realName=白鑫, email=18810690994@163.com]


可以看出来,相对来说使用SimpleJdbcDaoSupport来获得SimpleJdbcTemplate访问数据库比直接获得SimpleJdbcTemplate来访问数据库还是要方便一些的。

OVER
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: