newxy新坐标DAO类对表结构的注册过程,及表结构变化的影响

newxy(新坐标)DAO类对表结构的注册过程,及表结构变化的影响
 
在开发过程中,服务器已启动,如果改变了表的结构,程序可能会运行错误,这与DAO类的注册方法有关。为什么会发生错误,如何解决?
下面从五个方面讲解。
一、DAO 类对表结构的即时注册
newxy(新坐标)的DAO类在进行数据的查询、增、删、改时都会调用一注册方法,根据业务涉及到的数据库相关数据源名和表名进行注册, 注册的目的是要获得表字段对应的java类名,主关键字段名,主关键字段长度等数据,保存在一个单子实例中,以供DAO类调用。 如果已注册不再注册。
设有如下代码:
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=net.newxy.dbm.DynaDto();
dynaDto.set_table(“table1”);
dynaDto.set(“field1”,”......”);
dao.update(dynaDto);
dao.update(dynaDto)过程中DAO类会对表的结构进行注册:根据数据源的资源名、表名获取表的结构信息 ,包括字段对应的java类名,主关键字段名,主关键字段长度等信息,登记注册到 net.newxy.dbm.TableProperties类的单例中,如果已注册,不再注册。
二、持久类与表的影射
注册后, DAO将持久类影射到表,过程是这样的:
    持久类<-->注册信息<-->。。
正确影射的条件是:
1、dynaDto.set(fieldName,value)句设置的字段已注册,如果dynaDto.set(fieldName,value)句设置的字段没有注册,属性fieldName将被略,运行正常。
     2、注册的字段名及java类型与表的字段名与java类型相这致。
三、表结构变化的影响
如果 dao.update(dynaDto)执行过后,改变了表的结构,而服务器又没有重启,这时再执行dao.update(dynaDto)会存在下列情况:
1、改变了表名
会返回数据库报告的“表不存在”之类的错误。这是因为语句 dynaDto.set_table(“table1”)设定的表名在数据库中不存在。
2、改变了表字段名,设原字段名是“field1”,改为“field2”,这分两种情况:
(1)、已运行了dynaDto.set(“field1”,value)句,会返回数据库报告的“表中没有字段field1”之类的错误。
(2)、没有运行dynaDto.set(“field1”,value)句,会正常运行。
3、删除了字段,如删除了字段field1,而且已运行了dynaDto.set(“field1”,value),会返回“表中没有字段field1”之类的错误,否则会正常运行。
4、增加了字段,如增加了字段field2,会正常运行。如果增加了语句dynaDto.set(“field2”,value2),虽然运行正常,但表的field2不受影响,因为table1注册的信息中不含field2。
5、改变了字段类型,这分几种情况:
(1)、改变后的字段类型与之前的类型对应的java类型相同,大部分数据库char、varchar字段类型对应的java类型都是String类型,会正常运行。
(2)、改变后的字段类型与之前的类型对应的java类型不相同,这又分两种情况,可能会出错,可能不出错,在此不细说。
四、通用持久类从通用formBean 类得到了什么数据   
用户submit数据,在后台将上传的数据绑定到formBean中;通过下列语句得到持久类实例:
            DynaFormBean form=(DynaFormBean)actionForm;
DynaDto dto=(DynaDto)form.getDto();
持久类包含了上传的所有数据。
    虽然用户上传的数据都保存在dto中,但只有那些属性名已在注册信息中,才能与表影射,注册信息是直接来源于表的,所以dto中只有那些与表中字段同名的属性,才能更新表中已存在信息,或插入表中。
五、解决办法
1、最简单的办法是重启服务器,运用系统运行时重新注册表信息。
2、在开发环境下建一jsp文件,将下列代码拷到jsp文件中,运行jsp文件,点击" 清除表注册信息"按钮清除注册信息,无需重启服务器。
 
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
 
<html>
<head>
<title>
开发者帮助
</title>
</head>
<body bgcolor="#ffffff">
<%
    String url=((javax.servlet.http.HttpServletRequest)pageContext.getRequest()).getRequestURI();
    pageContext.setAttribute("url",url);
%>
<logic:present parameter="method">
 <bean:parameter id="method" name="method"/>
 <logic:equal value="clearTableProperties" name="method">
    <%
       net.newxy.dbm.TableProperties.clear();
    %>
    <script type="text/javascript">
      alert("注册信息已清除,无需重启服务器!")
    </script>
 </logic:equal>
</logic:present>
<h1>
开发者帮助
</h1>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;在开发过程中改变了数据库表结构,jsp页面表单中的属性名作相应改变。但原来表的信息可能已注册,需要清除已经注册的信息,否则会出现错误,除非你重启web服务器。
点击后面的按钮来清除注册信息,web服务器无需重启。
<input type="button" value="清除表的注册信息" οnclick="window.location='${url}'+'?method=clearTableProperties';"/>
</p>
</body>
</html>
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值