Data Access Layer(DAL)描述的是服务端处理客户请求的逻辑,它将逻辑处理和数据处理分离开来,处理逻辑的时候是我们编写java代码,比如前台需要更新一个字段,我们构造一个对象,将这个字段值设置进去,这样的逻辑是我们通过java代码编写来实现。进行数据处理的时候,比如保存,是我们将要保存的对象传给一个接口,接口帮我们处理,至于接口怎么处理我们就不需要管了。
一. 简单的hello world 举例
新增一条记录
// create the object through the factory
final Category bpg = OBProvider.getInstance().get(Category.class);
// set some values
bpg.setDefault(true);
bpg.setDescription("hello world");
bpg.setName("hello world");
bpg.setValue("hello world");
bpg.setActive(true);
// store it in the database
OBDal.getInstance().save(bpg);
更新一个字段
// create an OBCriteria object and add a filter
final OBCriteria<Category> obCriteria = OBDal.getInstance().createCriteria(Category.class);
obCriteria.add(Restrictions.eq("name", "hello world"));
// perform the actual query returning a typed list
final List<Category> categories = obCriteria.list();
final Category cat = categories.get(0);
// and set a new name
cat.setName("another hello world");
OBDal.getInstance().save(cat);
二. DAL Architecture(DAL 构架)
三. DAL主要的几个类
1. BODal
该类主要用于获取和保存对象到数据库,它提供如下方法:
save:用于保存对象或者更新对象,如果该记录在数据库中存在则更新
get:通过主键获取某一个对象
remove:删除一个对象
create OBCriteria:创建一个OBCriteria对象用于查询
commitAndClose and rollbackAndClose:提交修改记录,或者回滚修改记录,这个通常是openbravo自己完成
2. OBCriteria
该类继承自hibernate的criteria接口。能够设置查询条件,查询记录条数,从哪一行开始查起,排序等等。详情看如下代码:
final OBCriteria obc = OBDal.getInstance().createCriteria(Currency.class);
//查询条件
obc.add(Expression.eq("name", "testname"));
//排序
obc.addOrderBy("name", false);
//从第100行起,查询10行
obc.setFirstResult(100);
obc.setMaxResults(10);
//查询所有失效的记录(默认查有效记录)
obc.setFilterOnActive(false);
//统计行数
final int bpGroupCount = obc.count();
//获取查询结果
final List<BPGroup> bpgs = obc.list();
3. OBQuery
OBQuery继承于hibernate的query接口,创建类的时候传入俩参数,参数1:对象名,参数2:查询条件
final OBQuery<Category> obQuery = OBDal.getInstance().createQuery(Category.class,
"name='testname' or searchKey='testvalue'");
final List<Category> bpgs = obQuery.list();
4. OBProvider
要保存的对象,不能通过new关键字创建。必须通过OBProvier的一个方法来创建。比如:
final Category bpg = OBProvider.getInstance().get(Category.class);
// The ENTITYNAME constant is created by the business object generation logic
final BPGroup bpg = (BPGroup)OBProvider.getInstance().get(BPGroup.ENTITYNAME);
四. Openbravo业务对象
业务对象用于传送数据,比如后台java逻辑构造了一个业务对象,传递给数据库处理模块,然后数据库处理模块将这个对象保存到数据库。
1. BaseOBObject
Openbravo中所有的业务对象都继承自BaseOBObject,该类提供一些功能:提供直接访问属性的get/set方法,合法与安全性校验等等
2. 生成业务对象
在开发的时候,DAL将会为每一个数据库中的表创建一个业务对象,这是作为编译的一部。编译成功之后,这些业务对象放在src-gen文件夹下面。这些业务对象都继承自BaseOBObject,他们的set和get方法是利用父类BaseOBObject实现的,代码示例如下:
public String getRecord() {
return (String) get("record");
}
public void setRecord(String record) {
set("record", record);
}
3. 对象及其属性命名规则
对象命名
一个对象有好几个名字,
AD_Table表中的tablename:数据库中对应的表名。
AD_Table表中的name:是一个全局的唯一标识,用于在XML文件中标识这个对象,可以用于导入导出。(不包含空格)
AD_Table表中的classname:当生成一个java对象的时候,用这里面定义的名称来创建java对象。
属性命名
一些基本的属性的名称取自AD_Column表的name列,比如用户名称,电话号码等等。
一对多的情况,命名有些不同,比如:
1. 子表c_orderline有一个外键c_order_id指向父表c_order,那么父表对应的对象Order,有一个属性代表它的所有子表信息,那么这个属性命名应该是orderLineList.(子表名称+list)
2. 如果外键名称跟父表的主键名称不同,那么命名规则得变成(子表名称+外键名称+list),c_orderline有一列c_orderheader_id,而父表的主键名称为c_order_id. 那么这个属性应该命名为OrderLine_orderheaderList。
另外还有一些约束:空格不允许,下划线会去掉,只允许字母和数字,首字母小写。
4. 创建业务对象
我们不能通过new关键字来创建对象,必须通过一个类的一个方法,这个类叫做OBProvider,比如:
final Category bpg = OBProvider.getInstance().get(Category.class);
ob会根据这个对象是否有id和newOBObject标识位来判断这个对象是否是新创建的对象,如果没有id则是新建的,如果你要自己设置id,那么必须把newOBObject标识位设置成true,否则会报错。