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,否则会报错。