王朝网络
分享
 
 
 

不同于hibernate,利用通用持久类实现数据增、删、改、查,可极大提高开发效率

王朝other·作者佚名  2006-07-13
宽屏版  字体: |||超大  

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

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

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

一、通用持久类简介:

1.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类及相关类的类图

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有