随笔-39  评论-33  文章-0  trackbacks-0

DAO 类 + 通用持久类,实现数据增、删、改、查

 

标题中“ DAO 类”指 net.newxy.dbm.BaseDAO 或其子类,“通用持久类”指 net.newxy.dbm.DynaDto 。

利用 newxy( 新坐标 )DAO 类及通用持久类对数据进行增、删、改操作可以不依赖于 struts ,运用系统不一定要支持 struts ,方法极其简便。

一、通用持久类简介:

1 . net.newxy.dbm.DynaDto 类图

net.newxy.dbm.DynaDto类图

2 . net.newxy.dbm.DynaDto 在数据操作中作为方法的参数

对数据的增、删、改都是以通用持久类对象为参数调用 net.newxy.dbm.DBM 的方法来完成的。如:

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();

dynaDto.set_table(“table1”);// 设置数据库表名

dynaDto.set(“field1”,“value1”);// 为字段 field1 赋值

……

插入或更新记录: dao.update(dynaDto);

……

删除记录: dao.remove(dynaDto);

……

获取某条记录: dao.load(dynaDto);

通用持久类 net.newxy.dbm.DynaDto 在 newxy( 新坐标 ) 框架中起作重要作用。

3 . net.newxy.dbm.DynaDto 的 public void set(String name, Object value) 方法中 value 数据类型

DynaDto.set(“field1”,”value”) 为字段 field1 赋值,调用了 DynaDto 的 public void set(String name, Object value) 方法, value 值应是数据库字段类型对应的 java 类型,或它们的 .toString() 字符串符。如字段类型是 int , value 可以是 Integer 类型或字符串型,如在 sybase 里字段类型是 smalldatetime 类型, value 应是 java.sql.Timestamp 类型或字符串型。

4.newxy( 新坐标 ) 对数据库表主关键字段的处理及对主关键字段的设计建议

(1)    表的主关键字段没有其它意义,只作为记录的唯一标志;

(2)    只用一个字段作为主关键字段;

(3)    主关键字段用数字类型或字符型,这样 newxy( 新坐标 ) 可以自动为其赋值;

(4)    对多字段联合构成主关键段,或非数字型非字符型字段, newxy( 新坐标 ) 不能自动为其赋值,开发者需解决为主关键字段赋值问题;

(5)    如果没有主关键字段, newxy( 新坐标 ) 会假设第一个字段作为主关键字段;

(6)    dao.update(dynaDto) 方法会检测主关键字段是由一个还是多字段组成,如果是一个字段,还会检是否可以保存数字串。如果主关键段只有一个 ( 也可能是没有主键字段时默认的第一个字段 ) ,而且可以赋给数字串, newxy( 新坐标 ) 会为其赋值,否则如果没有利用 dynaDto.set(String name,Object value) 方法为主关键字段赋值, dao.update(dynaDto) 方法会抛出异常。

 

二、 DAO 类简介:

newxy( 新坐标 ) 最终对数据的操作是通过 net.newxy.dbm.DBM 的一些方法实现的。操作数据时对数据库连接采用迟连接,早释放的原则。 net.newxy.dbm.BaseDAO 继承自 net.newxy.dbm.DBM, 实现了 DBM 类的唯一抽象方法 Connection getConnection(String dsJndi) throws Exception 。

1 . DAO 类及相关类的类图

    net.newxy.dbm.BaseDAO及相关类的类图

2 . net.newxy.dbm.BaseDAO 类获取数据库连接的方法

BaseDAO 以 jdbc/default 为数据源的资源名。如果没有 jdbc/default 资源名,以 WEB-INF/classes/ 下的 newxy.properties 文件中定义的 ds.default 的属性值为数据源的资源名,如果通过这样的资源名还是得不到数据库连接, BaseDAO 尝试在 WEB-INF/classes/ 下的 newxy.properties 中得到 drvier 、 url 、 user 、 pass 四属性值来获取数据库连接。但开发者可以通过继承 net.newxy.dbm.DBM 或 net.newxy.dbm..BaseDAO ,过载 Connection getConnection(String dsJndi) throws Exception 方法,通过写代码的方法获取数据库连接。如果前述方法得不到数据库连接, DAO 类实例就会调用开发者写的获取数据库连接方法。

请参考: newxy.properites,数据库连接、字符编码、DAO类的配置文件

3 .开发者需要关心的 DAO 类几个方法

Object findBySql(String sql) throws Exception; //result type is DynaFormBean

Object findBySql(String sql,boolean refresh,boolean cache,long interval) throws Exception;  

Object findByPrimaryKey(Object parms) throws Exception;

Object callByMethodName(String callByMethodName, Object parms) throws Exception;

List list(String sql) throws Exception;

Object load(Object dto) throws Exception;//*

Object update(Object dto) throws Exception;//*

void remove(Object dto) throws Exception;//*

void prepareStatement(String sql) throws SQLException;

void prepareCall(String sql) throws Exception;

Object prepareCall(Class c,String sql,Object[] params) throws Exception;

本篇只讲解三个带 * 的方法,它们与持久类有关。

 

三、 DAO 类 + 通用持久类完成对数据库的操作:

newxy( 新坐标 ) 在设计数据插入与更新的方法时采用了 Delphi 及 C++Builder 数据更新策略, DataSet 有个方法 ApplyUpdates ,如果是在组件中新增一行,作插入操作,如果是对组件中某条记录数据更改,作更新操作。 newxy( 新坐标 )net.newxy.dbm.DBM 用个 update(Object dto) 方法,如果持久类对象不含主关键字段值,作插入操作,如果含有的主关键字段值表中已存在,作更新操作。

1. 数据插入: Object update(Object dto) throws Exception;

举例:

    try{

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();

        dynaDto.set_table("table1");// 设置表名

        dynaDto.set(“field1”,”……”);// 为字段 field1 赋值

        dynaDto.set(“field2”,”……”);// 为字段 field2 赋值

        Object result=dao.update(dynaDto);

    }catch(Exception e){

        ......

}

例中两字段 field1 、 field2 不是主关键字段,不用设置主关键段值,主关键字段值会自动得到,是原有最大值加一。

如果设置主关键字段值,如: dynaDto.set(“id”,”100”);newxy( 新坐标 ) 会检查赋给的主关键字值是否已存在,如果存在,作更新 (update) 操作,如果不存在,作插入 (insert) 操作。

判断是更新还是插入操作,可以根据返回的 result 值来判断,如果 result 值为空,是作更新操作,如果 result 不空是作插入操作。

Object result=dao.update(dynaDto);

如果想需要知道自动赋给的主关键字段值,可以用如下方法:

        Object result=dao.update(dynaDto);

        Object idValue=null;

        If(result!=null)

idValue=((DynaDto)result).get(“id”);

            idValue 就是自动赋给的主关键字段值。

2. 数据更新:

    try{

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();

        dynaDto.set_table("table1");// 设置表名

        dynaDto.set(“id”,”……”);// 为主关键字段赋值

        dynaDto.set(“field1”,”……”);// 为字段 field1 赋值

        dynaDto.set(“field2”,”……”);// 为字段 field2 赋值

        Object result=dao.update(dynaDto);

    }catch(Exception e){

        ......

}

与数据插入相比增加了 dynaDto.set(“id”,value) , 作用是为主关键字段赋值。

需注意:如果 dynaDto.set(“id”,value) 赋给的 value 在数据库表中已存在, dao.update(dynaDto) 方法仍然作更新操作。

3. 数据删除

    try{

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();

        dynaDto.set_table("table1");// 设置表名

        dynaDto.set(“id”,”……”);// 为主关键字段赋值

        dao.remove(dynaDto);

    }catch(Exception e){

        ......

}

4. 单条记录查询

    try{

net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();

net.newxy.dbm.DynaDto dynaDto=new net.newxy.dbm.DynaDto();

        dynaDto.set_table("table1");// 设置表名

        dynaDto.set(“id”,”……”);// 为主关键字段赋值

        Object result=dao.load(dynaDto);

        org.apache.commons.beanutils.DynaBean bean=( org.apache.commons.beanutils.DynaBean)result;

        Object field1Value=bean.get(“field1”);// 获取字段 field1 的值;

        Object field2Value=bean.get(“field2”); // 获取字段 field2 的值

    }catch(Exception e){

        ......

}

注意: newxy( 新坐标 ) 获取数据结果类型分两种: org.apache.commons.beanutils.BasicDynaBean 类型和 List 类型,而 List 方法 get(int item) 返回的也是 org.apache.commons.beanutils.BasicDynaBean 类型。

org.apache.commons.beanutils.DynaBean 及 org.apache.commons.beanutils.BasicDynaBean 类图:

org.apache.commons.beanutils.DynaBean 及 org.apache.commons.beanutils.BasicDynaBean 是开源项目的一个类和一个接口。 org.apache.commons.beanutils.DynaBean 接口正是 struts 动态表单类 DynaActionForm 实现的接口。也是 newxy( 新坐标 ) 通用持久类 net.newxy.dbm.DynaDto 及通用动态 formBean 类 net.newxy.struts_faces.DynaFormBean 实现的接口。

newxy(新坐标)技术网站:http://www.newxy.net

posted on 2006-07-06 08:46 newxy新坐标 阅读(281) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: