v6.4.0 (2026-01-05)
<dependency>
<groupId>net.hasor</groupId>
<artifactId>dbvisitor</artifactId>
<version>6.4.0</version>
</dependency>
<dependency>
<groupId>net.hasor</groupId>
<artifactId>jdbc-elastic</artifactId>
<version>6.4.0</version>
</dependency>
影响范围
- 新增 jdbc-elastic 驱动 及 Es6Dialect、Es7Dialect
- dbvisitor-driver 连接管理机制
- jdbc-mongo 驱动稳定性
- TypeHandlerRegistry 类型匹配逻辑
更新内容
- 新增
- 新增
jdbc-elastic驱动,支持使用标准 JDBC 接口使用 QueryDSL 操作 ElasticSearch。 jdbc-elastic支持原生 REST API 风格命令(GET/POST/PUT/DELETE)及 SQL Hint 语法。jdbc-elastic支持PreparedStatement占位符?,支持Statement.RETURN_GENERATED_KEYS自动返回_id。jdbc-elastic支持LambdaTemplate和 Mapper 接口,提供类型安全的 CRUD 操作。jdbc-elastic支持预读模式(Pre-read),有效处理大结果集,避免内存溢出。SqlDialectRegister支持根据驱动提供的数据库版本选择更细粒度的方言实现。jdbc-elastic支持indexRefresh参数,可在写入操作后自动刷新索引。
- 新增
- 优化
- 优化
TypeHandlerRegistry对抽象类型的匹配逻辑,提高类型处理器的查找准确性。 - 优化 MongoDB 和 Redis 在执行多条语句时的错误处理逻辑,确保单条语句失败能正确中断后续执行。
- 统一项目中的
ObjectMapper对象使用,减少资源消耗。
- 优化
- 修复
- 修复
JdbcConnection在关闭时未触发AdapterConnection关闭导致连接泄漏的问题。 - 修复
MongoResultBuffer潜在的文件句柄泄漏问题。 - 修复 MongoDB 在通过 Session 创建 Mapper 时无法自动发现方言的问题。
- 修复
AdapterContainer在executeUpdate失败后状态未重置,导致后续查询报错的问题。 - 修复
MongoConn和JedisConn中的响应处理逻辑缺陷。
- 修复
ElasticSearch 如何使用?
使用 JdbcTemplate 执行命令
// 1. 获取 ElasticSearch 连接
Connection esConn = ...; // 参考文档:驱动适配器 > JDBC Elastic > 安装与配置
JdbcTemplate jdbc = new JdbcTemplate(esConn);
// 2. 插入数据
jdbc.execute("POST /my_index/_doc/1 { \"name\": \"mali\", \"age\": 26 }");
// 3. 查询数据
List<Map<String, Object>> list = jdbc.queryForList(
"POST /my_index/_search { \"query\": { \"match_all\": {} } }");
// 4. 更新数据
jdbc.execute("POST /my_index/_update/1 { \"doc\": { \"age\": 27 } }");
// 5. 删除数据
jdbc.execute("DELETE /my_index/_doc/1");
使用 Mapper 接口操作
// 1. 定义实体类
@Table("my_index")
public class UserInfo {
@Column(value = "uid", primary = true)
private String uid;
@Column("name")
private String name;
// getters and setters
}
// 2. 定义 Mapper 接口
@SimpleMapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
@Insert("POST /my_index/_doc { \"uid\": #{user.uid}, \"name\": #{user.name} }")
int saveUser(@Param("user") UserInfo user);
@Query("POST /my_index/_search { \"query\": { \"term\": { \"uid\": #{uid} } } }")
UserInfo loadUser(@Param("uid") String uid);
}
// 3. 使用 Mapper
try (Session session = config.newSession(esConn)) {
UserInfoMapper mapper = session.createMapper(UserInfoMapper.class);
// 保存
UserInfo user = new UserInfo();
user.setUid("1111");
user.setName("mali");
mapper.saveUser(user);
// 查询
UserInfo loaded = mapper.loadUser("1111");
}
使用 LambdaTemplate 操作
// 1. 获取 ElasticSearch 连接
LambdaTemplate lambda = new LambdaTemplate(esConn);
// 2. 插入数据
UserInfo user = new UserInfo();
user.setUid("1001");
user.setName("test_user");
lambda.insert(user);
// 3. 查询数据
UserInfo loaded = lambda.query(UserInfo.class)
.eq(UserInfo::getUid, "1001")
.queryForObject();