`

spring JDBC描述

阅读更多
一、Spring JDBC 概述

     Spring 提供了一个强有力的模板类JdbcTemplate简化JDBC操作,DataSource,JdbcTemplate都可以以Bean的方式定义在想xml配置文件,JdbcTemplate创建只需注入一个DataSource,应用程序Dao层只需要继承JdbcDaoSupport, 或者注入JdbcTemplate,便可以获取JdbcTemplate,JdbcTemplate是一个线程安全的类,多个Dao可以注入一个JdbcTemplate;

 

Xml代码 
<!--         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>  
  
<bean id="customerDao" class="JdbcCustomerDao" >  
         <property name="dataSource" ref="dataSource"/>  
</bean>  

然后将jdbcTemplate对象注入自定义的Dao、或者继承JdbcDaoSupport,例如:

Java代码 
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,并最终返回,例如:

Java代码 
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;   
    }   
}  

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:

 

Java代码 
//返回值为一个长整形   
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开发参考手册没有,难道不是经典。

 

 

Java代码 
//使用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
@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,性能较上着有所提高。

   我们举例说明如何使用,示例如下:

Java代码 
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;   
              }   
            });   
  }  

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,来执行批量操作。示例如下:

Java代码 
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);
  }

}
 

Java代码 
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 });
    }
 


分享到:
评论

相关推荐

    springjdbc.zip_SpringJDBC_spring jdbc_spring 增删改查_springjdbc xml

    4. **XML配置**:在描述中提到了`springjdbc_xml`,这表明压缩包可能包含了一个或多个XML配置文件。在Spring中,我们可以通过XML配置文件来定义bean,包括`JdbcTemplate`实例和`DataSource`,以及事务管理器等。 5....

    最简单的用户登录与注册系统 spring mvc spring jdbc

    【描述】"用spring4.0.5版本开发的,spring mvc,spring jdbc,最简单的用户登录,注册和修改的系统。适合初学者学习。" 该项目使用的是Spring 4.0.5版本,这是一个稳定且广泛使用的版本。通过Spring MVC,开发者...

    maven-springMVC-springJDBC-Demo

    【标题】"maven-springMVC-springJDBC-Demo"是一个综合性的项目示例,它演示了如何使用Maven、Spring MVC和Spring JDBC在Java Web开发中构建一个简单的应用。这个Demo旨在帮助开发者理解这三大技术的集成与协同工作...

    Spring JDBC实现代码

    Spring JDBC模块是Spring框架的一部分,它简化了Java Database Connectivity (JDBC)的使用,使得数据库操作更加简单且易于管理。本篇文章将深入探讨如何使用Spring JDBC在Spring 2.5版本中与MySQL数据库进行交互,...

    spring jdbc 事务

    在描述中提到的博客链接(由于实际链接无法访问,这里无法提供具体细节),可能详细讲述了如何在Spring中配置和使用JDBC事务,包括示例代码和常见问题解决。在实际项目中,理解并正确应用这些事务管理机制对于保证...

    Spring jdbc的codesmith模版

    在描述中提到的博客链接(由于实际无法访问,以下内容基于对Spring JDBC和Codesmith的一般理解)可能会介绍如何设置和使用这些模板,以及它们如何与Spring JDBC框架集成。Spring JDBC是Spring框架的一个部分,提供了...

    spring jdbc

    描述中的博客链接指向了 iteye.com 上的一篇博客文章,虽然具体内容无法在这里直接引用,但通常这样的文章会涵盖 Spring JDBC 的基础概念、配置、使用方法,以及可能包括一些最佳实践或常见问题的解决方案。...

    springMvc-spring+jdbc实例

    在本实例中,我们将探讨如何将Spring MVC、Spring和Spring JDBC进行整合,以构建一个完整的Web应用程序。这个组合使得开发者可以充分利用Spring框架的组件来管理依赖、处理HTTP请求以及执行数据库操作。 首先,我们...

    spring-jdbc-4.2.xsd.zip

    `spring-jdbc-4.2.xsd`是Spring 4.2版本的JDBC配置XML Schema定义,它定义了一系列元素和属性,用来描述如何配置Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcInsert等核心组件,以及事务管理相关...

    spring+springmvc+springjdbc+redis

    标题中的"spring+springmvc+springjdbc+redis"是一个典型的Java Web开发技术组合,涵盖了Spring框架的核心组件,Spring MVC作为Web层的处理框架,Spring JDBC用于数据库操作,以及Redis作为高速缓存系统。...

    spring-jdbc-4.1.1.RELEASE.zip

    在描述中提到了"spring-framework.zip"和"spring jmsspring框架",这暗示了Spring不仅包括JDBC模块,还有JMS(Java Message Service)模块,用于实现消息传递。Spring对JMS的支持,使得开发者能够轻松集成消息中间件...

    Lucene+compass+spring+jdbc+庖丁的一个例子

    标题中的“Lucene+compass+spring+jdbc+庖丁的一个例子”揭示了这是一个关于整合多个技术来构建一个搜索系统的示例。在这个系统中,我们有以下几个关键组件: 1. **Lucene**: Apache Lucene 是一个高性能、全文本...

    经典bbs源码(struts+spring+jdbc)

    【描述】提到的“经典的bbs论坛源码”是指一个用于在线讨论和交流的平台,它使用了Struts作为前端控制器,Spring来管理依赖和提供事务处理,以及JDBC进行数据操作。这个源码对于初学者和开发者来说是一个宝贵的资源...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    SBORM只是针对spring jdbc的一些不方便的地方,做了一些封装,更加简化日常的开发工作,基于spring jdbc的RowMapper自动实现对象映射,也勉强算的上叫ORM,只是大部分功能已经由spring jdbc实现了。 平时不太...

    初级JDBC需要的jar包,spring数据库开发

    描述中反复提到了"spring初级JDBC需要的jar包",这暗示了这个压缩包可能是为初学者准备的,包含了进行Spring框架下数据库开发所必需的基础依赖。Spring JDBC简化了数据访问,包括事务管理、异常翻译和SQL执行等功能...

    struts+spring+jdbc学生选课系统

    【标题】"struts+spring+jdbc学生选课系统"是一个基于J2EE架构的Web应用程序,它利用了Java技术栈中的Struts、Spring和JDBC来实现学生的选课功能。Struts作为MVC框架负责处理请求和视图展示,Spring则通过其...

    Spring+Jdbc scott用户的调用存储过程

    压缩包中的“Spring10SpringJDBC2”文件名可能暗示包含的是关于Spring JDBC的第十章内容或者是关于Spring JDBC的进阶部分,可能包括了如何调用存储过程的示例代码或更详细的教程。 综上所述,本主题涵盖的知识点...

    spring开发相关jar包(json,springweb,springmvc,jdbc等)

    在Spring框架的开发中,涉及了多个...以上就是标题和描述中提到的关键知识点,它们构成了Spring开发的基础,并且在实际的Java Web项目中扮演着重要角色。了解和掌握这些概念,对于成为一名熟练的Spring开发者至关重要。

    spring_mysql_jdbc

    描述中提到的“mysql的驱动”,是指MySQL的JDBC驱动程序,这是Java应用程序与MySQL数据库通信的桥梁。当Java应用需要访问MySQL数据库时,会通过JDBC驱动加载数据库连接,执行SQL语句并处理返回的结果。 首先,我们...

Global site tag (gtag.js) - Google Analytics