sober帮助
作者:陈原
mail:cayu@gzec.com.cn
QQ:39793751
home: http://www.jspx.net
1.简介
首先在orm这块不得不提hibernate它引导了orm这块的进步,搞java数据库的都不太可能没听说过它.我也使用了很长时间的hibernate但hibernate有不少让我感觉不满意的地方,很多人说hibernate慢,其实不然hibernate能够做出很快的数据库应用来,但它的设计上太为了oo而oo,制造了很多的陷阱,让不熟悉的人一用就头痛.特别是在映射和延时加载上,如果你完全的按照oo来设计你的数据库,不是慢就是问题.而且最不舒服的地方hibernate的缓存,用了和没用一样,hibernate值在缓存中保存了数据记录的ID并没有实体,下一次查询的适合在一个一个的查询出来,痛苦的事情. Amber一个很有研究价值的orm,sober就是模仿了它的映射配置方式,感觉不错resin主推它.ibatis 是 apache的orm从配置和速度上来说不错,但很多人对它的分页愤愤不平.sober提供了它的SQL映射配置方式查询.在看过这些orm后最后我决定自己写一个orm就是sober.让简单的数据,保存,编辑,增加如同hibernate一样方便,配置如同amber一样人性,复杂的SQL使用ibatis的映射方式完成.严格的来说sober只是一个JDBC扩展。它能够让你简单方便的操作数据
和hibernate的不同点说明.很多人感觉hibernate不好用的问题在于对hibernate不了解。
很多人想当然的使用JDBC的概念来使用hibernate.这是一个错误的开始。因为hibernate
的宣传就是让你不必了解细节直接操作数据,但这样就会出现不少细节上的问题。
因为hibernate并不是一个jdbc的简单扩展,他包括了映射管理和缓存管理,HQL转换,内部还包括了复杂统计。
如果你不了解hibernate又使用了不少hibernate的高级特性还在做复杂的操作,很可能就掉入那些不小心就会犯的错误中。在hibernate 后期版本中感觉缓存功能改进了不少,要好用多了,但那个包又大又多有占内存,感觉只时候中型项目。
正是这样所以有了写Sober的想法,Sober是一个真正JDBC的扩展,内部没有复杂的缓存,数据统计这些。
只是对JDBC直接的操作。让你的操作和JDBC没区别,同时又既有了hibernate的简便性。
就用JDBC的概念来使用没有一点问题。
2.功能说明
- 标签配置数据库映射,简单,直观.可以自动建表.
- 数据处理直接连接到JDBC保存速度快捷.
- 参数控制映射对象是否加载,更灵活,快速.查询细粒度.
- 多种查询处理方式.可以使用hibernate的Criteria方式,sql查询方式和Ibatis的sql映射配置方式.还提供了简单的ssql表达式查询方式.
- 类似hibernate的数据库适配器,Dialect支持主流数据库.采用Criteria方式,目前对数据库Postgresq 8.3xl以上版本和mysql支持比较好.
- 提供事务支持JDBCTransaction和JTATransaction.让你能够应用在复杂的高安全环境.
3.配置使用说明
下边我们使用sioc配置方式, 当然你也可以使用代码写程序实现配置.
首先你需要配置一个数据源,sober提供了一个数据库连接池,速度和稳定性在2.1版本后都很优秀了。你也可以使用其他的数据源比如c3p0
Jspx连接池的比较和使用可看这里Jspx连接池帮助
c3p0数据连接池配置例子(当sober提供的数据源不能够在满足要求的时候才推荐使用)
下边例子演示了c3p0的连接池配置,换一下类命就可以了很方便。
(使用的时候一个就可以了)
下边是sober的环境配置,com.jspx.sober.config.SoberMappingBean是配置bean,使用单列运行
4.jdk1.5标签映射配置说明
标签说明
| 标签 |
参数说明 |
| Column |
notNull:是否不允许为空,option:选择范围 ,valid:验证,defaultValue:默认值,length:长度
caption:字段的描述
boolean notNull() default false;
是否为空
String option() default "";
选择范围,例如 option="1:yes;0:no"
String valid() default "";
String defaultValue() default ""; //默认值,映射到数据库
int length() default 0; // 长度,映射到数据库 |
Id
[boolean auto() default true;
String type() default "seq";
int length() default 16; //max 19
long max() default Long.MAX_VALUE;
int min() default 0;int next() default 1;boolean dateStart() default false;] |
auto:是否自动生成ID,type:生成方式
s seq:系统默认生成 yyyyMMddhhss + 序列,类型可以是long 和 String
seq:的时候使用下边的配置创建系列
uid:jdk1.5 默认生成 b2a53eef-3a29-44ff-bca5-72abc9568785,类型可以是String
uid:为long类型使用 UUID getMostSignificantBits 生成
serial:数据库 自动增加
果 auto=false 就会 type=serial 更具数据库得到
auto=true 如果里边已经有值,将不创建id,否则更具type生成 |
| Nexus |
mapping:映射关系,name:自己表的字段,targetName:对应的数据字段,targetEntity:对应的类,term: 条件使用 ssql表达式,orderBy:排序 |
| Table |
name:表名称映射到数据库,caption:说明性文字 |
| CalcUnique |
sql:统计的sql,entity用到的实体,eg: @CalcUnique(caption = "说明", sql = "SELECT COUNT(*) FROM ${entity1} WHERE matterId=${id}", entity ={Remark.class} ) |
参数说明
Id标签的type有下边几种生成方式
seq:系统默认生成 yyyyMMddhhss + 序列,类型可以是long 和 String
uid:jdk1.5 默认生成 b2a53eef-3a29-44ff-bca5-72abc9568785,类型是String
uid:为long类型使用 UUID getMostSignificantBits 生成
serial:数据库 自动增加1
CalcUnique标签
sql = "SELECT COUNT(*) FROM ${entity1} WHERE matterId=${id}", entity ={Remark.class}
entity1:是实体1,你要用到是实体,使用1,2,3方式,配合freemaker语言表示
entity:是一个数组,包括了你在本sql中会用到的实体
Column标签
Date类型的时候,如果不允许为空,默认为当前时间.默认都使用日期时间类型。
Nexus标签
表示映射关系,mapping关系可以在MappingType得到定义。
public static final String ManyToOne = "ManyToOne";
public static final String OneToOne = "OneToOne";
public static final String OneToMany = "OneToMany";
我们来配置写两个bean分别映射到数据库.并且里边配置一对多和多对一的方式.演示例子使用投票的关系,一个投票主题表VoteTopic 和投票选项Vote 我们使用两个表来分别保存数据,很象Amber的映射配置吧.
例子1.我们来配置一个简单的bean来演示.
如果不是在web服务器里边运行,作为应用运行的化,我们使用下边语句来初始化应用.
例子2:下边我们来做一个有映射关系的例子,一个投票的设计.
下边是投票的说明主信息保存bean
Vote 投票选项表
下边我们来看看如何操作数据,保存的时候使用事务功能
2.1版本以前没有事务功能,2.1版本后添加了JDBC事务和JTA事务功能。
看看是不是很象hibernate,使用他们完成基本的数据操作很舒服吧.而且粒度更细一些,更好控制一些.
下边我们来看看 ibatis方式的映射sql查询?看上边配置文件载入使用的是*..sqlmap.xml,所以在会在启动的时候自动载入sql配置文件 votetopic.sqlmap.xml
使用的是Freemaker 模版(当应用在存在复杂的多表时推荐使用这种查询方式,因为这种查询方式比较灵活,而且优化的sql能够很好的提高性能)
votetopic.sqlmap.xml
假设包路径为:jspx/apply/table 在使用的时候更改为你相应的路径
查询列表 模版中放入了默认的几个变量
databaseName:数据库名,方便你实现跨数据库的映射配置
currentPage:当前页
totalCount:每页显示行数
loadChild:是否导入映射对象(优化查询)
rollRows:是否滚动到行
最后还提供了hibernate的Criteria扩展方法.用法和hibernate的差不多(推荐一般查询使用方法)
你也可直接使用sql,来完成查询,更新
查询VoteTopic中2页每页5个数据,最后的false表示不载入映射对象.(更具应用时间需要)
List list = genericDAO.queryForList(VoteTopic.class, "select * from ${table_name}", null, 2,5, false);
保持读取图片的例子
下边在做一个保持读取图片的例子,我们先定义一个实体bean
在这里是保存图片,和查询出来的代码
下边我们在来介绍使用标签方式annotation来定义DAO查询的方法.不过这种方式比较简单,对于逻辑复杂的处理有些不太好.
但设计出发点是比较好的.因为需要代码不多,我就将他实现了,配合上边的方法使用也不错.实际大型的应用在不推荐.
配置继续上边的基本配,添加如下配置
com.jspx.example.AnonDemoDAOImpl.java 代码如下
AnonDemoDAO 接口的代码如下
下边我们就可以操作数据了.