`

用Java 8 lambda优化JDBC

阅读更多

首先创建一个函数接口ResultSetProcessor :

@FunctionalInterface
public interface ResultSetProcessor {

    public void process(ResultSet resultSet, 
                        long currentRow) 
                        throws SQLException;

}

下面做个简单查询案例,使用这个接口遍历

public static void select(Connection connection, 
                          String sql, 
                          ResultSetProcessor processor, 
                          Object... params) {
        try (PreparedStatement ps = connection.prepareStatement(sql)) {
            int cnt = 0;
            for (Object param : params) {
                ps.setObject(++cnt, param));
            }
            try (ResultSet rs = ps.executeQuery()) {
                long rowCnt = 0;
                while (rs.next()) {
                    processor.process(rs, rowCnt++);
                }
            } catch (SQLException e) {
                throw new DataAccessException(e);
            }
        } catch (SQLException e) {
            throw new DataAccessException(e);
        }
}

调用这个select语句如下:

select(connection, "select * from MY_TABLE",(rs, cnt)-> {        
   System.out.println(rs.getInt(1)+" "+cnt)
});

select的第三个参数ResultSetProcessor这是个函数,所以我们传入的是一个匿名函数。

 Streams API

   java 8提供了更强大的 Streams API,我们可以对ResultSet处理更加强大。创建一个自己的Tuple 类型,代表ResultSet中一行记录。

   下面我们将一个查询和ResultSet包装在一个Iterator中:

public class ResultSetIterator implements Iterator {

    private ResultSet rs;
    private PreparedStatement ps;
    private Connection connection;
    private String sql;

    public ResultSetIterator(Connection connection, String sql) {
        assert connection != null;
        assert sql != null;
        this.connection = connection;
        this.sql = sql;
    }

    public void init() {
        try {
            ps = connection.prepareStatement(sql);
            rs = ps.executeQuery();

        } catch (SQLException e) {
            close();
            throw new DataAccessException(e);
        }
    }

    @Override
    public boolean hasNext() {
        if (ps == null) {
            init();
        }
        try {
            boolean hasMore = rs.next();
            if (!hasMore) {
                close();
            }
            return hasMore;
        } catch (SQLException e) {
            close();
            throw new DataAccessException(e);
        }

    }

    private void close() {
        try {
            rs.close();
            try {
                ps.close();
            } catch (SQLException e) {
                //nothing we can do here
            }
        } catch (SQLException e) {
            //nothing we can do here
        }
    }

    @Override
    public Tuple next() {
        try {
            return SQL.rowAsTuple(sql, rs);
        } catch (DataAccessException e) {
            close();
            throw e;
        }
    }
}

这是一个遍历器,每次返回ResultSet的一行记录,返回类型是我们定义Tuple.

关于tuple定义可见源码。

我们和Stream绑定在一起如下:

public static Stream stream(final Connection connection, 
                                       final String sql, 
                                       final Object... parms) {
  return StreamSupport
                .stream(Spliterators.spliteratorUnknownSize(
                        new ResultSetIterator(connection, sql), 0), false);
}

Java 8 提供StreamSupport静态方法.stream来创建 java.util.stream.Stream实例,同时还需要java.util.stream.Spliterator,这是一个用来遍历和分区一个序列元素(集合)的特殊类型,有了它才能并行处理我们饿操作,而Spliterators 这是能够对已经存在的集合如java.util.Iterator.提供并行操作。

我们调用上面stream如下:

long result = stream(connection, "select TEST_ID from TEST_TABLE")
           .filter((t) -> t.asInt("TEST_ID") % 2 == 0)
           .limit(100)
           .count();

这是查询所有的TEST_ID,然后过滤掉所有非偶数,最后再运行一个计数。非常简单明了。如果你使用ORM/JPA等框架,可能无法让自己的SQL代码如此优雅直接了,它类似Hibernate的 criteria。

分享到:
评论

相关推荐

    Oracle 12C JDBC驱动 jar包 各版本驱动详解

    它包含了全面的API支持,包括对Java 8新特性的兼容,如Lambda表达式和Stream API。ojdbc8.jar驱动确保了与Oracle 12C数据库的最佳兼容性,同时利用Java 8的新特性提高性能和开发效率。 ojdbc.jar是一个通用的驱动...

    最全oracle数据库jdbc驱动包含ojdbc8

    此驱动包含了最新的特性和性能优化,例如对Java 8新特性如Lambda表达式的支持,以及更好的并发处理和内存管理。 3. **ojdbc6, ojdbc5, ojdbc14** - ojdbc6适用于Java 6环境,支持Oracle数据库11g及12c早期版本。 ...

    Oracle JDBC jar包下载

    3. ojdbc8.jar:随着Java 8的推出,ojdbc8.jar提供了对新特性的支持,例如Lambda表达式和Stream API。这个版本的驱动适用于Oracle数据库12c及更高版本。如果你的项目基于Java 8,那么ojdbc8.jar是最新的选择,能够...

    mysql-connector-java-8.0.19_Java8_MYSQL_源码

    在Java 8中,引入了若干新特性,如lambda表达式、Stream API和Date/Time API等,这些都使得开发更加高效。而MySQL Connector/J 8.0.19版本则确保了与Java 8的良好兼容性,允许开发者充分利用这些新特性进行数据库...

    Microsoft JDBC,JAVA连接SQL Server驱动包

    3. **sqljdbc42.jar**:这个驱动是为JDK 1.8准备的,除了包含之前版本的所有功能外,还添加了对Java 8特性的支持,如Lambda表达式和Stream API,使得数据库操作更加简洁高效。此外,它可能包含了更多优化和性能提升...

    HikariCP java7和8通用的jar包

    - Java 8引入了新的特性和优化,如Lambda表达式、Stream API和Date/Time API,但HikariCP的通用性意味着开发者不必因为连接池问题而急于升级到Java 8。 3. **使用HikariCP**: - 添加依赖:在Maven或Gradle项目中...

    oracle19C驱动包

    这个版本的驱动优化了对Java 8特性的支持,比如Lambda表达式、Stream API等。如果你的项目基于Java 8或更低版本,那么ojdbc8.jar是理想的选择。 4. 使用场景: - 数据库连接:通过JDBC驱动,开发者可以创建数据库...

    oracle-jdbc.zip

    ojdbc8基于Java 8,提供了对Java Platform, Standard Edition (Java SE) 8的支持,包括对Java新特性的兼容性,如Lambda表达式和Stream API。它包含了一些重要的性能改进和新特性,比如多语句执行优化、新的SQL警告...

    java 连接sqlserver使用的java-sqlserver-connect.jar包

    - JRE8:Java 8(JRE8)于2014年发布,引入了lambda表达式、函数式编程、Stream API、日期/时间API等重大改进。 4. **安全性和性能优化**: - 使用PreparedStatement而不是Statement,可以防止SQL注入攻击,并...

    oracle jdbc.rar

    这个驱动增强了对新Java特性的支持,如Lambda表达式、Stream API等,并可能包含对Oracle数据库新特性的优化和改进。如果项目使用Java 8或更高版本,ojdbc8.jar是更合适的选择。 使用Oracle JDBC驱动时,需要按照...

    J2EE-music.rar_Java 8

    在这个项目中,开发者可能利用Java 8的新特性,如Lambda表达式、Stream API和Date-Time API,提高了代码的简洁性和执行效率。Lambda表达式简化了函数式编程,Stream API使得集合操作更为直观,而新的Date-Time API则...

    mysql-connector-java-8.0.22.jar

    2. **JDBC 4.2** 兼容:作为JDBC 4.2规范的一部分,它支持Java 8的特性,如Lambda表达式和Stream API,使得代码更加简洁高效。 3. **异步API**:提供了异步操作的能力,允许在处理数据库操作时避免阻塞主线程,提升...

    mysql-connector-java-8.0.29.jar

    这个版本还包含了对JDBC 4.2规范的全面支持,包括Java 8的新特性,如Lambda表达式和日期/时间API的改进。 在使用MySQL Connector/J时,开发者首先需要在项目中引入该jar包。这可以通过Maven或Gradle等构建工具完成...

    Java,Java培训资料,Java资料

    8. **JDBC**:Java数据库连接(JDBC)是Java访问数据库的标准API,可以用来执行SQL语句、处理结果集等。 9. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载、内存管理和垃圾回收,有助于优化Java程序的性能...

    elasticsearch7.17.10-最新支持Java1.8版本

    这个版本特别强调对Java 1.8(即Java 8)的支持,这意味着它可以在运行Java 8的环境中稳定运行,提供了与较新Java版本兼容性的同时,也照顾到了仍在使用Java 8的用户。 **Elasticsearch核心概念:** 1. **分布式...

    Java程序性能优化之二十三个建议

    11. **使用流式API (Stream API)**:Java 8引入的流API可以简化处理集合的操作,并能进行并行处理,提高性能。 12. **避免过度的 boxing 和 unboxing**:Integer、Character等包装类与int、char之间的转换会增加...

    Java开发工具-jdk8-64x

    Java开发工具JDK8是Java开发的基石,尤其在64位系统中,它提供了全面的开发环境和运行环境。JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件包,它是Java程序员的核心工具。JDK8是...

    mysql-connector_java_8.0.11

    2. **全面支持Java 8**:此版本完全兼容Java 8,可以利用Java 8的新特性如Lambda表达式和Stream API,提高代码的简洁性和可读性。 3. **SSL/TLS安全连接**:提供了对SSL/TLS协议的支持,增强了数据传输的安全性,...

    JAVAJDK1.8-Win64

    此外,Java 8对JDBC进行了升级,增加了4.1版本,引入了新的SQL类型,如RowId和Structured Types,以及改进了批量更新和结果集处理的性能。 在JVM层面,Java 8引入了G1(Garbage First)垃圾收集器作为主要的垃圾...

    java核心技术卷二

    8. Java 8及后续版本中的函数式编程特性,如Lambda表达式、Stream API等。 9. Java的类加载机制,包括类加载过程、自定义类加载器以及类加载器的层级结构。 10. Java数据库连接(JDBC)和Java持久化API(JPA)等数据...

Global site tag (gtag.js) - Google Analytics