`
jetway
  • 浏览: 485929 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Spring JDBC2

    博客分类:
  • java
阅读更多

一、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> 

<!--         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;
              }
            });
  }
 

 

  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 });
    }
 

 至此,spring JDBC主要的应用基本上都简单罗列一番,抛砖引玉,希望有独特见解的拍砖

分享到:
评论

相关推荐

    spring_JDBC整合包

    Spring JDBC是Spring框架的一个重要模块,它简化了Java数据库连接(JDBC)的使用,提供了更高级别的抽象,使得数据库操作更加简洁、易管理和模块化。这个"spring_JDBC整合包"显然包含了进行Spring JDBC开发所需的...

    Spring JDBC与事务管理

    javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...

    Spring JDBC常用Jar包

    2. **spring-tx-3.2.3.RELEASE.jar**: Spring的事务管理模块,提供了编程式和声明式事务管理支持。在Spring JDBC中,事务管理是关键功能,它确保了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。通过这...

    spring jdbc.zip

    2. spring-beans-5.1.10.RELEASE.jar:包含了Bean工厂和Bean定义的解析,是Spring IoC容器的基础。 3. spring-jdbc-5.1.10.RELEASE.jar:Spring JDBC模块,包含JdbcTemplate和其他数据库相关工具。 4. spring-tx-...

    SpringJDBC.rar_SpringJDBC_spring jdbc

    通过这个SpringJDBC.rar的案例,初学者可以学习到如何配置DataSource,如何创建JdbcTemplate实例,以及如何编写和执行SQL语句。同时,实践中还可以了解到如何将Spring JDBC整合到Spring Boot项目中,以及如何处理...

    spring jdbc示例代码

    2. **SqlSessionFactoryBean**和**DataSource**:在Spring配置文件中,我们需要设置DataSource来管理数据库连接,SqlSessionFactoryBean用于创建SqlSession,它是MyBatis的基础,但在Spring JDBC中我们通常直接使用...

    springjdbc.zip_SpringJDBC_spring jdbc_spring 增删改查_springjdbc xml

    这个`springjdbc.zip`压缩包很可能包含了示例代码和配置文件,用于演示如何使用Spring JDBC来执行基本的数据库操作,如增、删、改、查。 1. **Spring JDBC模块**:Spring JDBC模块主要由`org.springframework.jdbc`...

    spring-jdbc jar包.rar

    《Spring JDBC:构建高效数据访问层》 Spring JDBC是Spring框架的一个重要组成部分,它提供了一种简化传统JDBC编程的抽象层,使得开发者能够更轻松、更安全地处理数据库交互。"spring-jdbc jar包"包含了Spring框架...

    spring jdbc相关包版本5.1.3

    2. **spring-context-5.1.3.RELEASE.jar**:扩展了`spring-core`,提供了环境感知能力,如bean的生命周期管理,事件发布,国际化,资源访问,以及与第三方框架的集成,如数据访问和事务管理。 3. **spring-beans-...

    spring4 、 springmvc4.2、springjdbc

    2. 配置Spring:创建Spring的配置文件,如`applicationContext.xml`,配置Bean、数据源和事务管理器等。 3. 配置Spring MVC:创建Spring MVC的配置文件,如`servlet-context.xml`,配置DispatcherServlet、视图解析...

    spring对jdbc的支持jar包

    本文将深入探讨Spring对JDBC(Java Database Connectivity)的支持,以及如何在实际项目中使用这些功能。 首先,Spring JDBC的核心是`org.springframework.jdbc`包,它提供了一套高级抽象,用于简化数据库操作。在...

    SpringMVC+SpringJDBC

    SpringMVC和SpringJDBC是Java开发中两个重要的框架,它们分别是Spring框架在Web层和数据访问层的应用。本文将详细介绍这两个组件的核心概念、工作原理以及如何整合使用,旨在帮助开发者更好地理解和应用。 **...

    spring JDbc

    2. **异常处理**:Spring JDBC将数据库抛出的原生异常转换为更有意义的`DataAccessException`子类,使得异常处理更加简单。例如,`EmptyResultDataAccessException`用于表示预期查询结果不存在,而`...

    Spring JDBC应用实例讲解

    Spring JDBC是Spring框架中的一个核心模块,主要用于简化Java数据库编程。在本文中,我们将深入探讨Spring JDBC的应用实例,了解如何利用它来实现高效且灵活的数据访问。首先,我们需要理解Spring JDBC是如何通过...

    SpringJDBC.rar_jdbc spring_spring jd_spring jdbc_spring使用JDBC进行数

    这个“SpringJDBC.rar”压缩包文件可能包含了关于如何在Spring框架中集成和使用JDBC的相关示例和教程。下面将详细解释Spring JDBC的核心概念、功能以及使用方法。 首先,Spring JDBC的核心目标是简化传统的JDBC编程...

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

    2. **Spring JDBC**:Spring JDBC抽象了JDBC,提供了一个模板类JdbcTemplate,用于执行SQL查询和更新。理解如何配置DataSource,以及如何使用JdbcTemplate进行增删改查操作是关键。 3. **用户登录**:登录功能通常...

    spring JDBC所需jar包

    2. spring-jdbc.jar:这个库提供了Spring对JDBC的支持,包括DataSource的管理、事务处理、JdbcTemplate等工具类。 3. spring-tx.jar:事务管理模块,支持声明式和编程式事务管理,对于数据库操作的事务控制至关重要...

    Spring Jdbc的jar包

    Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一种抽象层,使得开发者可以更轻松地处理数据库操作。Spring JDBC的主要目标是简化数据访问,减少直接使用JDBC时的繁琐工作,如手动管理...

    Spring事务管理和SpringJDBC思维导图

    本话题主要关注Spring的两个重要模块:事务管理和Spring JDBC。这些知识点对于任何使用Spring进行后端开发的程序员来说都是至关重要的。 首先,我们来深入理解Spring事务管理。事务是数据库操作的基本单元,它确保...

    Spring JDBC相关jar包:spring_jdbc_4.0.0.zip

    Spring JDBC是Spring框架的一个核心模块,它为Java数据库连接(JDBC)提供了一种抽象层,使得开发者可以更轻松地处理数据库操作。Spring JDBC模块的主要目标是减少对JDBC API的直接依赖,通过提供一种更加高级、易于...

Global site tag (gtag.js) - Google Analytics