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