作者:niumd,转载请注明出处,谢谢
发表时间:2010 年 03 月 17 日
原文链接:http://ari.iteye.com/admin/blogs/618449
一、Spring JDBC 概述
Spring 提供了一个强有力的模板类JdbcTemplate简化JDBC操作,DataSource,JdbcTemplate都可以以Bean的方式定义在想xml配置文件,JdbcTemplate创建只需注入一个DataSource,应用程序Dao层只需要继承JdbcDaoSupport, 或者注入JdbcTemplate,便可以获取JdbcTemplate,JdbcTemplate是一个线程安全的类,多个Dao可以注入一个JdbcTemplate;
-
-
<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:@oracle.devcake.co.uk:1521:INTL"/>
-
<property name="username" value="sa"/>
-
<property name="password" value=""/>
-
</bean>
-
-
-
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
-
<property name="dataSource" ref="dataSource"/>
-
</bean>
-
-
<bean id="customerDao" class="JdbcCustomerDao" >
-
<property name="jdbcTemplate" ref="jdbcTemplate"/>
-
</bean>
-
-
<bean id="customerDao" class="JdbcCustomerDao" >
-
<property name="dataSource" ref="dataSource"/>
-
</bean>
<!-- Oracle数据源 -->
<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:@oracle.devcake.co.uk:1521:INTL"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- set注入方式获取jdbcTemplate -->
<bean id="customerDao" class="JdbcCustomerDao" >
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<!-- 注入dataSource,customerDao通过继承JdbcDaoSupport ,使用this.getJdbcTemplate()获取JdbcTemplate -->
<bean id="customerDao" class="JdbcCustomerDao" >
<property name="dataSource" ref="dataSource"/>
</bean>
然后将jdbcTemplate对象注入自定义的Dao、或者继承JdbcDaoSupport,例如:
- public class JdbcCustomerDao extends JdbcDaoSupport implements CustomerDao {
- }
-
-
public class JdbcCustomerDao implements CustomerDao {
-
-
private JdbcTemplate jdbcTemplate
-
-
public void setJdbcTemplate()JdbcTemplate jdbcTemplate{
-
this.jdbcTemplate=jdbcTemplate
- }
- }
public class JdbcCustomerDao extends JdbcDaoSupport implements CustomerDao {
}
public class JdbcCustomerDao implements CustomerDao {
private JdbcTemplate jdbcTemplate
public void setJdbcTemplate()JdbcTemplate jdbcTemplate{
this.jdbcTemplate=jdbcTemplate
}
}
二、 JdbcTemplate 提供以下主要方法简化JDBC操作:
2.1、List query(String sql,Ojbect[] args,RowMapper rowMapper)
说明:常用的查询,sql待执行的sql语句,args是sql语句的参数,rowMapper负责将每一行记录转化为java对象存放在list,并最终返回,例如:
- public List<Book> queryByAuthor(String author) {
-
String sql = "select * from book where author=?";
- Collection c = getJdoTemplate().find(sql,
-
new Object[] { author },new BookRowMapper());
-
List<Book> books = new ArrayList<Book>();
- books.addAll(c);
-
return books;
- }
-
-
class BookRowMapper implements RowMapper{
-
public Object mapRow(ResultSet res, int index) throws SQLException {
-
Book book = new Book();
-
book.setId(rs.getInt("id"));
-
return book;
- }
- }
public List<Book> queryByAuthor(String author) {
String sql = "select * from book where author=?";
Collection c = getJdoTemplate().find(sql,
new Object[] { author },new BookRowMapper());
List<Book> books = new ArrayList<Book>();
books.addAll(c);
return books;
}
class BookRowMapper implements RowMapper{
public Object mapRow(ResultSet res, int index) throws SQLException {
Book book = new Book();
book.setId(rs.getInt("id"));
//省略set
return book;
}
}
更新、删除、其他查询操作类似,举例如下,详细细节请参考spring api:
-
public long getAverageAge() {
-
return getJdbcTemplate().queryForLong("SELECT AVG(age) FROM employee");
- }
-
public int getTotalNumberOfEmployees() {
-
return getJdbcTemplate().queryForInt("SELECT COUNT(0) FROM employees");
- }
-
-
this.jdbcTemplate.update(
-
"insert into t_actor (first_name, surname) values (?, ?)",
-
new Object[] {"Leonor", "Watling"});
//返回值为一个长整形
public long getAverageAge() {
return getJdbcTemplate().queryForLong("SELECT AVG(age) FROM employee");
}
//返回一个整数
public int getTotalNumberOfEmployees() {
return getJdbcTemplate().queryForInt("SELECT COUNT(0) FROM employees");
}
//更新操作
this.jdbcTemplate.update(
"insert into t_actor (first_name, surname) values (?, ?)",
new Object[] {"Leonor", "Watling"});
2.2、spring 2.5新功能,另类的jdbc ORM:BeanPropertyRowMapper
上面我们检索时必须实现RowMapper,将结果集转化为java对象。Spring2.5 简化了这一操作,使得我们不必再实现RowMapper,实现此功能的俩个神奇东东便是:ParameterizedRowMapper,ParameterizedBeanPropertyRowMapper,貌似通过java反射机制实现了将resultset字段映射到java对象,但是数据表的列必须和java对象的属性对应,没有研究源码,有点类似于apache 的BeanUtil,不知为何这部分在spring开发参考手册没有,难道不是经典。
-
@SuppressWarnings({"unchecked"})
-
public List<Customer> getAll() {
-
return getJdbcTemplate().query("select * from t_customer", ParameterizedBeanPropertyRowMapper.newInstance(Customer.class));
- }
-
-
@SuppressWarnings({"unchecked"})
-
public List<Customer> getAll() {
-
return getJdbcTemplate().query("select * from t_customer", new BeanPropertyRowMapper(Customer.class));
- }
//使用ParameterizedBeanPropertyRowMapper
@SuppressWarnings({"unchecked"})
public List<Customer> getAll() {
return getJdbcTemplate().query("select * from t_customer", ParameterizedBeanPropertyRowMapper.newInstance(Customer.class));
}
//使用BeanPropertyRowMapper
@SuppressWarnings({"unchecked"})
public List<Customer> getAll() {
return getJdbcTemplate().query("select * from t_customer", new BeanPropertyRowMapper(Customer.class));
}
注意:ParameterizedBeanPropertyRowMapper是BeanPropertyRowMapper子类。另外表的字段名称必须和实体类的成员变量名称一致;
2.3、spring之JDBC批量操作
jdbcTemplate.batchUpdate(final String[] sql) ,API解释:Issue multiple SQL updates on a single JDBC Statement using batching,翻译过来大致为:解决多个sql的插入、更新、删除操作在一个Statement中。性能一般。
jdbcTemplate.batchUpdate(String sql, final BatchPreparedStatementSetter pss),类似于JDBC的PreparedStatement,性能较上着有所提高。
我们举例说明如何使用,示例如下:
- final int count = 2000;
-
final List<String> firstNames = new ArrayList<String>(count);
-
final List<String> lastNames = new ArrayList<String>(count);
-
for (int i = 0; i < count; i++) {
-
firstNames.add("First Name " + i);
-
lastNames.add("Last Name " + i);
- }
- jdbcTemplate.batchUpdate(
-
"insert into customer (id, first_name, last_name, last_login, comments) values (?, ?, ?, ?, ?)",
-
new BatchPreparedStatementSetter() {
-
public void setValues(PreparedStatement ps, int i) throws SQLException {
-
ps.setLong(1, i + 10);
-
ps.setString(2, firstNames.get(i));
-
ps.setString(3, lastNames.get(i));
-
ps.setNull(4, Types.TIMESTAMP);
-
ps.setNull(5, Types.CLOB);
- }
-
public int getBatchSize() {
-
return count;
- }
- });
- }
final int count = 2000;
final List<String> firstNames = new ArrayList<String>(count);
final List<String> lastNames = new ArrayList<String>(count);
for (int i = 0; i < count; i++) {
firstNames.add("First Name " + i);
lastNames.add("Last Name " + i);
}
jdbcTemplate.batchUpdate(
"insert into customer (id, first_name, last_name, last_login, comments) values (?, ?, ?, ?, ?)",
new BatchPreparedStatementSetter() {
//为prepared statement设置参数。这个方法将在整个过程中被调用的次数
public void setValues(PreparedStatement ps, int i) throws SQLException {
ps.setLong(1, i + 10);
ps.setString(2, firstNames.get(i));
ps.setString(3, lastNames.get(i));
ps.setNull(4, Types.TIMESTAMP);
ps.setNull(5, Types.CLOB);
}
//返回更新的结果集条数
public int getBatchSize() {
return count;
}
});
}
BatchSqlUpdate类是SqlUpdate 的子类,适用于插入、删除、更新批量操作,内部使用PreparedStatement,所以效率很高,批量语句达到设定的batchSize,或者手动调用flush才会执行批量操作。注意:此类是非线程安全的,必须为每个使用者创建一个实例,或者在同一个线程中使用前调用reset。
下面我们举例说明如何使用BatchSqlUpdate,来执行批量操作。示例如下:
- class BatchInsert extends BatchSqlUpdate {
-
private static final String SQL = "insert into t_customer (id, first_name, last_name, last_login, "
-
+ "comments) values (?, ?, ?, ?, null)";
-
- BatchInsert(DataSource dataSource) {
-
super(dataSource, SQL);
-
declareParameter(new SqlParameter(Types.INTEGER));
-
declareParameter(new SqlParameter(Types.VARCHAR));
-
declareParameter(new SqlParameter(Types.VARCHAR));
-
declareParameter(new SqlParameter(Types.TIMESTAMP));
-
-
setBatchSize(10);
- }
-
- }
class BatchInsert extends BatchSqlUpdate {
private static final String SQL = "insert into t_customer (id, first_name, last_name, last_login, "
+ "comments) values (?, ?, ?, ?, null)";
BatchInsert(DataSource dataSource) {
super(dataSource, SQL);
declareParameter(new SqlParameter(Types.INTEGER));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.VARCHAR));
declareParameter(new SqlParameter(Types.TIMESTAMP));
setBatchSize(10);
}
}
- int count = 5000;
-
for (int i = 0; i < count; i++) {
-
batchInsert.update(new Object[] { i + 100L, "a" + i, "b" + i, null });
- }
int count = 5000;
for (int i = 0; i < count; i++) {
batchInsert.update(new Object[] { i + 100L, "a" + i, "b" + i, null });
}
至此,spring JDBC主要的应用基本上都简单罗列一番,所有代码均为文章举例,不是很严谨,仅为演示每一种用法,抛砖引玉,希望有独特见解的拍砖,有问题的请指明问题所在,谢谢
分享到:
相关推荐
《Spring ORM框架详解》 在Java开发领域,Spring框架是一个不可或缺的重要组成部分,它以其模块化、松耦合的特性赢得了广大开发者的心。其中,`org.springframework.orm.jar`是Spring框架中的一个子模块,主要关注...
Spring JDBC和Spring ORM支持数据库操作,可以与各种ORM框架如Hibernate、MyBatis集成。Spring Web和Spring MVC则是为Web应用设计的,提供MVC架构模式。 在使用Spring 5.0.2.RELEASE中文注释版时,开发者可以清晰地...
- **数据访问**:支持JDBC、ORM(Object-Relational Mapping,对象关系映射)框架如Hibernate、MyBatis,以及JPA(Java Persistence API)等,提供统一的接口来简化数据操作。 - **Web支持**:Spring MVC是其Web层...
3. **数据访问**:支持JDBC、ORM(Object-Relational Mapping,对象关系映射)框架如Hibernate、JPA,简化了数据库操作。 4. **Web支持**:Spring MVC为构建Web应用提供了模型-视图-控制器架构,支持RESTful服务,...
- **数据访问**:Spring支持JDBC、ORM(对象关系映射)框架如Hibernate和MyBatis,以及JPA(Java Persistence API),提供了数据访问的抽象层,简化了数据库操作。 - **Web模块**:包括Spring MVC(模型-视图-控制...
2. **Data Access/Integration**:包含了JDBC、ORM(对象关系映射)、OXM(对象XML映射)和JMS(Java消息服务)等数据访问层的支持。 3. **Web**:提供MVC(Model-View-Controller)框架,支持RESTful风格的Web服务...
2. **Data Access/Integration**:这一模块主要处理数据访问和集成,包括JDBC、ORM(对象关系映射)和OXM(对象XML映射)支持。Spring JDBC提供了一层抽象,简化了数据库操作;ORM支持Hibernate、JPA等ORM框架的集成...
- **Data Access/Integration**:涵盖了JDBC、ORM(对象关系映射)和OXM(对象XML映射)等模块,方便数据库操作和数据集成。 - **Web**:Web模块包括MVC(Model-View-Controller)框架,用于构建Web应用程序,支持...
数据访问/集成模块则支持JDBC、ORM(对象关系映射)和OXM(对象XML映射)等,方便数据库操作。 二、响应式编程 在5.0.0.M1版本中,Spring引入了对响应式编程的支持,这是对传统同步I/O模型的一种革新。借助Reactor...
4. **数据访问/集成**:包括JDBC、ORM(Object-Relational Mapping)支持,如Hibernate、JPA等,方便数据库操作。 5. **Web模块**:提供了MVC(Model-View-Controller)架构,用于构建Web应用程序。 三、源码结构...
3. **数据访问/集成**:Spring提供了JDBC抽象层,简化了数据库操作,并支持ORM(对象关系映射)框架如Hibernate和MyBatis的集成。3.1.1.RELEASE版本在数据源管理和事务管理方面有增强,使得数据库访问更加灵活和高效...
在数据访问/集成模块中,Spring 5.0.0.RELEASE提供了对JDBC、ORM(对象关系映射)、OXM(对象XML映射)和事务管理的支持。特别是对JPA和Hibernate等ORM框架的整合,使得开发者可以方便地进行数据操作和事务控制。 ...
Spring提供了对各种数据访问技术的支持,包括JDBC、ORM(Hibernate、MyBatis等)、JPA等,简化了数据库操作。 七、Spring Test Spring Test模块提供了对单元测试和集成测试的强大支持,如MockMVC用于模拟Spring MVC...
Spring 支持多种数据访问技术,包括 JDBC、ORM(对象关系映射)框架如 Hibernate 和 MyBatis,以及 JPA(Java Persistence API)。这些模块简化了数据库操作,提供了事务管理等高级功能。 6. **Spring Boot** ...
- **Spring JDBC**和**JPA**:提供对数据库操作的支持,JDBC抽象层简化了数据库访问,JPA则实现了ORM(对象关系映射)。 - **Spring Test**:包含了测试支持,帮助开发者进行单元测试和集成测试。 4. **5.3.7....
《Spring Framework M2详解》 Spring Framework作为Java领域的一个核心框架,因其强大的功能和灵活性而备受开发者喜爱。这里我们主要探讨的是Spring Framework的M2版本,即spring-framework-m2 jar包。这个版本在...
Spring支持多种数据访问技术,包括JDBC、ORM(对象关系映射)框架如Hibernate和MyBatis,以及NoSQL数据库。4.3.10版本进一步强化了对JPA(Java Persistence API)的支持,提供了更好的事务管理和数据访问控制。 六...
3. **数据访问集成**:Spring 3.2对JDBC、ORM(Object-Relational Mapping)框架如Hibernate、MyBatis等有良好的支持,提供了统一的抽象层,使得数据库操作更加简洁。 4. **Web MVC框架**:Spring MVC是Spring中的...
《Spring框架2.0-M1及其依赖详解》 Spring Framework是Java开发中广泛使用的轻量级框架,它为创建高效、灵活且可测试的应用程序提供了基础。本篇将深入探讨Spring Framework 2.0-M1版本及其依赖,帮助开发者更好地...
2. **Data Access/Integration**:该模块包含了JDBC、ORM(对象关系映射)、OXM(对象XML映射)等子模块,为数据访问提供了抽象层,简化了数据库操作。 3. **Web**:Spring的Web模块包含MVC、WebSocket等,提供了...