JdbcTemplate系列(⼀)----使⽤详解
⼀、简介
1.什么是JDBC模板(jdbcTemplate)
JDBC--->Java Data Base Connectivity,java数据库连接,简单点说就是可以为多种关系数据库提供统⼀访问,由⼀组⽤java 语⾔编写的类和接⼝组成。
模板就是事先准备好的东西,你只需要去套⽤就可以,JDBCTemplate就是这样的模板,通过设置JDBCTemplate可以减少对数据库的繁琐操作,例如连接数据库,获得链接关闭,获得statement,resultset,preparedstatement这些等等。
2.传统的JDBC与Spring JDBC区别
2.1、传统的JDBC应⽤步骤:
1.指定数据库连接参数
2.打开数据库连接
3.声明SQL语句
4.预编译并执⾏SQL语句
5.遍历查询结果(如果需要的话)
6.处理每⼀次遍历操作
7.处理抛出的任何异常
8.处理事务
9.关闭数据库连接
JDBC的缺点就是太⿇烦了,不易编码,容易出错,不利于开发者把精⼒投⼊到业务上去。简化JDBC就是新技术的⽬标。象Spring,hibernate等都通过对JDBC进⾏封装,以达到简化开发的⽬的。但是这些技术在⾃⾝侧重上略有不同。如Hibernate 主要进⾏Object/Relational Mapping。
2.2、Spring JDBC
resultset 遍历Spring的JDBC: 节省代码,不管连接(Connection),不管事务,不管异常,不管关闭(con.close() ps.cl
ose )
3.Spring如何封装的JDBC
3.1、Spring JDBC包结构
Spring JDBC抽象框架由四个包构成: core、dataSource、object以及support。
org.包由JdbcTemplate类以及相关的回调接⼝(callback interface)和类组成。
org.springframework.jdbc.datasource包由⼀些⽤来简化DataSource访问的⼯具类,以及各种DataSource接⼝的简单实现(主要⽤于单元测试以及在J2EE容器之外使⽤JDBC)组成。⼯具类提供了⼀些静态⽅法,诸如通过JNDI获取数据连接以及在必要的情况下关闭这些连接。它⽀持绑定线程的连接,⽐如被⽤于DataSourceTransactionManager的连接。
接下来,org.springframework.jdbc.object包由封装了查询、更新以及存储过程的类组成,这些类的对象都是线程安全并且可重复使⽤的。它们类似于JDO,与JDO的不同之处在于查询结果与数据库是“断开连接”的。它们是在
org.包的基础上对JDBC更⾼层次的抽象。
最后,org.springframework.jdbc.support包提供了⼀些SQLException的转换类以及相关的⼯具类。
在JDBC处理过程中抛出的异常将被转换成org.springframework.dao包中定义的异常。因此使⽤Spring JDBC进⾏开发将不需要处理JDBC或者特定的RDBMS才会抛出的异常。所有的异常都是unchecked exception,这样我们就可以对传递到调⽤者的异常进⾏有选择的捕获。
4.JdbcTemplate
Spring对数据库的操作在jdbc上⾯做了深层次的封装,使⽤spring的注⼊功能,可以把DataSource注册到JdbcTemplate 之中。
JdbcTemplate位于中。其全限定命名为org.JdbcTemplate。要使⽤JdbcTemlate还需⼀个这个包包含了⼀下事务和异常控制
4.1、JdbcTemplate主要提供以下五类⽅法:
execute⽅法:可以⽤于执⾏任何SQL语句,⼀般⽤于执⾏DDL语句;
update⽅法及batchUpdate⽅法:update⽅法⽤于执⾏新增、修改、删除等语句;batchUpdate⽅法⽤于执⾏批处理相关语句;
query⽅法及queryForXXX⽅法:⽤于执⾏查询相关语句;
call⽅法:⽤于执⾏存储过程、函数相关语句。
4.2、JdbcTemplate类⽀持的回调类:
预编译语句及存储过程创建回调:⽤于根据JdbcTemplate提供的连接创建相应的语句;
PreparedStatementCreator:通过回调获取JdbcTemplate提供的Connection,由⽤户使⽤该Conncetion创建相关的PreparedStatement;
CallableStatementCreator:通过回调获取JdbcTemplate提供的Connection,由⽤户使⽤该Conncetion创建相关的CallableStatement;
预编译语句设值回调:⽤于给预编译语句相应参数设值;
PreparedStatementSetter:通过回调获取JdbcTemplate提供的PreparedStatement,由⽤户来对相应的预编译语句相应参数设值;
BatchPreparedStatementSetter:;类似于PreparedStatementSetter,但⽤于批处理,需要指定批处理⼤⼩;
⾃定义功能回调:提供给⽤户⼀个扩展点,⽤户可以在指定类型的扩展点执⾏任何数量需要的操作;
ConnectionCallback:通过回调获取JdbcTemplate提供的Connection,⽤户可在该Connection执⾏任何数量的操作;
StatementCallback:通过回调获取JdbcTemplate提供的Statement,⽤户可以在该Statement执⾏任何数量的操作;
PreparedStatementCallback:通过回调获取JdbcTemplate提供的PreparedStatement,⽤户可以在该PreparedStatement执⾏任何数量的操作;
CallableStatementCallback:通过回调获取JdbcTemplate提供的CallableStatement,⽤户可以在该CallableStatement执⾏任何数量的操作;
结果集处理回调:通过回调处理ResultSet或将ResultSet转换为需要的形式;
RowMapper:⽤于将结果集每⾏数据转换为需要的类型,⽤户需实现⽅法mapRow(ResultSet rs, int rowNum)来完成将每⾏数据转换为相应的类型。
RowCallbackHandler:⽤于处理ResultSet的每⼀⾏结果,⽤户需实现⽅法processRow(ResultSet rs)
来完成处理,在该回调⽅法中⽆需执⾏rs.next(),该操作由JdbcTemplate来执⾏,⽤户只需按⾏获取数据然后处理即可。
ResultSetExtractor:⽤于结果集数据提取,⽤户需实现⽅法extractData(ResultSet rs)来处理结果集,⽤户必须处理整个结果集;
4.3、配置JdbcTemplate
要使⽤Jdbctemplate 对象来完成jdbc 操作。通常情况下,有三种种⽅式得到JdbcTemplate 对象。
第⼀种⽅式:我们可以在⾃⼰定义的DAO 实现类中注⼊⼀个DataSource 引⽤来完成JdbcTemplate 的实例化。也就是它是从外部“注⼊” DataSource 到DAO 中,然后⾃⼰实例化JdbcTemplate,然后将DataSource 设置到JdbcTemplate 对象中。
第⼆种⽅式:在 Spring 的 IoC 容器中配置⼀个 JdbcTemplate 的 bean,将 DataSource 注⼊进来,然后再把JdbcTemplate 注⼊到⾃定义DAO 中。
第三种⽅式: Spring 提供了 org.support.JdbcDaoSupport 类,这个类中定义了JdbcTemplate 属性,也定义了DataSource 属性,当设置DataSource 属性的时候,会创建jdbcTemplate 的实例,所以我们⾃⼰编写的DAO 只需要继承JdbcDaoSupport 类,然后注⼊DataSour
ce 即可。提倡采⽤第三种⽅法。
第⼀种:
public class UserServiceImpl implements UserService {
private JdbcTemplate jdbcTemplate;
public JdbcTemplate getJdbcTemplate() {
return jdbcTemplate;
}
//注⼊⽅法1
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
/
/其它⽅法这⾥省略……
}
spring配置⽂件为:
<bean id="jdbcTemplate" class="org.JdbcTemplate">
<property name = "dataSource" ref="dataSource">
</bean>
<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
第⼆种:
public class UserServiceImpl implements UserService {
private JdbcTemplate jdbcTemplate;
//注⼊⽅法2
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
//其它⽅法省略……
}
spring配置⽂件为:
<bean id="userService" class="com.hxzy.account.jdbcTemplate.UserServiceImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
第三种:继承JdbcDaoSupport,其内部有个JdbcTemplate ,需要注⼊DataSource 属性来实例化。
public class UserDaoImpl extends JdbcDaoSupport implements UserDao {
@Override
public void save(User user) {
String sql = null;
}
//其它⽅法省略……
}
spring配置⽂件为:
<bean id="userDao" class="com.hxzy.account.jdbcTemplate.UserDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
⼆、详解
1.利⽤JDBC核⼼类实现JDBC的基本操作和错误处理
1.1、JdbcTemplate类
JdbcTemplate是core包的核⼼类。它替我们完成了资源的创建以及释放⼯作,从⽽简化了我们对JDBC的使⽤。它还可以帮助我们避免⼀些常见的错误,⽐如忘记关闭数据库连接。JdbcTemplate将完成JDBC核⼼处理流程,⽐如SQL语句的创建、执⾏,⽽把SQL语句的⽣成以及查询结果的提取⼯作留给我们的应⽤代码。它可以完成SQL查询、更新以及调⽤存储过程,可以对ResultSet进⾏遍历并加以提取。它还可以捕获JDBC异常并将其转换成org.springframework.dao包中定义的,通⽤的,信息更丰富的异常。
使⽤JdbcTemplate进⾏编码只需要根据明确定义的⼀组契约来实现回调接⼝。PreparedStatementCreator回调接⼝通过给定的Connection创建⼀个PreparedStatement,包含SQL和任何相关的参数。CallableStatementCreateor实现同样的处理,只不过它创建的是CallableStateme
nt。RowCallbackHandler接⼝则从数据集的每⼀⾏中提取值。
我们可以在⼀个service实现类中通过传递⼀个DataSource引⽤来完成JdbcTemplate的实例化,也可以在application context中配置⼀个JdbcTemplate bean,来供service使⽤。需要注意的是DataSource在application context总是配制成⼀个bean,第⼀种情况下,DataSource bean将传递给service,第⼆种情况下DataSource bean传递给JdbcTemplate bean。因为JdbcTemplate使⽤回调接⼝和SQLExceptionTranslator接⼝作为参数,所以⼀般情况下没有必要通过继承JdbcTemplate来定义其⼦类。
JdbcTemplate中使⽤的所有SQL将会以“DEBUG”级别记⼊⽇志(⼀般情况下⽇志的category是JdbcTemplate相应的全限定类名,不过如果需要对JdbcTemplate进⾏定制的话,可能是它的⼦类名)。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论