手把手教你如何配置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层装配SimpleJdbcTemplatepackage 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
相关文章推荐
- maveb实战第八篇_08_yucong_maven命令在eclipse中运行及自定义
- 项目总结: MyBatis-paginator实现分页
- MyEclipse中利用Hibernate反向工程生成Java Web项目的实体类
- JAVA第二周学习任务
- Spring整合hibernate的一个例子:用事务买书
- Spring整合hibernate的一个例子:用事务买书
- 【spring】关于location路径的设置(classpath、file、file+system property)
- 设计原则 - 开闭原则
- Java 日志性能优化
- 【上古秘籍】之Eclipse的秘籍
- Ubuntu12.04安装Java环境和Eclipse
- Java Gradle入门指南之依赖管理(添加依赖、仓库、版本冲突) (转)
- java学习日记——多态中的引用类型转换
- JAVA_SWING_ 界面风格
- xml方式实现spring的声明式事务管理及对jdbc操作的支持
- Java Web Filter登录验证
- 针对非maven模式的JAVA项目进行sonar-runner配置
- java几个小数取整例子
- java配置环境变量
- Java常用排序算法(一):插入排序