Loading repository data…
Loading repository data…
zycgit / repository
dbVisitor is a JDBC-based unified data access layer realizing "One API Access Any DataBase". Its Dual-Layer Architecture bridges RDBMS and NoSQL (MySQL, MongoDB) using standard APIs without new syntax, offering a flexible, abstraction-managed general data foundation for Java applications.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
dbVisitor 是一款基于 JDBC 标准构建的统一数据访问基座,致力于实现 “One APIs Access Any DataBase” 的愿景。 借助独特的双层适配器架构,它成功打破了 RDBMS 与 NoSQL 之间的编程壁垒,让开发者能够使用同一套标准 API 无缝操作 MySQL、MongoDB、Elasticsearch 等各类数据库。 dbVisitor 不主张发明新语法去掩盖差异,而是通过标准化与分层抽象来科学地管理差异,为 Java 应用提供了一个既具备便捷性又保留 JDBC 灵活性的通用数据底座。
dbVisitor 提供了多层次的 API 抽象,允许在 简单性 与 灵活性 之间自由切换:
@Query/XML,将 SQL/DSL 逻辑与代码分离。cobble 工具包。<dependency>
<groupId>net.hasor</groupId>
<artifactId>dbvisitor</artifactId>
<version>6.4.0</version> <!-- 请检查 Maven Central 获取最新版本 -->
</dependency>
无论操作 MySQL 还是 Elasticsearch,代码完全一致:
// 插入数据
template.insert(UserInfo.class)
.applyEntity(new UserInfo("1001", "dbVisitor"))
.executeSumResult();
// 查询数据 (自动翻译为 SQL 或 DSL)
List<UserInfo> list = template.lambdaQuery(UserInfo.class)
.eq(UserInfo::getAge, 18)
.list();
定义接口,即可享受类似 MyBatis 的开发体验:
@SimpleMapper
public interface UserMapper extends BaseMapper<UserInfo> {
// 方式一:纯 Java 构建 (无需 XML)
default List<UserInfo> findActiveUsers(int minAge) {
return this.query()
.eq(UserInfo::getStatus, "ENABLE")
.gt(UserInfo::getAge, minAge)
.list();
}
// 方式二:注解绑定 (SQL / DSL)
@Query("select * from user_info where age > #{age}")
List<UserInfo> findByAge(@Param("age") int age);
// 方式三:XML 映射 (支持原生 SQL 或 DSL)
// 配合 UserMapper.xml 使用,逻辑分离
List<Map<String, Object>> groupByAge(@Param("minAge") int minAge);
}
<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
<select id="groupByAge">
<!-- 编写原生 SQL (MySQL) -->
SELECT age, count(*) FROM user_info
WHERE age > #{minAge} GROUP BY age
<!-- 或者编写 JSON DSL (Elasticsearch) -->
<!--
POST /user_info/_search
{
"query": { "range": { "age": { "gt": #{minAge} } } },
"aggs": { "age_group": { "terms": { "field": "age" } } }
}
-->
</select>
</mapper>
当所有抽象都无法满足需求时,你可以直接穿透框架:
JdbcTemplate template = ...;
// 1. 原生 SQL/Shell 透传 (直接执行数据库能识别的命令)
// MySQL
template.queryForList("select * from user where id = ?", 1);
// MongoDB (直接写 Mongo Shell)
template.queryForList("db.user.find({_id: ?})", 1);
// 2. 底层 SDK 直达 (Unwrap 机制)
T resultList = jdbcTemplate.execute((ConnectionCallback<T>) con -> {
// 通过标准 JDBC Connection,拆包出底层的原生驱动对象 (如 MongoClient)
if (conn.isWrapperFor(MongoClient.class)) {
MongoClient client = conn.unwrap(MongoClient.class);
// 调用官方 Driver 的任意 API ...
}
return ...;
});
dbVisitor 使用商业友好的 Apache 2.0 许可协议。