dbVisitor 统一数据库访问库,更新 v6.2.0,对 Redis 5 大数据类型操作更加丝滑

dbVisitor 数据库数据库访问库,提供 Java 对多种不同类型数据库统一访问。让数据的读写更加自然。

dbVisitor 是建立在 JDBC 基础之上,它改进了 JDBC 低级接口提供更加自然的 API。主要包含如下三个部分:

  • dbvisitor,是核心模块,提供统一的数据库访问 API。
  • dbvisitor-adapter,是 JDBC 驱动适配器集合,目的是使不具备 JDBC Driver 的数据库可以用过 JDBC 接口访问。支持 Redis、MongoDB 等非关系型数据库。
  • dbvisitor-integration,是 dbVisitor 与主流框架的集成模块。支持 Spring、SpringBoot、Solon、Hasor、Guice 等主流框架。

dbVisitor 是方便 Java 访问数据库的库,虽然有些类似 ORM 但和真正意义上的 ORM 理念比起来还是有很多不同点。

dbVisitor 是简单的,它专注数据库的访问。任何带有具体业务含义的特定功能都不属于 dbVisitor 范畴。尽管如此你仍然可以利用 dbVisitor 巧妙的设计来满足特定业务的需要。

为什么使用它?

过去关系型数据库占主导时,数据访问手段已趋多样并且涌现了大量基于 JDBC 的成熟工具;但随着非关系型数据库兴起,数据存储形式更加多元访问 API 也变得更加复杂。开发者需要在不同的 API 之间切换,增加了学习成本和使用难度。 而已有的数据访问技术如 Hibernate、MyBatis、Spring JDBC 以及 ActiveRecord、QueryWrapper、Row、Chain、JPA 等主要针对关系型数据库,在面对日益多样的非关系型存储时显现出局限性。

dbVisitor 的核心突破在于访问模式的无缝集成:开发者可以在同一项目中混合使用多种访问范式,并在关系型与非关系型存储之间获得统一体验。 借助 drivers 模块,dbVisitor 已不再局限于通过 JDBC 访问关系型数据库,而是通过适配器支持例如 Redis、MongoDB 等非关系型数据库。

在设计上,dbVisitor 提供了与 JdbcTemplate、MyBatis 近似风格的 API,这种设计可以让开发者避免接受大量新的概念和知识,从而减少学习成本和使用难度。

影响范围

  • JdbcOperations 接口和 JdbcTemplate 类
  • dbvisitor-driver 项目
  • jdbc-redis 驱动

更新内容

  • 新增
    •  Mapper 注解化Mapper FileJdbcTemplate 级别 API 上适配 jdbc-redis 驱动。
    • 恢复 5.x 版本中的 BindTypeHandler 注解。
    • XmlMapper 和 Query 注解,添加 resultTypeHandler 属性可以配置 TypeHandler
    • TypeHandlerColumnRowMapper 可以将 TypeHandler 作为 RowMapper 使用。
    • jdbc-redis 驱动新支持 PING、ECHO、SELECT、INFO 命令。
    • 对于 DataGrip 和 IDEA 内嵌 Database 插件中使用 jdbc-redis 驱动连接 Redis 的支持。
    • ResultSetExtractor 接口新增 PairsResultSetExtractor 实现,用于将结果集转换为键值对集合。
    • JdbcOperations/JdbcTemplate 新增三个 queryForPairs 方法,可以将查询结果的每一行数据都转换为一个键值对。
    • 新的 pairs 规则,用于遍历 Map/List/Array 等集合类型,并使用固定模版生成查询条件。
  • 变更
    • queryForLong 方法返回值类型从 long 变更为 Long。
    • queryForInt 方法返回值类型从 int 变更为 Integer。
    • AbstractRowMapper 类的 getResultSetTypeHandler(ResultSet, int, Class) 方法移动到 TypeHandlerRegistry 类中。
    • jdbc-redis 驱动在执行 MSET/MSETNX 命令时,返回值为添加的 Key 数量(此之前始终返回 1)
    • jdbc-redis 驱动中涉及 StoreSet 类型的相关命令在同时输出 SCORE、ELEMENT 字段时,结果集字段顺序调整为 ELEMENT、SCORE。具体命令有:
      • ZPOPMAX、ZPOPMIN、ZDIFF、ZINTER、ZRANDMEMBER、ZRANGE、ZRANGEBYSCORE、ZREVRANGE、ZREVRANGEBYSCORE、ZUNION、ZMPOP、BZMPOP、BZPOPMAX、BZPOPMIN、ZSCAN
  • 优化
    • jdbc-redis 驱动支持 ResultSet 的 isLast 方法。
    • 对于部分命令在执行完毕后通过使用 updateCount 方法返回执行结果,这些命令有:
      • HKEYS、HDEL、DEL、SET、HSET、HMSET、HSETNX、EXPIRE、EXPIREAT、PEXPIRE、PEXPIREAT、PERSIST、RENAME、RENAMENX、 TOUCH、LINSERT、LPUSH、LPUSHX、RPUSH、RPUSHX、LREM、LSET、LTRIM、MOVE、SADD、SDIFFSTORE、SINTERSTORE、SMOVE、 SREM、SUNIONSTORE、ZDIFFSTORE、ZINTERSTORE、ZRANGESTORE、ZREM、ZREMRANGEBYLEX、ZREMRANGEBYRANK、ZREMRANGEBYSCORE、 ZUNIONSTORE、MSET、MSETNX、PSETEX、SETEX、SETNX、SETRANGE
    • 对于 antlr4 的依赖,内嵌到 jdbc-redis 驱动 jar 包中,以减少外部依赖。
    • 优化 jdbc-redis 驱动报错信息。
    • dbvisitor-driver 中的 ConvertUtils 在处理 toBytes 时兼容 Byte[] 类型。
  • 修复
    • jdbc-redis 驱动中 Statement 的 getLargeUpdateCount 和 getUpdateCount 没有结果集时会抛出 SQLException 的问题。保持和 jdbc 描述一致,在没有更多结果时返回 -1。
    • jdbc-redis 驱动中 keys 命令无法执行的问题。

queryForPairs 作用

使用 JdbcTemplate 查询键值对
// 查询用户表,将用户 ID 和用户名作为 Map 返回
Map<Long, String> userMap = jdbc.queryForPairs("select uid, name from user", Long.class, String.class);

Redis 兼容如何使用?

使用 JdbcTemplate 存取对象
// 1. 使用 BindTypeHandler 注释标记 UserInfo 类,指定使用 JsonTypeHandler 来处理该类的序列化和反序列化
@BindTypeHandler(JsonTypeHandler.class)
public class UserInfo {
    ...
}

// 2. 获取 Redis 连接,并构建 JdbcTemplate
Connection redisConn = ...; // 参考文档:驱动适配器 > JDBC Redis > 如何使用
JdbcTemplate jdbc = new JdbcTemplate(redisConn);

// 3. 创建 UserInfo 对象,将其插入到 Redis 中,并使用 Json 序列化存储
UserInfo user = new UserInfo();
user.setUid("j1111");
user.setName("username");
user.setLoginName("login_123");
user.setLoginPassword("password");

// 4. 使用 user_ + uid 作为键名,arg0 为 user 对象
int affected = jdbc.executeUpdate("set #{'user_' + arg0.uid} #{arg0}", user);

// 5. 从 Redis 中查询 UserInfo 对象,并进行反序列化
UserInfo info = jdbc.queryForObject("get #{'user_' + arg0}", "j1111", UserInfo.class);

// 6. 删除 Redis 中的 UserInfo 对象
int deleteCount = jdbc.executeUpdate("del #{'user_' + arg0.uid}", user);
使用 Mapper 注解存取对象
// 1. 使用 BindTypeHandler 注释标记 UserInfo 类,指定使用 JsonTypeHandler 来处理该类的序列化和反序列化
@BindTypeHandler(JsonTypeHandler.class)
public class UserInfo {
    ...
}

@SimpleMapper()
public interface UserInfo1Mapper {
  // 1. 生成参数化命令:set ? ? 
  // 2. 决定键名:     #{'user_' + info.uid} 
  // 3. 键的值:       #{info}
  @Insert("set #{'user_' + info.uid} #{info}")
  int saveUser(@Param("info") UserInfo info);

  // 1. 生成参数化命令:get ?
  // 2. 决定键名:     #{'user_' + uid}
  @Query("get #{'user_' + uid}")
  UserInfo loadUser(@Param("uid") String uid);

  // 1. 生成参数化命令:del ?
  // 2. 决定键名:     #{'user_' + uid}
  @Delete("del #{'user_' + uid}")
  int deleteUser(@Param("uid") String uid);
}
使用 Mapper File 管理命令(Mapper)
@RefMapper("dbvisitor_scene/redis/user-mapper.xml")
public interface UserInfoMapper {
  int saveUser(@Param("info") UserInfo info);

  UserInfo loadUser1(@Param("uid") String uid);

  UserInfo loadUser2(@Param("uid") String uid);

  int deleteUser(@Param("uid") String uid);
}
 
使用 Mapper File 管理命令(Mapper File)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//dbvisitor.net//DTD Mapper 1.0//EN"
        "https://www.dbvisitor.net/schema/dbvisitor-mapper.dtd">
<mapper namespace="net.hasor.scene.UserInfoMapper">
  <insert id="saveUser">
    set #{'user_' + uid} #{info}
  </insert>

  <select id="loadUser" resultType="net.hasor.scene.UserInfo">
    get #{'user_' + uid}
  </select>

  <delete id="deleteUser">
    del #{'user_' + uid}
  </delete>
</mapper>
优秀的个人博客,低调大师

微信关注我们

转载内容版权归作者及来源网站所有!本站原创内容转载请注明来源!

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

相关文章

发表评论

资源下载

更多资源
优质分享Android(本站安卓app)

优质分享Android(本站安卓app)

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario,低调大师唯一一个Java游戏作品

Mario,低调大师唯一一个Java游戏作品

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Apache Tomcat7、8、9(Java Web服务器)

Apache Tomcat7、8、9(Java Web服务器)

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse(集成开发环境)

Eclipse(集成开发环境)

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。