[Java 8 & Spring JDBC] 使用Spring JDBC和Lambda表达式简化DAO

原创 2015年07月09日 10:48:27

使用Spring JDBC和Lambda表达式简化DAO

如果你需要向数据库中插入一条Item记录,那么会有类似下面的代码:

Item对应的实体类型为:

public class Item {
    public int name;
    public BigDecimal price;
}
public void create(Item item) throws IOException {
  PreparedStatement ps = null;

  try {
    Connection con = template.getDataSource().getConnection();
    ps = con.prepareStatement("insert into items (name, price, prc_date) values (?, ?, ?, now())");
    ps.setString(1, item.name);
    ps.setBigDecimal(2, item.price);
    ps.executeUpdate();
  } catch (SQLException e) {
    throw new IOException(e);
  } finally {
    if (ps != null) {
      try {
        ps.close();
      } catch (SQLException e) {
        logger.warn(e.getMessage(), e);
      }
    }
  }
}

其中的template的类型为org.springframework.jdbc.core.JdbcTemplate
如果使用JdbcTemplate类型提供的update方法,可以使上述代码大幅简化:

public void create(Item item) throws IOException {
  template.update(
      "insert into items (name, price, prc_date) values (?, ?, now())",
      item.name, item.price);
}

但是,直接使用update方法的这一重载并不是最快的。可以使用public int update(String sql, PreparedStatementSetter pss)这一重载来得到更佳的运行速度:

public void create(CartItemRelation item) throws IOException {
  template.update(
      "insert into item (name, price, prc_date) values (?, ?, now())",
      new PreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps) throws SQLException {
          ps.setString(1, item.name);
          ps.setBigDecimal(2, item.price);
        }
      });
}

如果使用Java 8的Lambda表达式,上述代码仍然有简化的空间:

public void create(final Item item) throws IOException {
  template.update(
      "insert into items (name, price, prc_date) values (?, ?, now())",
      ps -> {
        ps.setString(1, item.name);
        ps.setBigDecimal(2, item.price);
      });
}

同样的,对于SELECT语句也可以通过JdbcTemplate和Lambda表达式简化,简化后繁琐的try-catch-finally语句可以被有效消除:

public Item findByItemName(String name) throws IOException {
  PreparedStatement ps = null;
  ResultSet rs = null;

  try {
    Connection con = template.getDataSource().getConnection();
    ps = con.prepareStatement("select name, price from items where name = ?");
    ps.setString(1, name);
    rs = ps.executeQuery();

    if (rs.next()) {
      return new Item(rs.getString(1), rs.getBigDecimal(2));
    }

    return null;
  } catch (SQLException e) {
    throw new IOException(e);
  } finally {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        logger.warn(e.getMessage(), e);
      }
    }

    if (ps != null) {
      try {
        ps.close();
      } catch (SQLException e) {
        logger.warn(e.getMessage(), e);
      }
    }
  }
}

简化后的代码如下所示:

public Item findItemByName(String name) throws IOException {
  return DataAccessUtils.requiredSingleResult(
      template.query("select name, price from items where name = ?",
          ps -> {
              ps.setString(1, name);
          },
          (rs, rowNum) -> new Item(rs.getString(1), rs.getBigDecimal(2))
          ));
}

由于template.query返回的是一个List集合,所以还需要使用DataAccessUtils.requiredSingleResult来取得唯一对象。

对于其他类型的SQL语句,如update和delete等,都可以通过使用Spring JdbcTemplate和Lambda表达式进行大幅简化。

版权声明:本文为博主原创文章,未经博主允许不得转载。

JAVA8之lambda表达式详解,及stream中的lambda使用

1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.lambda表达式的优缺点? 4.lambda表达式的使用场景? 5.lambda只是有个语法糖吗? 6.stream...
  • jinzhencs
  • jinzhencs
  • 2016年02月26日 11:03
  • 23744

Java8 Lambda表达式 ,此时不用,更待何时?

为什么要使用lambda表达式关于这点,网上的说法一大堆,但是这个就说一个最浅显的理由,就是简洁,使用Lambda表达式可以让你的代码看起来很简洁,去掉了一堆没有意义的代码,只留下核心的逻辑。也许你会...
  • u011002668
  • u011002668
  • 2016年10月31日 18:02
  • 1023

[Java 8 & Spring JDBC] 使用Spring JDBC和Lambda表达式简化DAO

使用Spring JDBC和Lambda表达式简化DAO 如果你需要向数据库中插入一条Item记录,那么会有类似下面的代码: Item对应的实体类型为: public class Item ...
  • dm_vincent
  • dm_vincent
  • 2015年07月09日 10:48
  • 5376

JdbcTemplate 易被 Java 8 Lambda 带入的坑

Spring 的 JdbcTemplate 为我们操作数据库提供非常大的便利,不需要显式的管理资源和处理异常。在我们进入到了 Java 8 后,JdbcTemplate 方法中的回调函数可以用 Lam...
  • kypfos
  • kypfos
  • 2017年04月14日 23:39
  • 366

JAVA SE 8 学习笔记(三)使用lambda编程

三、使用lambda编程 3.1 延迟执行 所有lambda表达式都是延迟执行的,如果希望立即执行一段代码,则没必要使用lambda表达式 延迟执行代码原因可能有: ·在另一个线程中运行代码 ·多...
  • flycct
  • flycct
  • 2016年05月08日 12:51
  • 1072

Java 8 Lambda函数编程入门(五)

测试、调试和重构重构、测试驱动开发(TDD)和持续集成(CI)越来越流行,如果我们需要将 Lambda 表达式应用于日常编程工作中,就得学会如何为它编写单元测试。...
  • WSYW126
  • WSYW126
  • 2016年10月09日 12:58
  • 946

Java8之——Lambda表达式入门

转载自:http://blog.csdn.net/renfufei/article/details/24600507/ 原文链接: Start Using Java Lambda Express...
  • l1028386804
  • l1028386804
  • 2016年09月22日 04:48
  • 1372

Spring-JDBC通用Dao

Spring-JDBC通用Dao(代码备份) jdbc是一种轻量级的xxx JdbcBaseDaoJdbcBaseDao接口,内容如下:package com.sun4j.core.jdbc.da...
  • rzg813
  • rzg813
  • 2016年05月09日 16:18
  • 1898

hibernate与spring的jdbc,dao的区别

今天学习到了spring的jdbc 连接,dao查询-添加-删除-修改,在以前学了hibernate的学习。 我觉得spring和hibernate的jdbc:      hibernte与...
  • luckyzyq
  • luckyzyq
  • 2013年08月01日 21:43
  • 2776

Spring对JDBC的DAO支持

    Spring提供JdbcDaoSupport来实现对JDBC的DAO支持。在JdbcDaoSupport类中提供了两个方法,分别是:        void setDataSource(Dat...
  • cgwshxs
  • cgwshxs
  • 2008年12月06日 16:55
  • 3059
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Java 8 & Spring JDBC] 使用Spring JDBC和Lambda表达式简化DAO
举报原因:
原因补充:

(最多只允许输入30个字)