`
liwenshui322
  • 浏览: 511286 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Openbravo3.0 服务端技术--数据访问层(Data Access Layer)

 
阅读更多

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

 

 

 

 

 

 

 

 

  • 大小: 37.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics