首先创建一个函数接口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。
相关推荐
此驱动包含了最新的特性和性能优化,例如对Java 8新特性如Lambda表达式的支持,以及更好的并发处理和内存管理。 3. **ojdbc6, ojdbc5, ojdbc14** - ojdbc6适用于Java 6环境,支持Oracle数据库11g及12c早期版本。 ...
3. ojdbc8.jar:随着Java 8的推出,ojdbc8.jar提供了对新特性的支持,例如Lambda表达式和Stream API。这个版本的驱动适用于Oracle数据库12c及更高版本。如果你的项目基于Java 8,那么ojdbc8.jar是最新的选择,能够...
它包含了全面的API支持,包括对Java 8新特性的兼容,如Lambda表达式和Stream API。ojdbc8.jar驱动确保了与Oracle 12C数据库的最佳兼容性,同时利用Java 8的新特性提高性能和开发效率。 ojdbc.jar是一个通用的驱动...
在Java 8中,引入了若干新特性,如lambda表达式、Stream API和Date/Time API等,这些都使得开发更加高效。而MySQL Connector/J 8.0.19版本则确保了与Java 8的良好兼容性,允许开发者充分利用这些新特性进行数据库...
3. **sqljdbc42.jar**:这个驱动是为JDK 1.8准备的,除了包含之前版本的所有功能外,还添加了对Java 8特性的支持,如Lambda表达式和Stream API,使得数据库操作更加简洁高效。此外,它可能包含了更多优化和性能提升...
- Java 8引入了新的特性和优化,如Lambda表达式、Stream API和Date/Time API,但HikariCP的通用性意味着开发者不必因为连接池问题而急于升级到Java 8。 3. **使用HikariCP**: - 添加依赖:在Maven或Gradle项目中...
ojdbc8基于Java 8,提供了对Java Platform, Standard Edition (Java SE) 8的支持,包括对Java新特性的兼容性,如Lambda表达式和Stream API。它包含了一些重要的性能改进和新特性,比如多语句执行优化、新的SQL警告...
这个版本的驱动优化了对Java 8特性的支持,比如Lambda表达式、Stream API等。如果你的项目基于Java 8或更低版本,那么ojdbc8.jar是理想的选择。 4. 使用场景: - 数据库连接:通过JDBC驱动,开发者可以创建数据库...
- JRE8:Java 8(JRE8)于2014年发布,引入了lambda表达式、函数式编程、Stream API、日期/时间API等重大改进。 4. **安全性和性能优化**: - 使用PreparedStatement而不是Statement,可以防止SQL注入攻击,并...
这个驱动增强了对新Java特性的支持,如Lambda表达式、Stream API等,并可能包含对Oracle数据库新特性的优化和改进。如果项目使用Java 8或更高版本,ojdbc8.jar是更合适的选择。 使用Oracle JDBC驱动时,需要按照...
在这个项目中,开发者可能利用Java 8的新特性,如Lambda表达式、Stream API和Date-Time API,提高了代码的简洁性和执行效率。Lambda表达式简化了函数式编程,Stream API使得集合操作更为直观,而新的Date-Time API则...
2. **JDBC 4.2** 兼容:作为JDBC 4.2规范的一部分,它支持Java 8的特性,如Lambda表达式和Stream API,使得代码更加简洁高效。 3. **异步API**:提供了异步操作的能力,允许在处理数据库操作时避免阻塞主线程,提升...
这个版本还包含了对JDBC 4.2规范的全面支持,包括Java 8的新特性,如Lambda表达式和日期/时间API的改进。 在使用MySQL Connector/J时,开发者首先需要在项目中引入该jar包。这可以通过Maven或Gradle等构建工具完成...
8. **JDBC**:Java数据库连接(JDBC)是Java访问数据库的标准API,可以用来执行SQL语句、处理结果集等。 9. **Java虚拟机(JVM)**:理解JVM的工作原理,包括类加载、内存管理和垃圾回收,有助于优化Java程序的性能...
11. **使用流式API (Stream API)**:Java 8引入的流API可以简化处理集合的操作,并能进行并行处理,提高性能。 12. **避免过度的 boxing 和 unboxing**:Integer、Character等包装类与int、char之间的转换会增加...
Java开发工具JDK8是Java开发的基石,尤其在64位系统中,它提供了全面的开发环境和运行环境。JDK(Java Development Kit)是Oracle公司提供的用于开发和运行Java应用程序的软件包,它是Java程序员的核心工具。JDK8是...
这个版本特别强调对Java 1.8(即Java 8)的支持,这意味着它可以在运行Java 8的环境中稳定运行,提供了与较新Java版本兼容性的同时,也照顾到了仍在使用Java 8的用户。 **Elasticsearch核心概念:** 1. **分布式...
2. **全面支持Java 8**:此版本完全兼容Java 8,可以利用Java 8的新特性如Lambda表达式和Stream API,提高代码的简洁性和可读性。 3. **SSL/TLS安全连接**:提供了对SSL/TLS协议的支持,增强了数据传输的安全性,...
此外,Java 8对JDBC进行了升级,增加了4.1版本,引入了新的SQL类型,如RowId和Structured Types,以及改进了批量更新和结果集处理的性能。 在JVM层面,Java 8引入了G1(Garbage First)垃圾收集器作为主要的垃圾...
8. Java 8及后续版本中的函数式编程特性,如Lambda表达式、Stream API等。 9. Java的类加载机制,包括类加载过程、自定义类加载器以及类加载器的层级结构。 10. Java数据库连接(JDBC)和Java持久化API(JPA)等数据...