开篇
端午没事儿干扩充了下Hutool的DB部分,原来只是一个简单的SQL运行器,现在加入了方言支持,封装了增删改查,引入Session从而支持事务,可以说工程量巨大,在封装过程总我还是参考了Jodd的DbOom、Jfinal的ActiveRecord、Apache Commons-DbUtils,吸取优点,剔除我觉得没用的,再加入些自己的想法,尽量做到简单和灵活。
版本支持
由于上次已经将1.0.0版的Hutool提交到了Maven中央库,且这次也是一个重大的改进,所以把这次的更新全部放到1.1.0版本中,考虑到未完全测试,所以你可以在Github上clone下来使用,或者看下我的代码,体会下我的思想以及设计哲学(哲学这个词好有逼格……)。
由来
考虑到Hibernate做ORM的复杂性,它想把一个对象映射到数据库,再加上各种外键的复杂对应关系,当时学习的时候整的我焦头烂额,而且其数据库连接配置全部放在xml里,需要连接池插件去为它开发对应的插件,显然这样做太霸道了,总之这种灵活性的缺失,导致在使用Hibernate的时候必须按照它指定的思路和方式走,痛苦万分啊,例如你执行一条SQL语句,查询的结果是个让人百思不得其解的列表,难用的要死。后来我便倾向于Apache Commons-DbUtils,谁让业务简单呢,没几张表,简简的看了其源码,做了些简单的改进放到我的Hutool里来了,然后就看了Jfinal的ActiveRecord,那段时间正在看Python的一个框架Django,发现其异曲同工之妙的ORM方式:将数据库表映射为一个Map,而不是一个对象。这样的灵活性大大的增加,字段也更加灵活。于是按照这个思想开始动工,封装增删改查的常用方法。
对象解释
1. Entity
在ORM中,我把一张表中的一条数据映射成为一个叫做Entity的类,继承自HashMap,key是字段名,value是Object类型,字段值,这样一个Entity对象就是数据库表中的一条记录,当然这个对象中还有个字段是表的名字,方便之后的操作。之后对数据库增删改查操作的对象大多是这个。
这个对象充当着两种角色,一个是数据的载体,表示一条数据,另一个就是where语句的条件,当然,Entity对象只支持 = 操作,更复杂的操作我以后再想别的办法。充当where条件时,key依旧是字段名,value是字段条件值。例如:
Entity where = Entity.create(TABLE_NAME).set("条件1", "条件值");
表示的where语句是:
WHERE `条件1` = 条件值
当然到时候会用PreparedStatement,不会出现SQL注入。
2. Table Column
这两个对象主要是描述数据库表结构的,暂时和ORM本身没啥关系,只是当你想获得一些字段信息的时候,这样来获得表结构信息:
/**
* 获得表的元数据
*
* @param ds 数据源
*/
private static void g