<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>cykxwx</title>
    <description></description>
    <link>http://cykxwx.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>java常见错误以及可能原因集锦</title>
        <author>cykxwx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cykxwx.javaeye.com">cykxwx</a>&nbsp;
          链接：<a href="http://cykxwx.javaeye.com/blog/147299" style="color:red;">http://cykxwx.javaeye.com/blog/147299</a>&nbsp;
          发表时间: 2007年12月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          0、 需要标识符<br />a) 不在函数内<br /><br />1、 非法表达式开始<br />b) 可能:丢失括号 .<br /><br />2. no data found <br />a) 可能:setInt(1,100)中,没有100这个值<br /><br />3. 找不到符号<br />a) 可能:没导入包<br /><br />4. 指定了无效URL<br />a) 可能:数据库名或IP错误,即连接出错<br /><br />5. 类路径没有找到<br />a) 可能: ClassNotFoundException: oracle.jdbc.driver.OracleDriver<br />b) 原因: 一般是指包名写错,或者没有import包,或者没有在类路径中找到jar文件<br />c) 解决: 没有加载Oracle驱动jar,在.bash_profile中把ojdbc14.jar加进来<br /><br />6. 空指针异常<br />a) 可能: 数据源错误 比如数据库名或IP错误<br /><br />7. 不能执行查询<br />a) 可能: 数据库中表的问题,比如列名不存在<br /><br />8. invalid identity<br />a) 可能: 列名出错<br /><br />9. 若在数据库中创建了 两个sequence ,运行时出现异常可能是先后执行了多次select语句,导致与原有的序列号产生冲突<br /><br />10. 表名或列名不存在<br />a) 可能:表不存在或者没有插入数据到表中<br /><br />11. 不支持的类,类的版本错误<br />a) 可能:没有导入jdk5.0,或者编译器仍为1.4 <br /><br />12. MappingNotFoundException<br />a) Maybe: In the Eclipse Not refersh , or not exist in the dirctory<br /><br />13. HibernateException: /hibernate.cfg.xml not found<br />a) Maybe1: hibernate.cfg.xml not in the root directory<br />b) Maybe2: Could not parse configuration .<br />c) resolve: database not connect or use another database<br /><br />14. ConstraintViolationException<br />a) Maybe: used a not true database<br /><br />15. 驱动没有找到 或者 JDBC Driver not found<br />可能：连接数据库的驱动jar包不存在或者版本不一致，比如将旧的版本换成新的会造成该类错误<br />16. 空指针异常 ， java.lang.NullPointerException <br />a) 可能1：数据库连接出错，比如在hibernate.cfg.xml中的数据错误会导致异常。<br /><br />17. 数据插入异常 ，GenericJDBCException: could not insert <br />a) 可能1：没有建立表或者表中没有任何数据<br />b) 可能2：插入数据后没有执行提交语句：commit<br /><br />18. LazyInitializationException 或者延迟加载异常<br />a) 可能1：没有在查询语句中加fetch <br /><br />19. IdentifierGenerationException<br />a) 可能1：高位表没有初始化（比如hi_value中没有记录) <br /><br />20. could not initialize a collection: [hibernate.entity.Role.modules#32768] Syntax error: Encountered "-" at line 1, column 132.<br />a) 错误原因：&lt;set name="modules" table="module-role" lazy="false">红色字部分中“-”为非法字符，替换为module_role<br /><br />21. could not insert collection rows: [hibernate.entity.Module.roles#1]<br />在Module.hbm.xml文件的如下配置中加入inverse=”true”<br />&lt;set name="roles" table="module_role" inverse="true"><br /><br />22．在部署Struts时，出现如下错误信息：<br />HTTP Status 404 - Servlet action is not available<br /><br />type Status report<br />message Servlet action is not available<br />description The requested resource (Servlet action is not available) is not available.<br />问题原因：<br />1.、web.xml文件中未配置ActionServlet。<br />2、struts-config.xml文件未配置你要访问的Action。<br />3、你的jsp文件form标记中action属性的路径名称错误。<br />4、非以上三种情况。<br />针对以上4种情况相应的解决方案如下：<br />1、在web.xml文件中加上ActionServlet的配置信息<br />?????? /WEB-INF/struts-config.xml?<br />?2、在struts-config.xml文件检查你要访问的Action配置文件。<br />3、检查jsp文件form标记中action属性的路径名称是否与struts-config.xml文件中action标记的path属性的路径名称一致。<br />4、非以上情况的解决办法就是检查web容器的log日志，如果时tomcat则检查下logs目录下的localhost_log文件，看里边是否记录有错误信息，然后根据错误信息提示将其纠正。<br /><br />23．java.lang.NoClassDefFoundError: org/apache/commons/beanutils/Converter<br />缺少spring-framework-2.0.3\lib\jakarta-commons\commons-beanutils.jar<br /><br />24.<br />ava 代码Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/Type   <br />缺少spring-framework-2.0.3\lib\asm\asm-2.2.2.jar包,版本不同,该包的名字有相应的区别<br /><br />java 代码Caused by: java.lang.NoClassDefFoundError: org/dom4j/DocumentException   <br />缺少spring-framework-2.0.3\lib\dom4j\dom4j-1.6.1.jar包,版本不同,该包的名字有相应的区别<br />把这个包进去就可以了：\Spring206\lib\dom4j、dom4j-1.6.1.jar<br /><br />java 代码Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap   <br />缺少spring-framework-2.0.3\lib\jakarta-commons\commons-collections.jar包,版本不同,该包的名字有相应的区别<br /><br />java 代码Caused by: java.lang.NoClassDefFoundError: net/sf/cglib/proxy/CallbackFilter   <br />缺少spring-framework-2.0.3\lib\cglib\cglib-nodep-2.1_3.jar包,版本不同,该包的名字有相应的区别<br /><br />java 代码Caused by: java.lang.NoClassDefFoundError: org/objectweb/asm/CodeVisitor   <br />缺少hibernate-3.2\lib\asm.jar包,版本不同,该包的名字有相应的区别 <br /><br />java 代码<br />org.hibernate.exception.SQLGrammarException: could not load an entity: [www.proudsoul.xml.User#1] <br />JAVA工程与WEB工程包的区别:一个是asm.jar,一个是jta.jar<br /><br />java 代码Caused by: java.lang.NoClassDefFoundError: javax/transaction/TransactionManager   <br />缺少spring-framework-2.0.3\lib\j2ee\jta.jar包,版本不同,该包的名字有相应的区别此种错误请检查相应的***.hbm.xml配置文件的配置<br /><br />25,<br />Exception in thread "main" org.springframework.dao.InvalidDataAccessResourceUsageException: could not get next sequence value; nested exception is org.hibernate.exception.SQLGrammarException: could not get next sequence value<br />Caused by: org.hibernate.exception.SQLGrammarException: could not get next sequence value<br />原因：没有加Sequence或者数据库的方言写错了<br /><br />26,<br />我的配置文件<br />    &lt;id name="id" column="id"><br />            &lt;generator class="native" /><br />        &lt;/id><br />然后我运行保存一条数据进去<br />The database returned no natively generated identity value<br />就会报这个错误<br />因为你native是根据看底层数据库的能力选择identity, sequence 或者hilo中的一个<br />而我建表的时候id没有指定<br />alter table `student` change `id` `id` int auto_increment <br />我们把我们的表的结构小小的改动一下就没问题了<br /><br />27,<br />UpdateManager无法启动2007-08-09 15:21如果在应用程序安装过程中，暴力中断安装程序，会出现如下状况：1.apt-get remove 和dpkg --remove 无法删除软件 2.UpdateManager无法启动3.新立得软件包管理程序无法启动<br />以上可能是deb损坏之类造成的<br />sudo dpkg -r sqldveloper<br />正在读取软件包列表... 完成<br />正在分析软件包的依赖关系树... 完成<br />E: 软件包 sqldeveloper 需要重新安装，但是我无法找到相应的安装文件。<br />解决方法：1.从 /var/lib/dpkg/status 中把对应的段删掉<br />重要：修改之前请先备份<br />在status中找到你对应的包删除就OK了... <br /><br />28,<br />Exception in thread "main" java.lang.NoClassDefFoundError: antlr/ANTLRException<br />少了antlr-2.7.5H3.jar包,从D:\eclipse\eclipse\plugins\com.genuitec.org.hibernate.eclipse_4.1.1\myeclipse-data\3.0\lib<br /><br />29,<br />Caused by: <br />java.lang.NoClassDefFoundError: javax/transaction/Synchronization<br />缺少Spring206\lib\j2ee\jta.jar<br /><br />30,<br />Caused by: <br />java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy3] to required type [business.impl.PriceBiz] for property 'priceBiz': no matching editors or conversion strategy found<br />在java类中设置priceBiz时应该设置的是接口PriceBizIf，而非实现类<br /><br />31, 数组越界<br />可能1: 在命令行后面需要加入参数.<br />可能2:加入的参数错误<br />32, car is not mapped<br />可能1: 在cfg.xml中没有增加映射的hbm.xml文件在&lt;mapping.../>中  <br />  <br />33, 属性没有找到<br />可能1: hbm.xml文件中的 &lt;property name =""> 有问题, 也许是name的值与对应类中的成员名不一致 <br /><br />34,SQLException: 无当前连接          可能1:在比如创建帐户时没有对相应的方法添加到&lt;list>中去,比如这个没有加入:&lt;value>newAccount&lt;/value><br /><br /><pre name="code" class="java">&lt;bean id="transactionAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
   &lt;property name="advice">
    &lt;ref bean="advice"/>
   &lt;/property>
   &lt;property name="mappedNames">
    &lt;list>
     &lt;value>transfer&lt;/value>
    &lt;/list>
&lt;/bean></pre><br /><br />35,SQLException: Syntax error: Encountered "table" at line 1, column 8. <br />可能1;执行SQL时出现冲突,可能是SQL语句中使用了关键字作为变量来用,比如<br />   update order set balance=1000000;<br />   其中order被用作表名来使用,这是错误的,因为order是个关键字,用在order by中<br /><br />36, Servlet /Spring-WebMvc threw load() exception<br />org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".<br />jar包的冲突,spring-1.2.6.jar和spring.jar出现在一个war的目录中:JBoss/server/all/deploy/Spring-WebMvc.war/WEB-INF/lib    <br /><br />37, java.sql.SQLException: 当事务仍处于活动状态时，无法关闭连接。 <br /><br /><br />38 , <br />validateJarFile(/home/soft01/Tomcat/webapps/sms-token-struts/WEB-INF/lib/servlet-api.jar)<br />Servlet /sms-struts-tiles threw load() exception<br />java.lang.ClassNotFoundException: org.apache.struts.action.ActionServlet<br />原因:在WEB-INF/lib/ 目录下有servlet-api.jar与/Tomcat/common/lib目录下的servlet-api.jar冲突了,把WEB-INF/lib/下的servlet-api.jar删除就可以了<br /><br />39,java.lang.ClassNotFoundException: org.springframework.web.struts.ContextLoaderPlugIn<br />Marking servlet action as unavailable<br />10:30:47,088 ERROR [/NetCT_OSS]:3953 - Servlet /NetCT_OSS threw load() exception<br />javax.servlet.UnavailableException<br /><br />40,org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".<br />缺少MyEclipse/eclipse/plugins/com.genuitec.eclipse.springframework_5.5.0/data/2.0/dist/modules/spring-struts.jar<br /><br />41,Caused by: java.sql.BatchUpdateException: ORA-02291: integrity constraint (SD0702.FK82D343CF49A4B831) violated - parent key not found<br />Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update<br />有可能是ID生成策略的问题,我将它XML映射文件改成&lt;generator class="increment" />就好了<br /><br />42,<br />2007-08-19 16:21:43,290 ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/OSS].[action]] - Servlet.service() for servlet action threw exception<br />org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [entity.Module#2]<br />java.util.ConcurrentModificationException<br />原因:已经有对象拥有了所选择的module,用clear(),而不是remove();<br /><br />43,<br />ERROR [org.apache.catalina.session.ManagerBase] - IOException while loading persisted sessions: java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429<br />java.io.InvalidClassException: entity.Module; local class incompatible: stream classdesc serialVersionUID = -5988350031935445758, local class serialVersionUID = -297934247726484429<br />在Module中加上一个关键字:transient<br /><br />44,<br />Caused by: java.sql.BatchUpdateException: ORA-02292: integrity constraint (SD0702.SYS_C00132664) violated - child record found<br />原因:有其他的表引用了该表的外建,所以报这个异常,如果没有引用就不会出现<br /><br />45,<br />出现数组越界的时候,看看是不是循环时没有加=,比如:<br />for(int i = 1; i&lt;arr.length;i++)可以改成<br />for(int i = 1; i&lt;=arr.length;i++)<br /><br /><br />46.如果使用Ant和Junit是被报找不到test,检查一下是否误用了private<br />出错信息：<br />    &lt;failure message="No tests found in test.AllTest" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: No tests found in test.AllTest<br />该错误有个很特别的特点，当你不通过ant来运行测试，而是通过AllTest类来运行的话，可以正常运行。小心哦<br /><br />47.如果遇到报：表名无效，且jvm报严重错误，看看是不是用了数据库的保留关键字来做表名了，如User。<br /><br />48.使用ant时必须小心ant的classpath它用的不是IDE的classpath，小心!<br /><br />49.小心下边的异常，<br />exception setting property value with CGLIB (set hibernate.cglib.use_reflection_optimizer=false for more info) setter of xp.bean.Users.?" type="net.sf.hibernate.PropertyAccessException">java.lang.ClassCastException at xp.bean.UsersMetaClass1.setPropertyValues(&lt;generated>) at net.sf.hibernate.persister.AbstractEntityPersister.setPropertyValues<br />上次出现该错错误的原因是:<br />源文件里我的class类型为一个类Contact contact<br />而跑到mapping里却成了Set,呵呵厉害。<br /><br />50.突然间冒出大量的NullPointException<br />重新build一下。<br /><br />51.="Flush during cascade is dangerous - this might occur if an object was deleted and then re-saved by cascade"<br /><br />52.Tapestry的出错信息：<br />Class com.bookshop.Hello does not implement the IPage interface. <br />location: context:/WEB-INF/Home.page, line 6 <br />原因：与显示有关的哪个java类没有从IPage家族继承。<br /><br />53.使用ant时给出的路径好象不允许出现空格。<br /><br />54.由于使用ant时用junit做测试的话，classpath中出现j2ee.jar的话，问题多多。例如xml格式的log文件生成不了，莫名其妙的NullPointException等。所以我设置了两个包个包含j2ee.jar，为编译用；一个没有,为junit用<br /><br />55.进行单元测试时，在查询返回后应马上assertNotNull()，这样可以更快速的定位NullPointException<br /><br />56.要使用ResourceBundle的话，要千万小心。必须用日志记录下它的状态。还有该属性文件应该放在classes下面。<br /><br />57.当要显示任何页面时，都被提示无效，那么应该检查一下lib目录了，还有一些很奇怪的异常，例如你明明可以找到一个类但是服务器却提示ClassNotDefException，那么估计是缺少了该类所必须的包了。或者多了不兼容的包，如, xdoclet系列包不被struts的lib目录所兼容<br /><br />58.编写clone时从Java编程思想(2nd)上学到的(732)：<br />.引数传递过程中会自动产生别名(alias)。<br />.没有局域对象(local objects)，只有局域性的(local)references。<br />.reference受范围(scope)的限制，对象则否。<br />.对象的寿命从来不是Java的讨论议题(因为有垃圾回收机制)<br /><br />59.try catch finally的域居然是分离的。<br /><br />60.jsp乱码的其中一个原因：charset="gb2312" 等号"="的两边不允许有空格。<br /><br />61.我的基于Displaytag的简单报表解决方案。<br />http://displaytag.sourceforge.net/<br />下载displaytag.jar和displaytag.tld<br />displaytag.jar放在lib目录，而displaytag.tld放在WEB-INF目录，在web.xml中为displaytag.tld声明一下。<br />&lt;taglib><br />    &lt;taglib-uri>http://displaytag.org&lt;/taglib-uri><br />    &lt;taglib-location>/WEB-INF/displaytag.tld&lt;/taglib-location><br />&lt;/taglib><br />在jsp里使用前，加上<br />&lt;%@ taglib uri="http://displaytag.org" prefix="display" %><br />        <br />注意该软件有个bug，他要用的一个包common-lang.jar版本必须在2.0以上。<br />如果碰到下面异常，则应坚持一下是否该包的版本问题。<br />java.lang.NoSuchMethodError: org.apache.commons.lang.StringUtils.capitalize(Ljava/lang/String;)Ljava/lang/String;<br />然后就可放心使用了<br />&lt;display:column property = "xxx"/>其中xxx为对象中的带有getter的变量>。<br />定义表格的样子，用css定义。如<br />TABLE.its THEAD TR {<br />BACKGROUND-COLOR: #69c<br />}<br />TABLE.its TR.even {<br />BACKGROUND-COLOR: #def<br />}<br />在使用分页时，可能会出现这种情况，点击其他页时，弹出下载窗口，让你下载当前jsp页面，这是因为你在当前页面读取了数据的缘故。解决办法为在action里读取数据而不是在jsp里。可以参考<br />http://www.displaytag.org/example-paging.jsp?d-26189-p=2<br /><br />62.使用displaytag时，在一列中放入多个元素<br />必须在display:table中定义一个id<br />&lt;display:table name = "allBooks" class = "its" pagesize = "5" id = "item"><br />&lt;display:column title = "操作"><br />    &lt;a href = "/Bookshop/admin/bookManagement.do?action=view&id=&lt;%=((Book)item).getId()%>" target = "_blank" >查看&lt;/a><br />    &lt;a href = "/Bookshop/admin/bookManagement.do?action=edit&id=&lt;%=((Book)item).getId()%>">编辑&lt;/a><br />    &lt;a href = "/Bookshop/admin/bookManagement.do?action=delete&id=&lt;%=((Book)item).getId()%>">删除&lt;/a><br />&lt;/display:column><br />要在displaytag中使用链接，必须具备paramId，否则不显示为链接<br />&lt;display:column property = "product.name" href = "viewDetailV2.0.jsp" title = "书名" paramId="item" paramProperty="product.id"/><br />可以这样使用display<br />&lt;display:column property = "product.id" title = "ID"/><br />其中product为对象<br /><br />63.&lt;bean:write name = "xxxx" property = "xxx"/> 可以直接取到session.getAttribute()取到的东西。<br /><br />64.实验struts-upload例子时要注意的地方：<br />   1.If you would rather write this file to another file, please check here:<br />这一行要打钩<br />   2.If you checked the box to write to a file, please specify the file path here:<br />在这里要重命名如：c:\b.jpg<br />上传成功的话，会出现提示 The file has been written to "c:\b.jpg"<br /><br />65.Hibernate的like可以这么用：<br />      Query query = session.createQuery("from src.persistent.Book as book where upper(book.name) like :name ");<br />      query.setString("name", "%");<br />      result = query.list();<br /><br />66.Hibernate出现 duplicate import : className<br />异常也可能是因为忘了为持久类在configuration中addClass了<br />      <br />67.&lt;logic:iterate id = "author" name = "authors"><br />name所引用的是session里的attribute。<br /><br />68.如果发现要出现询问下载的情况，有可能是因为要跳转的页面出现了问题。试试在要跳转到的页删掉<br />&lt;%@ page contentType="text/html; charset=gb2312"%><br /><br />69.如果JSP页面跳转时出现下边的错误信息：<br />The request sent by the client was syntactically incorrect (Invalid path /web/shoppingCart was requested).<br />原因是struts-config的action = "x" 写成了 action = "x.do"<br /><br />70.在struts中，strut-config.xml中，forward时使用redirect = "true"可以将.do重定向为.jsp<br /><br />71.以后在判断相等性之前先用logger把两个值显示出来。<br /><br />72.从session里getAttribute后，修改并不需要重新setAttribute一次。<br /><br />73.在hibernate中使用subclass是一棵继承树共用一个表，仅生成个mapping。<br />每个类中必须有discrimator-value。在最上层的类中必须声明：<br />@hibernate.discriminator column = "class"。<br />不可以将子类添加到configuration里去。(即不可addClass(子类))<br />使用Xdoclet的建立subclass的例子(该类是父类)<br />/**<br />* @hibernate.class discriminator-value = "customer"<br />* @hibernate.discriminator column = "class"<br />*/<br /><br />而使用joined-subclass则是一类一表,也不许将子类添加进configuration里去。<br />/**<br />* @hibernate.joined-subclass<br />* @hibernate.joined-subclass-key<br />* column="customer_id"<br />*/<br />如果发现生成的mapping文件中joined-subclass的key column为空，那么可能是@hibernate.joined-subclass-key这句没有写对。<br />用joined-subclass生成的表，仔细看。Member extends Customer<br />create table Customer (<br />   id VARCHAR2(255) not null,<br />   name VARCHAR2(255),<br />   description VARCHAR2(255),<br />   primary key (id)<br />)<br />create table Member (<br />   customer_id VARCHAR2(255) not null,<br />   password VARCHAR2(255),<br />   primary key (customer_id)<br />)<br /><br />74.在junit中尽量使用assertEquals代替assertTrue;<br /><br />75.Hibernate<br />如果Child extends Parent<br />那么from Parent as parent 也将会将Child选出来，而from Child as child 则不会选出Parent<br /><br />76.Hibernate<br />使用hibernate的one-to-one时，应该两方向都set,否则会报save NullPointException<br />parent.setChild(child);<br />child.setParent(parent);<br /><br />77.Hibernate<br />遇到下边的异常，估计是与因为外键出现了问题：<br /><br />java.lang.NullPointerException<br />at net.sf.hibernate.persister.AbstractEntityPersister.getPropertyValue(AbstractEntityPersister.java:675)<br />at net.sf.hibernate.id.ForeignGenerator.generate(ForeignGenerator.java:33)<br />如:<br />* @hibernate.id generator-class = "foreign"<br />* @hibernate.generator-param name = "property" value = "customer"<br />* @hibernate.one-to-one name = "custmoer" class = "src.persistent.Customer"<br />value的值和one-to-one 中name的值不符，则会出现上边的异常。如果不显示指定name则默认取成员变量名<br />如<br />Customer a<br />则name = "a" 需要小心的是不是类名。所以，以后最好显示指定名字为好。<br /><br />78.出现异常：<br />Exceptionobject references an unsaved transient instance - save the transient instance before flushing: src.persistent.Product<br />原因没有为某对象进行set设置， 如上边的这个就是某对象没有调用setProduct<br /><br />79.<br />"xxx action = "/a" 不用.do和根目录名<br />&lt;a href = "b.do" 需要.do和根目录名<br /><br />80.<br />Caused by: java.sql.SQLException: ORA-02291: 违反完整约束条件 (BOOKSHOP.FK4AAEE<br />47687CCA6B) - 未找到父项关键字<br />如果你觉得该做的e是出现这个问题，那么检查一下，是否将类的继承关系在hibernate的mapping中反映了出来。joined-subclass或subclass<br />例如a extends b<br />如果持久类c 需要Set的是持久类a，那么你把b传入，而b又没有在mapping中将父子关系反映出来的话，就会出现该异常<br /><br />81.使用DynaActionForm需要注意的问题<br />在struts-config声明<br />&lt;form-bean name="memberloginForm" dynamic ="true" type="org.apache.struts.action.DynaActionForm"><br />&lt;form-property name = "name" type = "java.lang.String"/><br />&lt;form-property name = "password" type = "java.lang.String"/><br />&lt;/form-bean><br />在Action里将form强制转化成DynaActionForm，然后get("属性名")就可以了<br /><br />82.struts的validate最简单实现<br />1.首先准备好错误提示信息。<br />xxx.properties 里<br />errors.required={0} is required.(默认已有)<br />2.Form必须从ValidatorForm继承<br />3.不可以重载ValidatorForm的validate函数<br />4.在validate.xml中为你想验证的表单进行验证设计。例如<br />&lt;form name="logonForm"><br />    &lt;field property="userName" depends="required"><br />&lt;arg0 key="prompt.userName"/><br />(该参数将在显示错误信息是从xxx.properties读取prompt.userName,填入{}方括号里，取代0。如果是arg1将将填入{1}位置，以此类推。<br />    &lt;/field><br />&lt;/form><br />不需要在action里做任何处理。只管forward就行了。作为forward的目标页，不需要任何有关用于处理出错信息的处理。<br /><br />83.服务器报<br />The requested resource (/xxxx/xxx.htm) is not available.的很奇怪的一个的可能原因<br />在web.xml中定义的tld，没有找到<br />或者是lib目录下的包太多出现了问题。<br />如<br />&lt;taglib><br />    &lt;taglib-uri>/spring&lt;/taglib-uri><br />    &lt;taglib-location>/WEB-INF/spring.tld&lt;/taglib-location><br />&lt;/taglib><br />如WEB-INF目录下不存在spring.tld的话，就会报上边的错误<br /><br />84.<br />spring的xxx-servlet.xml的使用SimpleFormController系列的类问题：<br />&lt;bean id = "priceIncreaseForm" class="PriceIncreaseFormController"><br />    &lt;property name="sessionForm">&lt;value>true&lt;/value>&lt;/property><br />    &lt;property name="beanName">&lt;value>priceIncrease&lt;/value>&lt;/property><br />    &lt;property name="commandClass">&lt;value>PriceIncrease&lt;/value>&lt;/property><br />    &lt;property name="formView">&lt;value>priceIncrease&lt;/value>&lt;/property> <br />    &lt;property name="successView">&lt;value>hello&lt;/value>&lt;/property><br />    &lt;property name="productManager"><br />      &lt;ref bean="prodMan"/><br />    &lt;/property><br />&lt;/bean><br />这里要注意几个问题：<br />(1)上边的PriceIncrease是了类名，必须在classes里存在该类，否则报：<br />PropertyVetoExceptionsException: 1 errors:-- ErrorCodedPropertyVetoException: message=[Failed to convert property value of type [java.lang.String] to required type [java.lang.Class] for property named 'commandClass'; nested exception is: <br />java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease]; errorCode=[typeMismatch]<br />java.lang.IllegalArgumentException: Invalid class name [PriceIncrease]: PriceIncrease<br />(2)&lt;property name="formView">&lt;value>priceIncrease&lt;/value>&lt;/property><br />这一行必不可少，priceIncrease是页面的名字，他将会是prefix + priceIncrease + suffix<br />如果缺少该行，则报：<br />javax.servlet.ServletException: Error in ModelAndView object or View resolution encountered by servlet with name 'pocketSpring': View to render cannot be null with ModelAndView [ModelAndView: materialized View is [null]; Model=[{priceIncrease=PriceIncrease@148e798, org.springframework.validation.BindException.priceIncrease=org.springframework.validation.BindException: BindException: 0 errors}]]<br /><br />使用Errors的rejectValue相关问题：<br />rejectValue(java.lang.String field, java.lang.String errorCode, java.lang.Object[] errorArgs, java.lang.String defaultMessage) <br />Reject the given field of the current object, using the given error description.<br />当前对象指的是xxx-servlet.xml中与validator类有联系的哪个对象。<br />          <br />第一个是：当前对象的属性名，必须存在<br />第二个是：将要从属性文件中读取的消息<br />第三个是：传递给所读取的消息的参数，如：<br />error.too-low=You have to specify a percentage higher than {0}!<br />第四个是：当从属性文件中读取消息不成功时，所reject的值<br /><br />以后从request中读取parameter可以借用spring的RequestUtils包里的<br />getStringParameter<br />public static java.lang.String getStringParameter(javax.servlet.http.HttpServletRequest request,<br />                                           &bsp;      java.lang.String name,<br />                                                  java.lang.String defaultVal)<br />Get a string parameter, with a fallback value. Never throws an exception. Can pass a distinguished value to default to enable checks of whether it was supplied. <br />不会抛异常<br />Hibernate的问题：2.1rc的问题<br />INFO: cache provider: net.sf.ehcache.hibernate.Provider <br />net.sf.hibernate.HibernateException: could not instantiate CacheProvider: <br />解决办法，2.1rc比以前的版本多需要一个包<br />ehcache.jar<br /><br />85.static的问题<br />static函数只可以访问static成员变量。<br />而static变量可以被任何成员函数访问。<br /><br />86.<br />java.lang.NoClassDefFoundError: javax/transaction/Synchronization]; <br />需要添加JTA.jar<br /><br /><br />以后再遇到别的错误继续添加！
          <br/><br/>
          <span style="color:red;">
            <a href="http://cykxwx.javaeye.com/blog/147299#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Dec 2007 16:19:27 +0800</pubDate>
        <link>http://cykxwx.javaeye.com/blog/147299</link>
        <guid>http://cykxwx.javaeye.com/blog/147299</guid>
      </item>
      <item>
        <title>可输入的下拉框，并能根据数据输入内容过滤</title>
        <author>cykxwx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cykxwx.javaeye.com">cykxwx</a>&nbsp;
          链接：<a href="http://cykxwx.javaeye.com/blog/146334" style="color:red;">http://cykxwx.javaeye.com/blog/146334</a>&nbsp;
          发表时间: 2007年12月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          因为下拉框数据有好几百条，所以能根据用户输入的值进行过滤   <br /><br />就象IE浏览器输入地址那个功能差不多<br />    <br />请问大家有什么方法？<br /><br />如果有个例子最好了啊！！<img src="/images/smiles/icon_smile.gif"/>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cykxwx.javaeye.com/blog/146334#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 06 Dec 2007 09:56:53 +0800</pubDate>
        <link>http://cykxwx.javaeye.com/blog/146334</link>
        <guid>http://cykxwx.javaeye.com/blog/146334</guid>
      </item>
      <item>
        <title>ibatis初步介绍</title>
        <author>cykxwx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cykxwx.javaeye.com">cykxwx</a>&nbsp;
          链接：<a href="http://cykxwx.javaeye.com/blog/142212" style="color:red;">http://cykxwx.javaeye.com/blog/142212</a>&nbsp;
          发表时间: 2007年11月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在开发过程中最能帮助你的是什么？是框架，一个优秀的框架可以极大的提高你的效率。<br /><br />struts给了我们什么？MVC的实现，国际化、灵活。还有很多。不过，在一个通常的WEB应该中<br /><br />，是不能缺少数据库的，而struts在这方面并没有给我们提供什么有效的帮助。通常情况下我<br /><br />们做这个的时候有几个选择。<br />最直接的当然是JDBC啊，自己写connect、statment和resultset等等的代码，结果是累死自己<br /><br />。<br />然后一种方法是EJB，EJB确实是一个好东西，可惜在很多场合用不上，起码它很烦，速度很慢<br />还有一种选择就是JDO及类似的东西。最著名是free的应该是castor，hibernate等。<br /><br />现在我们又多了一种选择，就是ibatis Db Layer，它的主页是http://www.ibatis.com，为什<br /><br />么说它好，让我们来看看作者自己的说明吧，使用ibatis的理由<br /><br /><div class="quote_title">引用</div><div class="quote_div">10、知道怎样操作10种以上的数据库<br />9 、可配置的caching(包括从属)<br />8、支持DataSource、local transaction managemen和global transaction <br />7、简单的XML配置文档<br />6、支持Map, Collection, List和简单类型包装(如Integer, String)<br />5、支持JavaBeans类(get/set 方法)<br />4、支持复杂的对象映射(如populating lists, complex object models)<br />3、对象模型从不完美(不需要修改)<br />2、数据模型从不完美(不需要修改)<br />1、你已经知道SQL，为什么还要学习其他东西</div><br /><br />另外一点它是100% Open Source Freeware<br /><br />下面我们就来看一看，做一个简单的ibatis需要哪一些工作。然后一步一步深入探索它的强大<br /><br />功能。在实践中来看它的好处在哪里。<br /><br />在ibatis的网站上有一个它自己的petstore，在我个人看来是最简洁的petstore了，跟<br /><br />struts1.0结合。应该说是一个不错的教程。希望大家能够好好研究。当然，作为入门。我们<br /><br />先来做一个简单的程序。所采用的库嘛，就仍然是用petstore的了。数据库也是选择Oracle(<br /><br />为什么选择Oracle，很多朋友不理解，怎么不用mysql之类的呢，一个主要的原因是个人爱好<br /><br />，Oracle毕竟是商业数据库，有它的强大之处，另外在linux下它也是免费的，:)。废话少说<br /><br />，先用jpetstore3.1提供的ddl建立一个库吧。<br /><br />然后在eclipse里建立一个ibatisDemo的工程。加入ibatis提供的库,建立相就的目录。看一下<br /><br />一个最简单的程序需要哪一些文件。我们选择一个简单表，即Category这个表的操作来演示功<br /><br />能<br /><br />文件路径 功能说明 备注 config\properties\petstore.properties 可变参数配置文件，所<br /><br />有根据环境不同的参数都放在这里 config\properties\simple\dao.xml dao配置文件，主要<br /><br />存放dao对象和数据池设置 config\properties\simple\sql-map-config-storedb.xml 真正的<br /><br />核心配置文件 config\sqlmap\Category.xml 存放Category的数据操作的SQL <br /><br />com.ewuxi.champion.exception.DaoException.java 自定义的Exception类，不用说了吧 <br /><br />com.ewuxi.champion.Service.java 一个服务类，用于初始化 <br /><br />com.ewuxi.champion.persistence.dao.DaoCommon Dao层的统一操作类，提供一些公共函数 <br /><br />com.ewuxi.champion.persistence.dao.CategoryDb Category的操作类 <br /><br />com.ewuxi.champion.persistence.vo.Category valueObject 值对象 <br /><br />com.ewuxi.champion.persistence.dao.CategoryDbTest 单元测试类 <br />下面一个一个文件详细说明<br /><br /><pre name="code" class="java">petstore.properties

##################################################################
SIMPLE CONFIGURATION SECTION
################################################################## 
## SimpleDataSource properties
## Use only if useSimpleConfiguration=true

SimpleDriver=oracle.jdbc.OracleDriver
SimpleUrl=jdbc:oracle:thin:@10.0.0.5:1521:champion
SimpleUsername=pet
SimplePassword=pet</pre><br /><br />这个不用解释，就是数据库的连接串，如果你在自己的机器上运行，当然这些都是需要改的。<br /><br /><pre name="code" class="java">dao.xml

&lt;?xml version="1.0" encoding="UTF-8"?> 
&lt;!DOCTYPE dao-config
PUBLIC "-//iBATIS.com//DTD DAO Configuration 1.0//EN"
"http://www.ibatis.com/dtd/dao.dtd">

&lt;dao-config>

&lt;context name="StoreDaoManager" default="true">
&lt;!-- Configure the transaction pool. -->
&lt;transaction-pool 

implementation="com.ibatis.db.dao.jdbc.SqlMapDaoTransactionPool">
&lt;property name="sql-map-config-file" value="properties/simple/sql-map-config-

storedb.xml"/>
&lt;/transaction-pool>

&lt;/context>

&lt;/dao-config></pre><br />上面这一段也是很简单的，连一个dao也没有配置，也就是说，用的是默认的Dao。其中<br /><br />&lt;context name="StoreDaoManager" default="true">表示它是默认的数据库配置(它可以根据<br /><br />名字不同同时连接几个数据库的)。<br /><br />sql-map-config-storedb.xml<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE sql-map-config
PUBLIC "-//iBATIS.com//DTD SQL Map Config 1.0//EN"
"http://www.ibatis.com/dtd/sql-map-config.dtd"> 
&lt;sql-map-config>

&lt;properties resource="properties/petstore.properties" />

&lt;settings
maxExecute="0"
maxExecutePerConnection="0"
maxTransactions="0"
cacheModelsEnabled="true"
statementCacheSize="175"
useBeansMetaClasses="false"
useGlobalTransactions="false" />

&lt;datasource name="jpestoreSimple"
factory-class="com.ibatis.db.sqlmap.datasource.DbcpDataSourceFactory"
default="true" >
&lt;property name="JDBC.Driver" value=" ${SimpleDriver}"/>
&lt;property name="JDBC.ConnectionURL" value=" ${SimpleUrl}"/>
&lt;property name="JDBC.Username" value=" ${SimpleUsername}"/>
&lt;property name="JDBC.Password" value=" ${SimplePassword}"/>
&lt;property name="Pool.MaximumActiveConnections" value="15"/>
&lt;property name="Pool.MaximumIdleConnections" value="15"/>
&lt;property name="Pool.MaximumWait" value="1000"/>
&lt;/datasource>

&lt;sql-map resource="sqlmap/Category.xml" />

&lt;/sql-map-config></pre><br /><br />这里真正实现了数据库连接，我们使用的是dbcp的连接池。JDBC的配置大家都很熟了。 <br /><br />${SimpleDriver}就是指的前面petstore.properties中的SimpleDriver的内容。<br /><br />而&lt;sql-map resource="sqlmap/Category.xml" />则表示包含Category.xml这个文件。<br /><br />Category.xml<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;!DOCTYPE sql-map
PUBLIC "-//iBATIS.com//DTD SQL Map 1.0//EN"
"http://www.ibatis.com/dtd/sql-map.dtd">

&lt;sql-map name="Category">


&lt;result-map name="result" class="com.ewuxi.champion.persistence.vo.Category">
&lt;property name="categoryId" column="CATID" columnIndex="1" />
&lt;property name="name" column="NAME" columnIndex="2"/>
&lt;property name="description" column="DESCN" columnIndex="3"/>
&lt;/result-map>

&lt;mapped-statement name="findByPrimaryKeyCategoryDao" result-map="result">
select CATID, NAME, DESCN from CATEGORY where CATID = #categoryId#
&lt;/mapped-statement>

&lt;dynamic-mapped-statement name="findCategoryDao" result-map="result">
select CATID, NAME, DESCN from CATEGORY
&lt;dynamic prepend="where">
&lt;isNotNull prepend="and" property="categoryId" >
CATID = #categoryId#
&lt;/isNotNull>
&lt;isNotNull prepend="and" property="name" >
NAME = #name#
&lt;/isNotNull>
&lt;isNotNull prepend="and" property="description">
DESCN = #description#
&lt;/isNotNull> 
&lt;/dynamic>
&lt;/dynamic-mapped-statement>


&lt;mapped-statement name="findCategoryDaoCount" result-class="java.lang.Integer">
select count(1) as value from CATEGORY
&lt;/mapped-statement>


&lt;!-- =============================================
mapped-statement
============================================= -->

&lt;dynamic-mapped-statement name="updateByPrimaryKeyCategoryDao">
update CATEGORY 
&lt;dynamic prepend="set">
&lt;isNotNull prepend="," property="name" >
NAME = #name#
&lt;/isNotNull>
&lt;isNotNull prepend="," property="description">
DESCN = #description#
&lt;/isNotNull> 
&lt;/dynamic>
where
CATID =#categoryId#
&lt;/dynamic-mapped-statement>

&lt;!-- =============================================
mapped-statement
============================================= -->

&lt;mapped-statement name="deleteByPrimaryKeyCategoryDao">
delete from CATEGORY 
where CATID =#categoryId#
&lt;/mapped-statement>


&lt;!-- =============================================
OPTIONAL EXPLICIT PARAMETER MAP
============================================= -->

&lt;parameter-map name="insert-params">
&lt;property name="categoryId"/>
&lt;property name="name" type="VARCHAR"/> 
&lt;property name="description" type="VARCHAR"/>
&lt;/parameter-map>

&lt;!-- =============================================
MAPPED STATEMENTS - w/Explicit Parameter Map
============================================= -->

&lt;mapped-statement name="insertCategoryDao" parameter-map="insert-params" >
insert into CATEGORY (
CATID,NAME,DESCN)
values (
?,?,?
)
&lt;/mapped-statement> 
&lt;/sql-map></pre><br />上述文件就是真正的SQL所存在的地方。<br /><br /><pre name="code" class="java">&lt;result-map name="result" class="com.ewuxi.champion.persistence.vo.Category">
&lt;property name="categoryId" column="CATID" columnIndex="1" />
&lt;property name="name" column="NAME" columnIndex="2"/>
&lt;property name="description" column="DESCN" columnIndex="3"/>
&lt;/result-map></pre>这一段的内容表示返回的对象是com.ewuxi.champion.persistence.vo.Category，也就是我们<br /><br />值对象。当执行查询的时候，dblay会封装出一个Category对象或者一个Category的list集合<br /><br />。其中数据列CATID就对象javabean的categoryId值。name是自定义的<br /><br /><div class="quote_title">引用</div><div class="quote_div">&lt;mapped-statement name="findByPrimaryKeyCategoryDao" result-map="result"><br />select CATID, NAME, DESCN from CATEGORY where CATID = #categoryId#<br />&lt;/mapped-statement></div><br />此处result-map="result"表示返回结果以后，就会参照前面的result来返回对象。select <br /><br />CATID, NAME, DESCN from CATEGORY where CATID = #categoryId#标准的SQL，只不过这一点<br /><br />CATID = #categoryId#有些不同，#categoryId#表示传递一个Category对象时，Dblay会自动<br /><br />取得categoryId的值来执行SQL<br /><br />再来看一个<br /><br /><pre name="code" class="java">&lt;dynamic-mapped-statement name="updateByPrimaryKeyCategoryDao">
update CATEGORY 
&lt;dynamic prepend="set">
&lt;isNotNull prepend="," property="name" >
NAME = #name#
&lt;/isNotNull>
&lt;isNotNull prepend="," property="description">
DESCN = #description#
&lt;/isNotNull> 
&lt;/dynamic>
where
CATID =#categoryId#
&lt;/dynamic-mapped-statement></pre><br />这个地方就体现了dblayer的强大之处，动态SQL。平常我们经常碰到的情况是根据不同的情况<br /><br />，执行的SQL有一点点不一样。写在程序里，要写不少的if then之类的，在这里，dbLayer给<br /><br />你一下解决了。比如在这里，我们三个值都是String对象，所以通过isNotNull就可以实现几<br /><br />种不同的update了，比如，如果我只想修改DESCN这个字段，只要传过去的Category对象只有<br /><br />categoryId和description有值，就会生成update CATEGORY set DESCN = #description# <br /><br />where CATID =#categoryId#。同样如果传递的对象只有categoryId和name有值，就会生成<br /><br />update CATEGORY set NAME = #name# where CATID =#categoryId#。是否很强大？:)<br /><br />前面这两种，参数的传递方式是内置参数，也就是CATID =#categoryId#这种，大家可能不太<br /><br />习惯，那就看一看标准的写法吧。<br /><br /><pre name="code" class="java">&lt;!-- =============================================
OPTIONAL EXPLICIT PARAMETER MAP
============================================= -->

&lt;parameter-map name="insert-params">
&lt;property name="categoryId"/>
&lt;property name="name" type="VARCHAR"/> 
&lt;property name="description" type="VARCHAR"/>
&lt;/parameter-map>

&lt;!-- =============================================
MAPPED STATEMENTS - w/Explicit Parameter Map
============================================= -->

&lt;mapped-statement name="insertCategoryDao" parameter-map="insert-params" >
insert into CATEGORY (
CATID,NAME,DESCN)
values (
?,?,?
)
&lt;/mapped-statement> 
&lt;/sql-map></pre><br />这里面的insert语句想来大家都很熟了吧？这个时候怎么取得参数呢？关键在于这里<br /><br />parameter-map="insert-params"，表示会读取&lt;parameter-map name="insert-params">的设<br /><br />置，而这个设置也不用多解释了吧，就是按顺序，三个？分别对应三个值。还能指明他们的数<br /><br />据类型。<br /><br />下面来看看Service.java<br /><br /><br /><pre name="code" class="java">package com.ewuxi.champion; 
import java.io.Reader;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.ibatis.common.resources.Resources;
import com.ibatis.db.dao.DaoManager;

/**
* @author champion
*
* To change the template for this generated type comment go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
public class Service {
static Log log = LogFactory.getLog(Service.class);
public static void initSet() {

try {

String resource = null;

resource = "properties/simple/dao.xml";
log.info("Using SIMPLE configuration. (" resource ")");

Reader reader = Resources.getResourceAsReader(resource);
DaoManager.configure(reader);

} catch (Exception e) {
throw new RuntimeException(
"Could not initialize BaseLogic. Cause: " e);
}
}

}</pre><br /><br />一个静态方法，从resource文件中读出配置，最后用DaoManager.configure(reader);完成配<br /><br />置。<br /><br />DaoCommon<br /><br /><pre name="code" class="java">public static Dao getDefautDao(){
return DaoManager.getInstance().getDao("");
}
public static SqlMap getSqlMap(Dao c) throws DaoException {
try {
DaoManager daoManager = DaoManager.getInstance(c); 
if (daoManager == null) {
daoManager = DaoManager.getInstance();
}

SqlMapDaoTransaction trans = (SqlMapDaoTransaction) 

daoManager.getLocalTransaction();
SqlMap sqlMap = trans.getSqlMap();

return sqlMap;
} catch (Exception e) {
throw new DaoException(e);
}
}</pre><br /><br /><pre name="code" class="java">public static SqlMap getSqlMap(String c) throws DaoException {
try {
DaoManager daoManager = DaoManager.getInstance(c);
SqlMapDaoTransaction trans = (SqlMapDaoTransaction) 

daoManager.getLocalTransaction();
SqlMap sqlMap = trans.getSqlMap();

return sqlMap;
} catch (Exception e) {
throw new DaoException(e);
}
}</pre><br /><br />三个主要的函数，第一个是得到默认的DAO对象，后两个是根据一个dao对象或者一个参数(也<br /><br />就是前面&lt;context name="StoreDaoManager" >中是name值)。取得SqlMap对象，这个对象是主<br /><br />要的数据操作接口。<br /><br /><pre name="code" class="java">/**
* @throws Exception
* 开始事务，所在session层必须使用它
*/
public static void startTransaction() throws Exception {
if (!DaoCommon.inTransaction()) {
DaoManager.getInstance().startTransaction();
}
} 
public static boolean inTransaction() throws Exception {
try {
DaoManager.getInstance().getLocalTransaction();

return true;
} catch (Exception e) {
return false;
}
}

/**
* @throws Exception
* 放弃事务
*/
public static void rollBack() {

try {
DaoManager.getInstance().rollbackTransaction();
} catch (Exception e) {
LogFactory.getLog(DaoCommon.class).error(e, e);
}
}

/**
* @throws Exception
* 提交事务
*/
public static void commit() throws Exception {
DaoManager.getInstance().commitTransaction();
}</pre><br />下面的一些函数是对事务的一些封装。想必也很容易理解。<br /><br />然后让我们来看CategoryDb的内容<br /><br /><pre name="code" class="java">/*
* Created on 2007-10-11
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package com.ewuxi.champion.persistence.dao; 
import com.ewuxi.champion.exception.DaoException;
import com.ewuxi.champion.persistence.vo.Category;
import com.ibatis.db.sqlmap.SqlMap;

/**
* @author champion
*
*category数据库操作对象
*/

public class CategoryDb {

/**
* @param vo
* @throws DaoException
* 插入一条记录
*/
public void insert(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
sqlMap.executeUpdate("insertCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}
/**
* @param vo
* @throws DaoException
* 删除一条记录
*/
public void delete(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
sqlMap.executeUpdate("deleteByPrimaryKeyCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}
/**
* @param vo
* @throws DaoException
* 修改一条记录
*/
public void update(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
sqlMap.executeUpdate("updateByPrimaryKeyCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}
/**
* @param vo
* @return
* @throws DaoException
* 查找一条记录
*/
public Category findByPk(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
return (Category) sqlMap.executeQueryForObject("findByPrimaryKeyCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}

}</pre><br /><br /><br /><br /><br />每一个函数都很类似的。关键就在这一句(Category) sqlMap.executeQueryForList<br /><br />("findByPrimaryKeyCategoryDao",vo);。看到"findByPrimaryKeyCategoryDao"，这个对应于<br /><br />前面Category.xml中的名字。而vo则是一个Category对象。<br /><br />最后是CategoryDbTest类，这个是我们的单元测试程序<br /><br /><pre name="code" class="java">/*
* Created on 2007-10-11
*
* To change the template for this generated file go to
* Window - Preferences - Java - Code Generation - Code and Comments
*/
package com.ewuxi.champion.persistence.dao;

import com.ewuxi.champion.exception.DaoException;
import com.ewuxi.champion.persistence.vo.Category;
import com.ibatis.db.sqlmap.SqlMap;

/**
* @author champion
*
*category数据库操作对象
*/

public class CategoryDb {

/**
* @param vo
* @throws DaoException
* 插入一条记录
*/
public void insert(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
sqlMap.executeUpdate("insertCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}
/**
* @param vo
* @throws DaoException
* 删除一条记录
*/
public void delete(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
sqlMap.executeUpdate("deleteByPrimaryKeyCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}
/**
* @param vo
* @throws DaoException
* 修改一条记录
*/
public void update(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
sqlMap.executeUpdate("updateByPrimaryKeyCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}
/**
* @param vo
* @return
* @throws DaoException
* 查找一条记录
*/
public Category findByPk(Category vo) throws DaoException{
try {
SqlMap sqlMap=DaoCommon.getSqlMap(DaoCommon.getDefautDao());
return (Category) sqlMap.executeQueryForObject("findByPrimaryKeyCategoryDao",vo);
} catch (Exception e) {
throw new DaoException(e);
}
}

}[url]</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://cykxwx.javaeye.com/blog/142212#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 Nov 2007 09:30:13 +0800</pubDate>
        <link>http://cykxwx.javaeye.com/blog/142212</link>
        <guid>http://cykxwx.javaeye.com/blog/142212</guid>
      </item>
  </channel>
</rss>