`

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的轻量级ORM框架sborm.zip

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

    spring与jdbc

    关于spring与jdbc整合的ppt文档,主要描述了java如何与jdbc整合

    Lesson-SpringJDBC-Demo:作为培训新学生的一个简短项目,SpringJDBC是培训大学的一部分

    #Lesson-SpringJDBC-Demo 它是什么? 我要在培训下,这是一个简短的项目,用于教授新一批学生,Spring Demo! 它包含什么 项目中的每个分支代表下一组分配。 如果学生在完成任务时遇到麻烦,欢迎他们结帐到下一个...

    Spring插件安装图解

    具体描述 Spring: 轻量级:Spring 是非侵入性的 - 基于 Spring 开发的应用中的对象可以不依赖于 Spring 的 API 依赖注入(DI --- dependency injection、IOC) 面向切面编程(AOP --- aspect oriented programming) ...

    Spring攻略PDF版

     第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 ...

    Spring攻略中文版PDF

     第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 ...

    Spring攻略英文版(附带源码)

     第7章 Spring对JDBC的支持   第8章 Spring中的事务管理   第9章 Spring对ORM的支持   第10章 Spring MVC框架   第11章 整合Spring与其他Web框架   第12章 Spring对测试的支持  第三部分 高级...

    spring 3.0 jar 所有开发包及开发项目实例

    org.springframework.jdbc-3.0.0.M4.jar: 对JDBC的简单封装 org.springframework.orm-3.0.0.M4.jar: 整合第三方的ORM框架,如hibernate,ibatis,jdo,以及spring的JPA实现 org.springframework.transaction-3.0.0....

    spring-jdbc-5.3.12.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.3.7.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.3.10.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.3.15.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.3.6.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    Spring.3.x企业应用开发实战(完整版).part2

    10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...

    spring-jdbc-4.3.8.RELEASE.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-4.1.7.RELEASE.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.1.2.RELEASE.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.0.5.RELEASE.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.2.15.RELEASE.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    spring-jdbc-5.2.0.RELEASE.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)... (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

Global site tag (gtag.js) - Google Analytics