• 使用JdbcTemplate简化JDBC操作 实现数据库操作


      使用Spring JDBC框架方遍简单的完成JDBC操作,满足性能的需求且灵活性高。

    Spring JDBC框架由4个部分组成,即core、datasource、object、support。

    org.springframework.jdbc.core包由JdbcTemplate类以及相关的回调接口(callback interface)和类组成。

    org.springframework.jdbc.datasource包由一些用来简化DataSource访问的工具类,以及各种DataSource接口的简单实现(主要用于单元测试以及在J2EE容器之外使用JDBC)组成。工具类提供了一些静态方法,诸如通过JNDI获取数据连接以及在必要的情况下关闭这些连接。它支持绑定线程的连接,比如被用于DataSourceTransactionManager的连接。

    接下来,org.springframework.jdbc.object包由封装了查询、更新以及存储过程的类组成,这些类的对象都是线程安全并且可重复使用的。它们类似于JDO,与JDO的不同之处在于查询结果与数据库是“断开连接”的。它们是在org.springframework.jdbc.core包的基础上对JDBC更高层次的抽象。

    最后,org.springframework.jdbc.support包提供了一些SQLException的转换类以及相关的工具类。

    在JDBC处理过程中抛出的异常将被转换成org.springframework.dao包中定义的异常。因此使用Spring JDBC进行开发将不需要处理JDBC或者特定的RDBMS才会抛出的异常。所有的异常都是unchecked exception,这样我们就可以对传递到调用者的异常进行有选择的捕获。 

     

    数据库操作增删改使用update(..)
    数据库操作查询使用query(..)

    在dao的impl类中 extends JdbcDaoSupport,
    并使用其的getJdbcTemplate()获得数据库连接的信息,以进行后续的数据库操作。

    添加一条数据:

    查询数据:

     上面code中的new MyRowMapper()的操作是因为,需要手动的将返回类型转化为需要用到的强类型,在下面会讲到具体为什么需要这样做

    该类的写法如下:

    使用RowMapper完成数据查询转化强类型操作
    自定义一个类:MyRowMapper 实现接口RowMapper<Emp> 使用T传入我们要转化的类
    重写该类的method:

     

    JdbcTemplate

    JdbcTemplate是core包的核心类。它替我们完成了资源的创建以及释放工作,从而简化了我们对JDBC的使用。它还可以帮助我们避免一些常见的错误,比如忘记关闭数据库连接。JdbcTemplate将完成JDBC核心处理流程,比如SQL语句的创建、执行,而把SQL语句的生成以及查询结果的提取工作留给我们的应用代码。它可以完成SQL查询、更新以及调用存储过程,可以对ResultSet进行遍历并加以提取。它还可以捕获JDBC异常并将其转换成org.springframework.dao包中定义的,通用的,信息更丰富的异常。

    使用JdbcTemplate进行编码只需要根据明确定义的一组契约来实现回调接口。PreparedStatementCreator回调接口通过给定的Connection创建一个PreparedStatement,包含SQL和任何相关的参数。CallableStatementCreateor实现同样的处理,只不过它创建的是CallableStatement。RowCallbackHandler接口则从数据集的每一行中提取值。

    我们可以在一个service实现类中通过传递一个DataSource引用来完成JdbcTemplate的实例化,也可以在application context中配置一个JdbcTemplate bean,来供service使用。需要注意的是DataSource在application context总是配制成一个bean,第一种情况下,DataSource bean将传递给service,第二种情况下DataSource bean传递给JdbcTemplate bean。因为JdbcTemplate使用回调接口和SQLExceptionTranslator接口作为参数,所以一般情况下没有必要通过继承JdbcTemplate来定义其子类。

    JdbcTemplate中使用的所有SQL将会以“DEBUG”级别记入日志(一般情况下日志的category是JdbcTemplate相应的全限定类名,不过如果需要对JdbcTemplate进行定制的话,可能是它的子类名)。 

    执行SQL语句

    我们仅需要非常少的代码就可以达到执行SQL语句的目的,一旦获得一个 DataSource和一个JdbcTemplate, 我们就可以使用JdbcTemplate提供的丰富功能实现我们的操作。 下面的例子使用了极少的代码完成创建一张表的工作。 

     1 import javax.sql.DataSource;
     2 import org.springframework.jdbc.core.JdbcTemplate;
     3 
     4 public class ExecuteAStatement {
     5 
     6     private JdbcTemplate jt;
     7     private DataSource dataSource;
     8 
     9     public void doExecute() {
    10         jt = new JdbcTemplate(dataSource);
    11         jt.execute("create table mytable (id integer, name varchar(100))"); 
    12     }
    13 
    14     public void setDataSource(DataSource dataSource) {
    15         this.dataSource = dataSource;
    16     }
    17 }
    View Code

     

    执行查询

    除了execute方法之外,JdbcTemplate还提供了大量的查询方法。 在这些查询方法中,有很大一部分是用来查询单值的。比如返回一个汇总(count)结果 或者从返回行结果中取得指定列的值。这时我们可以使用queryForInt(..)queryForLong(..)或者queryForObject(..)方法。 queryForObject方法用来将返回的JDBC类型对象转换成指定的Java对象,如果类型转换失败将抛出 InvalidDataAccessApiUsageException异常。 下面的例子演示了两个查询的用法,一个返回int值,另一个返回 String。 

     1 import javax.sql.DataSource;
     2 import org.springframework.jdbc.core.JdbcTemplate;
     3 
     4 public class RunAQuery {
     5 
     6     private JdbcTemplate jt;
     7     private DataSource dataSource;
     8   
     9     public int getCount() {
    10         jt = new JdbcTemplate(dataSource);
    11         int count = jt.queryForInt("select count(*) from mytable");
    12         return count;
    13     }
    14 
    15     public String getName() {
    16         jt = new JdbcTemplate(dataSource);
    17         String name = (String) jt.queryForObject("select name from mytable", String.class);
    18         return name;
    19     }
    20 
    21     public void setDataSource(DataSource dataSource) {
    22         this.dataSource = dataSource;
    23     }
    24 }
    View Code

    除了返回单值的查询方法,JdbcTemplate还提供了一组返回List结果 的方法。List中的每一项对应查询返回结果中的一行。其中最简单的是queryForList方法, 该方法将返回一个List,该List中的每一条 记录是一个Map对象,对应应数据库中某一行;而该Map 中的每一项对应该数据库行中的某一列值。下面的代码片断接着上面的例子演示了如何用该方法返回表中 所有记录:

    1 public List getList() {
    2     jt = new JdbcTemplate(dataSource);
    3     List rows = jt.queryForList("select * from mytable");
    4     return rows;
    5 }
    View Code

    返回的结果集类似下面这种形式:(这就是为什么要使用MyRowMapper的原因)

    [{name=Bob, id=1}, {name=Mary, id=2}]

    更新数据库

    JdbcTemplate还提供了一些更新数据库的方法。 在下面的例子中,我们根据给定的主键值对指定的列进行更新。 例子中的SQL语句中使用了“?”占位符来接受参数(这种做法在更新和查询SQL语句中很常见)。 传递的参数值位于一个对象数组中(基本类型需要被包装成其对应的对象类型)。 

     1 import javax.sql.DataSource;
     2 
     3 import org.springframework.jdbc.core.JdbcTemplate;
     4 
     5 public class ExecuteAnUpdate {
     6 
     7     private JdbcTemplate jt;
     8     private DataSource dataSource;
     9 
    10     public void setName(int id, String name) {
    11         jt = new JdbcTemplate(dataSource);
    12         jt.update("update mytable set name = ? where id = ?", new Object[] {name, new Integer(id)});
    13     }
    14 
    15     public void setDataSource(DataSource dataSource) {
    16         this.dataSource = dataSource;
    17     }
    18 }
    View Code

     

     有待更新。。。

    具体实例:等待上传。。

  • 相关阅读:
    Bzoj 1010: [HNOI2008]玩具装箱toy(斜率优化)
    Cogs 376. [IOI2002]任务安排(后效性DP)
    Bzoj 1911: [Apio2010]特别行动队(斜率优化)
    Poj 2018 Best Cow Fences(分数规划+DP&&斜率优化)
    Bzoj 1212: [HNOI2004]L语言(AC自动机+DP)
    ZOJ 3228 Searching the String(AC自动机)
    Bzoj 3172: [Tjoi2013]单词(fail树)
    Hdu 3065 病毒侵袭持续中(AC自动机)
    Hdu 2896 病毒侵袭(AC自动机)
    Bzoj 2599: [IOI2011]Race(点分治)
  • 原文地址:https://www.cnblogs.com/john69-/p/5962833.html
Copyright © 2020-2023  润新知