随笔-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新坐标 阅读(246) 评论(0)  编辑  收藏

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


网站导航: