Spring中支持JDBC的JdbcTemplate模板类的使用

Posted 官小飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring中支持JDBC的JdbcTemplate模板类的使用相关的知识,希望对你有一定的参考价值。

概述

       Spring JDBC抽象框架core包提供了JDBC模板类,其中JdbcTemplate是core包的核心类,所以其他模板类都是基于它封装完成的,JDBC模板类是第一种工作模式。

 

       JdbcTemplate类通过模板设计模式帮助我们消除了冗长的代码,只做需要做的事情(即可变部分),并且帮我们做哪些固定部分,如连接的创建及关闭。

 

       JdbcTemplate类对可变部分采用回调接口方式实现,如ConnectionCallback通过回调接口返回给用户一个连接,从而可以使用该连接做任何事情、StatementCallback通过回调接口返回给用户一个Statement,从而可以使用该Statement做任何事情等等,还有其他一些回调接口



Spring除了提供JdbcTemplate核心类,还提供了基于JdbcTemplate实现的NamedParameterJdbcTemplate类用于支持命名参数绑定、 SimpleJdbcTemplate类用于支持Java5+的可变参数及自动装箱拆箱等特性。


JdbcTemplate

首先让我们来看下如何使用JdbcTemplate来实现增删改查。

1、首先创建表结构:

[java]  view plain copy print ?
  1. @RunWith(SpringJUnit4ClassRunner.class)  
  2. @ContextConfiguration(locations = "classpath:spring-basic.xml")  
  3. @ActiveProfiles("dev")  
  4. public abstract class AbstractTestSupport   
  5.     protected transient Logger log = LoggerFactory.getLogger(this.getClass());  
  6.   
  7.     @Rule  
  8.     public TestName name = new TestName();  
  9.   
  10.     @Before  
  11.     public void setUp()   
  12.         String createTableSql = "create memory table test"   
  13.                 + "(id int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, "   
  14.                 + "name varchar(100))";    
  15.         jdbcTemplate.update(createTableSql);    
  16.       
  17.   
  18.     @After  
  19.     public void tearDown()   
  20.         String dropTableSql = "drop table test";    
  21.         jdbcTemplate.execute(dropTableSql);   
  22.       
  23.       
  24.     @Resource  
  25.     private JdbcTemplate jdbcTemplate;  
  26.   

2、新增测试:

[java]  view plain copy print ?
  1. @Test  
  2. private void insert()     
  3.     jdbcTemplate.update("insert into test(name) values('name1')");    
  4.     jdbcTemplate.update("insert into test(name) values('name2')");    
  5.     Assert.assertEquals(2, jdbcTemplate.queryForInt("select count(*) from test"));    
  6.    

3、删除测试:

[java]  view plain copy print ?
  1. @Test  
  2. private void delete()     
  3.     jdbcTemplate.update("delete from test where name=?"new Object[]"name2");    
  4.     Assert.assertEquals(1, jdbcTemplate.queryForInt("select count(*) from test"));    
  5.     

4、更新测试:

[java]  view plain copy print ?
  1. @Test  
  2. private void update()     
  3.     jdbcTemplate.update("update test set name='name3' where name=?"new Object[]"name1");    
  4.     Assert.assertEquals(1, jdbcTemplate.queryForInt("select count(*) from test where name='name3'"));    
  5.    

5、查询测试:

[java]  view plain copy print ?
  1. @Test  
  2. private void select()   
  3.     jdbcTemplate.query("select * from test"new RowCallbackHandler()   
  4.         @Override  
  5.         public void processRow(ResultSet rs) throws SQLException   
  6.             System.out.print("====id:" + rs.getInt("id"));  
  7.             System.out.println(",name:" + rs.getString("name"));  
  8.           
  9.     );  
  10.   

 看完以上示例,大家是否觉得JdbcTemplate简化了我们很多劳动力呢?接下来让我们深入学习一下JdbcTemplate提供的方法。

       

JdbcTemplate主要提供以下五类方法:

  • execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
  • update方法:update方法用于执行新增、修改、删除等语句;
  • batchUpdate方法:用于执行批处理相关语句;
  • query方法及queryForXXX方法:用于执行查询相关语句;
  • call方法:用于执行存储过程、函数相关语句。

 

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)来处理结果集,用户必须处理整个结果集;

 

接下来让我们看下具体示例吧,在示例中不可能介绍到JdbcTemplate全部方法及回调类的使用方法,我们只介绍代表性的,其余的使用都是类似的;


  • 预编译语句及存储过程创建回调、自定义功能回调使用:

[java]  view plain copy print ?
  1. @Test    
  2. public void testPpreparedStatement1()     
  3.   int count = jdbcTemplate.execute(new PreparedStatementCreator()     
  4.      @Override    
  5.      public PreparedStatement createPreparedStatement(Connection conn)    
  6.          throws SQLException     
  7.          return conn

    以上是关于Spring中支持JDBC的JdbcTemplate模板类的使用的主要内容,如果未能解决你的问题,请参考以下文章

    spring-jdbc vs spring-data-jdbc,它们支持啥

    使用 Spring 的 JDBC 支持获取输出参数

    Spring框架学习六:Spring对JDBC的支持

    Spring对jdbc的支持

    Spring对JDBC的支持

    Unit06: Spring对JDBC的 整合支持 Spring+JDBC TemplateSpring异常处理