[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表达式进行大幅简化。

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

相关文章推荐

好炫的Lambda表达式,Java党用起来!(最简易Lambda教程)

刷微博时偶然看到 Lambda 的 HelloWorld 教程,觉得很酷炫!分享一下!效果示例总体看起来效果就是代码简洁,如下//之前的写法 btn.setOnClickListener(new Vi...

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

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

JdbcTemplate 易被 Java 8 Lambda 带入的坑

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

用Java 8 lambda优化JDBC

本教程源码下载 https://github.com/jexenberger/lambda-tuples首先创建一个函数接口ResultSetProcessor :@FunctionalInterf...

JdbcTemplate对数据库的查询与修改

JdbcTemplate对数据库的查询与修改 1. 配置文件config.properties的读取 2. DaoFactory设计 3. context.xml 4. DaoImpl的实现与分析...

spring boot 官方文档笔记

Spring Boot每次发布时都会提供一个它所支持的精选依赖列表。实际上,在构建配置里你不需要提供任何依赖的版本,因为Spring Boot已经替你管理好了。当更新Spring Boot时,那些依赖...

Java8学习之旅2---基于Lambda的JDBC编程

Java8的Lambda表达式确实是一个非常好的特性,但是在哪些场合下使用,其实还是需要仔细考虑的。我们当然不能为了使用而使用,而是需要找到切实有用的场合。在JDBC编程中,例如查询语句,首先需要进行...
  • Yt7589
  • Yt7589
  • 2014年11月11日 12:50
  • 2821

Java8的lambda表达式

  • 2017年07月24日 11:54
  • 11KB
  • 下载

如何在Android Studio使用Java8 Lambda表达式

如何在Android Studio使用Java8 Lambda表达式本博文简要概述如何在Android开发环境使用Lambda表达式,下面给出配置步骤首先弄清以下两点 Lambda表达式是随着JDK1...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Java 8 & Spring JDBC] 使用Spring JDBC和Lambda表达式简化DAO
举报原因:
原因补充:

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