概述

由来

Hutool-db是一个在JDBC基础上封装的数据库操作工具类,通过包装,使用ActiveRecord思想操作数据库。在Hutool-db中,使用Entity(本质上是个Map)代替Bean来使数据库操作更加灵活,同时提供Bean和Entity的转换提供传统ORM的兼容支持。

整体的架构

整体分为几部分:

gaishu\_1.png

  • 数据源 DataSource
  • SQL执行器 SqlExecutor
  • CRUD的封装 DbSqlConnRunner SqlRunner
  • 支持事务的CRUD封装 Session
  • 各种结果集处理类 handler
  • 数据库的一些工具方法汇总 DbUtil还有就是没有列出来的dialect(数据库方言),我会根据给定的DataSource、Connection等对象自动识别是什么数据库,然后使用不同的方言构造SQL语句,暂时支持的数据库有MySQL、Oracle、SqlLite3,当然如果识别失败会用ANSI SQL,这样遇到不支持的数据,可以搞定大部分方法。

下面解释下:

CRUD的封装 Db SqlConnRunner SqlRunner

这两个类有些相似,里面都封装了增、删、改、查、分页、个数方法,差别是SqlConnRunner需要每个方法都传Connection对象,而SqlRunner继承自SqlConnRunner,在传入DataSource会自动获取Connection对象。

各种结果集处理类 handler

此包中有个叫做RsHandler的接口,传入ResultSet对象,返回什么则在handle方法中自己指定。实现的类有:

  • EntityListHandler 转换为Entity列表
  • NumberHandler 当使用select count(1)这类语句的时候,或者返回只有一个结果,且为数字结果的时候,用这个handler
  • EntityHandler 返回一条记录的时候用这个 java ltSetStatementPreparedStatement``Connection这几个接口实现了Closeable接口,所以之前只能判断类型再去关闭,这样一个close方法可以关闭多个对象。

对象解释

1. Entity

在ORM中,我把一张表中的一条数据映射成为一个叫做Entity的类,继承自HashMap,key是字段名,value是Object类型,字段值,这样一个Entity对象就是数据库表中的一条记录,当然这个对象中还有个字段是表的名字,方便之后的操作。之后对数据库增删改查操作的对象大多是这个。

这个对象充当着两种角色,一个是数据的载体,表示一条数据,另一个就是where语句的条件,充当where条件时,key依旧是字段名,value是字段条件值。例如:

Entity where = Entity.create(TABLE_NAME).set("条件1", "条件值");

表示的where语句是:

WHERE `条件1` = 条件值

当然到时候会用PreparedStatement,不会出现SQL注入。

2. Table Column

这两个对象主要是描述数据库表结构的,暂时和ORM本身没啥关系,只是当你想获得一些字段信息的时候,这样来获得表结构信息:

private static void getTableMetaInfo(DataSource ds) {
    // 获得当前库的所有表的表名
    List<String> tableNames = DbUtil.getTables(ds);
    Log.info("{}", tableNames);
    /*
     * 获得表结构 表结构封装为一个表对象,里面有Column对象表示一列,列中有列名、类型、大小、是否允许为空等信息
     */
    Table table = DbUtil.getTableMeta(ds, TABLE_NAME);
    Log.info("{}", table);
}

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

results matching ""

    No results matching ""