A.配置简单
引擎的总配置文件只有一个。(实际上在最精简的情况下,连这个配置文件也可以不要,此时需要使用dbcp、c3p0、tomcat等已有的数据源,唯一的配置是在web.xml中的两项设置)。不需要针对每个表进行映射配置。甚至可以不需要传统的数据操作dao,只需定义业务方法接口,在接口的实现中调用引擎的方法。这样,在MVC的模式中,M中就只有业务逻辑内容,没有单独的数据层了。
许多开源ORM引擎都要针对每个库表建立映射(包括视图),不光是xml文件泛滥,一旦库表修改、或新加表,都要进行重新映射,重启应用服务,但udbc引擎是零配置,即使是新加库表,也不必重启,哪怕是像一对一、多对多等关联取数,也可很轻松的应对。
不用操心事务处理,引擎都已经作了处理。引擎也提供了更精细的事务控制,在代码中可以很方便的设置。
B.调用简便
引擎api的常用类只有两个,所有操作方法都在DataCenter中,方法命名称按功能块区分,一目了然。
如果是针对单表的操作,只需要传入表名(或视图名),再加几个参数,两三行就解决,不需要作任何其它动作,不用写任何sql语句。
如果是简单的多表关联查询,也只是多传几个参数,就可轻松搞定一对一、一对多、多对多的查询。引擎也提供另外的实现方式,将关联映射放配置文件中。
如果想使用分页,一行即可。分页取数时,记录总数也一同返回(常规情况下,都是用两条查询条件完全相同的sql执行两次数据访问)
如果想使用延迟加载,一行就可。
如果想使用缓存,一行就可,缓存时间随定。
如果想设置事务回滚点,一行就可。
如果想要乐观锁机制,在配置文件加一行就可(与库表协同)。
如果想调用存储过程,不管是hibernate或ibatis或其它,都有一堆东西要写,引擎的调用与普通数据操作方法是一样的简单。
如果涉及复杂多表操作,或者复杂的业务逻辑,必然要到sql。这时只需将sql(可以是符合特定数据库的语句,可以像ibatis那样构建动态的语句)配置在xml中,赋予一个id,就可直接调用了。这有点类似ibatis,但过程极大简化了。
为了达到最好的性能,引擎的很多关键环节都有优化动作。
引擎提供了两种面向对象的操作,面向实体对象和面向Map对象,前者更接近hibernate的方式,后者更精简。不管哪种方式,数据操作都是极其自然的、极其简单的。
原来需要在多个地方写几十行的代码,使用引擎,三几句就可以解决。
C.性能卓越
由于是对jdbc直接进行的轻量封装,其性能没有大的折扣,实际上,引擎提供的某些方法性能还超越了常规jdbc。在postgresql、oracle、mysql下,通过对比,引擎的性能显著优于hibernate、ibatis、mybatis等。
对大批量的插入数据、或一次需要读取多种数据,引擎提供了特别的方法,充分利用了现代处理器的特点,采用高并发操作,可以大大提高应用的吞吐量。
hibernate、mybatis等orm工具倾向于操作全部字段数据,虽然可以通过配置避免,但无疑加大了工作量,并且不能随心所欲地控制,UDBC引擎则以很自然的方式进行操作,很容易避开不必要的字段查询或更新。
此外,根据编程风格的不同,进行同样的数据操作,其它orm框架所生成的java对象比udbc要多出许多,jvm要进行额外的垃圾回收,这是引擎所带来的看不见的性能提升。
D.功能齐全
引擎的方法有80多个,包括了增、删、改、查、聚集运算、批量复制、存储过程调用、迭代取数、关联取数、关联存储等功能,有关数据操作的内容几乎要有尽有。
此外还提供了一些高并发的数据操作方法。例如,多路并举操作,就是将在短时内单个的插入或更新请求合并到一起,批量提交到数据库,可极大地提高带数据操作的并发访问性能;大批量的插入、修改、删除采用多线程方式,将数据库性能发挥到极致;单次并举,在一次请求中,将多个返回结果互不相关的数据操作同时提交,最先完成的操作第一个返回,避免了顺序提交产生的无谓等待。
虽然这些方法的背后有些稍复杂的逻辑,但面向调用者的接口却是相当简单的,和普通的数据操作没什么两样。
如果是mysql,并且设置了主从库,使用数据引擎,将写主读从,不管有多少从库,都能应对。
当然,hibernate或ibatis可能有的一些特别功能,引擎不一定都有。
为了方便面向实体对象的操作,引擎提供了一个java swing界面,只需要输入数据库的连接属性,就可以自动生成表的实体映射对象,以及对应的类似于dao的数据操作类,这个dao含有DataCenter中的常规操作方法,方法名完全相同,只是调用时,少传第一个参数,也就是不需要传表名,使用更便捷。生成的类,是按java的规则命名的,如果表名或字段名含有下划线,那么对应的类名就符合驼峰的命名规则。
打开界面的方式:java -jar udbc.jar 在同目录下还需要相应的数据库驱动jar包。
有的环境,直接双击udbc.jar也可打开swing界面。
当使用xml sql操作时,如果修改了sql,是需要重启应用的,但为了开发方便,在应用不重启的情况下,可以在调用具体的功能前,先调用:
DataCenter.reLoadXmlFile(sqlPath);
sqlPath是xml文件的类路径。生产环境中,一定要去掉该行代码。
在快速入门中,介绍了不启动应用,直接调用引擎的方法的方式,这就是在main方法中,在前面加上这句:new UDBCIniter().init(),它作了一些初始化的工作。生产环境中,一定要去掉该行代码。在调用结束后,如果有修改数据的操作,再加上这句:DataCenter.ensureCommit(),正式环境中,这句不是必需的。
为了观察引擎在运行时,实际执行的SQL,在udbcConfig.xml的节点<commonConfig>中加入这句就可:<property name="showsql" value="true"/>,节点<commonConfig>在前面配置乐观锁的版本名称时提到过。
当一个应用被部署在多个客户环境时(企业级应用,各客户是互不相关的),如果有新建表的需求,那么需要在每个客户的库上创建库表。引擎提供了库表同步的功能(如果是修改表、删除表,仍然要手工在每个客户库上操作)。
在udbcConfig.xml中增加以下配置:
<tableSql>
<sqlfile="/sql/tabs1.xml"type="db2"/>
<sqlfile="/sql/tabs2.xml"type="oracle"/>
</tableSql>
上面有两个配置项文件,是因为不同的用户使用的库可能不一样,因此建表脚本也不一样。两个xml文件放置在应用的WebRooot下,库类型暂时只支持四种:
oracle, db2, sqlserver, mysql
tabs2.xml的内容举例如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<tables>
<tablename="users">
create tableusers
(
idnumber(10,2),
namevarchar2(20),
agenumber(3)
)
</table>
</tables>
tabs2配置中只列了一个建表脚本,可以列出库中所有表的脚本,也可只列出后来新加的。
当程序运行时,如果发现某个要操作的表对象不存在,就会根据名称找到配置语句,在库中创建相应的表。
引擎的方法都是静态的,直接调用即可。只有使用不多的DataActs需要实例化。
从方法的参数上看,可大体分两类,一类是针对xml sql语句的,一类是针对数据库表的。前者的方法中必定有sqlid参数,后者必定有tablename。不管是哪类,都有增删改查和获得记录统计数的方法。方法的参数中,顺序都是一致或一样的。
从返回的结果来看,主要是两类,List<Map<String,Object>>、List<T>(调用时返回的 是具体的实体类结果集)。方法getMapList和queryMapList返回的是List<Map>,而getObjectList和queryObjectList返回的是List<T>,以query开头的方法是针对sql的,以get开头的方法是针对数据库表的。所有的增、删、改方法均以exe打头。方法名中含param的,参数中必定有Object[]类型。增删改方法命名中,针对xml sql的是exeAdd,exeEdit,exeRemove,针对库表的是exeInsert,exeUpdate,exeDelete
3. IDE工具下
按照上述规律,在IDE中调用时,可很容易找到所需要的方法。例如,如果是根据数据表进行查询,输入DataCenter.g ,全部方法将被过滤掉近一半,接着输入etm(即:DataCenter.getm),或eto,方法又被过滤掉一半,然后根据需要(如是否批量查询 batch)很容易找到所需的方法。如果是增删改,输入DataCenter.e ,ide将只列出20多种方法,其中根据sql id操作的方法名中含有add,edit,remove,针对表的增删改方法名含insert,update,delete。如果是聚集操作 (sum、avg等),输入DataCenter.c ,ide将只列出几个方法。
#使用Param的like、in、list等形式的条件参数时,如果值是数字型,不需加单引号,如果是字符串,需要加单引号,日期型也加单引号,不涉及bool型。