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