使用appfuse的基本开发步骤

在appfuse手册中的开发步骤是先建立数据库表,然后通过自动化的工具产生pojo以及其他的对象。但是对于复杂的pojo,用数据库表现出来就显得力不从心。因此,适当的方法应当是先去写pojo,然后自动产生其他的代码。这里是我总结的开发步骤。

1。首先编写pojo,继承BaseObject,通过自动化工具产生set/get方法,以及hashCode(), toString(), equals()方法。我用了网上的一段开源代码放到我的工程里面,在eclipse里面直接调用:

java 代码
  1. package org.appfuse.tools;   
  2.   
  3. import java.lang.reflect.Field;   
  4. import java.lang.reflect.Modifier;   
  5. import java.util.ArrayList;   
  6. import java.util.List;   
  7.   
  8. /**  
  9.  * A utility class that generates source code for good   
  10.  * boolean equals()int hashCode(), and   
  11.  * String toString() implementations.  
  12.  *   
  13.  * 

     

     
  14.  * The algorithms used here are based largely on those presented in   
  15.  * "Effective Java" by   
  16.  * Josh Bloch, with some variations based on conversations with colleagues.  
  17.  * 

     

     
  18.  *   
  19.  * @author Erick G. Reid  
  20.  */  
  21. public class SourcecodeGenerator {   
  22.            
  23.   /**  
  24.    * Returns a String representing usable   
  25.    * boolean equals(Object) sourcecode for the given   
  26.    * Class 
  27.    *  
  28.    * @param source the Class to inspect.  
  29.    * @return a String representing usable   
  30.    *        boolean equals(Object) sourcecode for the given   
  31.    *        Class.  
  32.    */  
  33.   public static String getEqualsSourceCode(Class source) {   
  34.     Field[] fields = _getEligibleFields(source);   
  35.     StringBuffer sb = new StringBuffer();   
  36.     String className = _getClassName(source);   
  37.     sb.append("/**\n");   
  38.     sb.append(" * Compares this object to the specified object.  The result is\n");   
  39.     sb.append(" * true if and only if the argument is not null\n");   
  40.     sb.append(" * and is an instance of " which represents a\n" + className + ");   
  41.     sb.append(" * value equivalent to this ".\n" + className + ");   
  42.     sb.append(" *\n");   
  43.     sb.append(" * @param object the object to compare with.\n");   
  44.     sb.append(" * @return true if the objects are the same,\n)");   
  45.     sb.append(" *     returns false otherwise.\n");   
  46.     sb.append(" */\n");   
  47.     sb.append("public boolean equals(Object object) {\n");   
  48.     sb.append("  if (object != this) {\n");   
  49.     if (fields.length == 0) {   
  50.       sb.append(   
  51.           "    return object != null && getClass().equals(object.getClass());\n");   
  52.     }   
  53.     else {   
  54.       sb.append("    if (object != null && getClass().equals(object.getClass())) {\n");   
  55.       sb.append("      final " + className + " other = (" + className + ") object;\n");   
  56.       for (int i = 0; i < fields.length; i++) {   
  57.         if (i == 0) sb.append("      return ");    
  58.         else sb.append("          ");    
  59.         if (fields[i].getType().isPrimitive()) {   
  60.           sb.append("(" + fields[i].getName() + " == other." + fields[i].getName() + ")");   
  61.         }   
  62.         else {   
  63.           sb.append("(" + fields[i].getName() + " == null ? other." +    
  64.               fields[i].getName() + " == null : " + fields[i].getName() +    
  65.               ".equals(other." + fields[i].getName() + "))");   
  66.         }   
  67.         if (i == fields.length - 1) sb.append(";\n");    
  68.         else sb.append(" &&\n");    
  69.       }   
  70.       sb.append("    }\n");   
  71.       sb.append("    return false;\n");   
  72.     }   
  73.     sb.append("  }\n");   
  74.     sb.append("  return true;\n");   
  75.     sb.append("}\n");   
  76.     return sb.toString();   
  77.   }   
  78.        
  79. /**  
  80.  * Returns a String representing usable hashCode()   
  81.  * sourcecode for the given Class 
  82.  *  
  83.  * @param source the Class to inspect.  
  84.  * @return a String representing usable hashCode()   
  85.  *      sourcecode for the given Class.  
  86.  */  
  87. public static String getHashCodeSourceCode(Class source) {   
  88.   Field[] fields = _getEligibleFields(source);   
  89.   String className = _getClassName(source);   
  90.   StringBuffer sb = new StringBuffer();   
  91.   sb.append("/**\n");   
  92.   sb.append(" * Returns a hash code value for this ".\n" +    
  93.       className + ");   
  94.   sb.append(" *\n");   
  95.   sb.append(" * @return a hash code value for this ".\n" +    
  96.       className + ");   
  97.   sb.append(" */\n");   
  98.   sb.append("public int hashCode() {\n");   
  99.   sb.append("  int hashCode = " + source.getName().hashCode() +    
  100.       "; // result of getClass().getName().hashCode() \n");   
  101.   for (int i = 0; i < fields.length; i++) {   
  102.     if (fields[i].getType().isArray()) {   
  103.       sb.append("  for (int i = 0; i < " +    
  104.           fields[i].getName() + ".length; i++) {\n");   
  105.       _appendFieldHashCalculation(   
  106.           sb, fields[i].getType().getComponentType(),    
  107.           fields[i].getName() + "[i]""      ");   
  108.       sb.append("  }\n");   
  109.       continue;   
  110.     }   
  111.     _appendFieldHashCalculation(   
  112.         sb, fields[i].getType(), fields[i].getName(), "    ");   
  113.   }   
  114.   sb.append("  return hashCode;\n");   
  115.   sb.append("}\n");   
  116.   return sb.toString();   
  117. }   
  118.        
  119.   /**  
  120.    * Returns a String representing usable   
  121.    * String toString() sourcecode for the given Class 
  122.    *  
  123.    * @param source the Class to inspect.  
  124.    * @return a String representing usable   
  125.    *        String toString() sourcecode for the given   
  126.    *        Class.  
  127.    */  
  128.   public static String getToStringSourceCode(Class source) {   
  129.     Field[] fields = _getEligibleFields(source);   
  130.     StringBuffer sb = new StringBuffer();   
  131.     String className = _getClassName(source);   
  132.     sb.append("/**\n");   
  133.     sb.append(" * Returns a String representation of this ".\n" +    
  134.         className + ");   
  135.     sb.append(" *\n");   
  136.     sb.append(" * @return a String representation of this ".\n" +    
  137.         className + ");   
  138.     sb.append(" */\n");   
  139.     sb.append("public String toString() {\n");   
  140.     if (fields.length == 0) {   
  141.       sb.append("  return \"" + className + "()\";\n");   
  142.     }   
  143.     else {   
  144.       sb.append("  StringBuffer buffer = new StringBuffer(\"" +    
  145.           className + "(\");\n");   
  146.       for (int i = 0; i < fields.length; i++) {   
  147.         sb.append("  buffer.append(\"" + fields[i].getName() + "=\" + " +    
  148.             fields[i].getName());   
  149.         if (i == fields.length - 1) sb.append(" + \")\");\n");    
  150.         else sb.append(" + \",\");\n");    
  151.       }   
  152.       sb.append("  return buffer.toString();\n");   
  153.     }   
  154.     sb.append("}\n");   
  155.     return sb.toString();   
  156.   }   
  157.        
  158.   //--------------------------------------------------   
  159.   // implementation:   
  160.   //--------------------------------------------------   
  161.      
  162.   private static void _appendFieldHashCalculation(   
  163.       StringBuffer sb, Class type, String fieldName, String indent) {   
  164.        
  165.     if (type.isPrimitive()) {   
  166.       if (Boolean.TYPE.equals(type)) {   
  167.         sb.append(indent +    
  168.             "hashCode = 37 * hashCode + (" + fieldName + " ? 0 : 1);\n");             
  169.       }   
  170.       else if (Byte.TYPE.equals(type) || Character.TYPE.equals(type) ||    
  171.           Short.TYPE.equals(type) || Integer.TYPE.equals(type)) {   
  172.         sb.append(indent + "hashCode = 37 * hashCode + " +    
  173.             (Integer.TYPE.equals(type) ? "" : "(int) ") + fieldName + ";\n");             
  174.       }   
  175.       else if (Long.TYPE.equals(type)) {   
  176.         sb.append(indent + "hashCode = 37 * hashCode + (int)(" + fieldName +    
  177.             " ^ (" + fieldName + " >>> 32));\n");             
  178.       }   
  179.       else if (Float.TYPE.equals(type)) {   
  180.         sb.append(indent + "hashCode = 37 * hashCode + Float.floatToIntBits(" +    
  181.             fieldName + ");\n");             
  182.       }   
  183.       else if (Double.TYPE.equals(type)) {   
  184.         sb.append(indent + "long longBits = Double.doubleToLongBits(" +    
  185.             fieldName + ");\n");             
  186.         sb.append(indent +    
  187.             "hashCode = 37 * hashCode + (int)(longBits ^ (longBits >>> 32));\n");             
  188.       }   
  189.       return;   
  190.     }   
  191.     sb.append(indent + "hashCode = 37 * hashCode + (" +    
  192.         fieldName + " == null ? 0 : " + fieldName + ".hashCode());\n");   
  193.   }   
  194.   
  195.   /**  
  196.    * Returns all instance fields from the given class that are found to be   
  197.    * non-public.  
  198.    */  
  199.   private static Field[] _getEligibleFields(Class source) {   
  200.     Field[] fields = source.getDeclaredFields();   
  201.     List<field></field> eligibleFields = new ArrayList<field></field>();   
  202.     for (int i = 0; i < fields.length; i++) {   
  203.       int modifiers = fields[i].getModifiers();   
  204.       if (!Modifier.isPublic(modifiers) && !Modifier.isStatic(modifiers)) {   
  205.         eligibleFields.add(fields[i]);   
  206.       }   
  207.     }   
  208.     return (Field[]) eligibleFields.toArray(new Field[eligibleFields.size()]);   
  209.   }   
  210.      
  211.   private static String _getClassName(Class source) {   
  212.     String className = source.getName();   
  213.     return className.substring(className.lastIndexOf(".") + 1);   
  214.   }   
  215.      
  216.   public static void main(String[] args) {   
  217.       Class source=null;   
  218.       //reslove object   
  219.       try {   
  220.         source=Class.forName(args[0]);   
  221.     } catch (ClassNotFoundException e) {   
  222.         // TODO Auto-generated catch block   
  223.         e.printStackTrace();   
  224.         return;   
  225.     }   
  226.          
  227.       System.out.println(SourcecodeGenerator.getEqualsSourceCode(source));   
  228.       System.out.println(SourcecodeGenerator.getHashCodeSourceCode(source));   
  229.       System.out.println(SourcecodeGenerator.getToStringSourceCode(source));   
  230.   }   
  231. }   

 

产生pojo以后,加上xdoclet的tag,主要包含@hibernate以及◎spring.validator两方面的tag。通过tag的增加,规定了如何产生数据库的表。

2。运行ant hibernatedoclet自动产生hbm文件,在build/dao/gen/目录下。

3。通过如下的脚本工具可以根据指定的hbm文件创建数据库,当然也可以使用hibernate的schemaexport工具。

java 代码
  1. import java.io.FileInputStream;   
  2. import java.io.InputStream;   
  3. import java.util.Properties;   
  4.   
  5. import org.appfuse.util.XmlTools;   
  6. import org.hibernate.cfg.Configuration;   
  7. import org.hibernate.tool.hbm2ddl.SchemaExport;   
  8. import org.w3c.dom.Document;   
  9.   
  10. /**  
  11.  *   
  12.  * @author Cheney Yuan  
  13.  *  
  14.  */  
  15. public class HibernateSchemaExport {   
  16.   
  17.     /**  
  18.      * @param args  
  19.      */  
  20.     public static void main(String[] args) {   
  21.         if (args.length < 1) {   
  22.             System.err.println("Usage: HibernateSchemaExport [full file path]hibernate.cfg.xml/database.properties "  
  23.                 + "[resource path]mapping.hbm.xml\n");   
  24.             System.exit(-1);   
  25.         }   
  26.   
  27.         Configuration config=new Configuration();   
  28.         Properties properties=new Properties();   
  29.   
  30.         String fullPathName=args[0];   
  31.         try {   
  32.             if (fullPathName.indexOf(".xml")>0) {   
  33.                 System.out.println("use xml file to configure.");   
  34.                 Document doc = null;   
  35.                 doc = XmlTools.getDocumentFromXmlFile(fullPathName);   
  36.                 config.configure(doc);   
  37.             }else if (fullPathName.indexOf(".properties")>0) {   
  38.                 System.out.println("use properties to configure.");   
  39.                 Properties props = new Properties();   
  40.                 props.putAll( config.getProperties() );   
  41.                 props.load( new FileInputStream( fullPathName ) );   
  42.                 config.setProperties( props );   
  43.   
  44.             }   
  45.         } catch (Exception e) {   
  46.             e.printStackTrace();   
  47.             return;   
  48.         }   
  49.   
  50.         //add hbm resources   
  51.         for (int i=1;i
  52.             config.addResource(args[i]);   
  53.         }   
  54.         /**  
  55.          * @param script print the DDL to the console  
  56.          * @param export export the script to the database  
  57.          */  
  58.         new SchemaExport(config).create(truefalse);   
  59.   
  60.     }   
  61.   
  62. }  

4。到extras/appgen下面运行ant install-detailed产生其他的类和测试程序。

5。applicationContext-hibernate.xml里面的hbm文件必须自己添加,该文件的位置在src/dao/org/appfuse/dao/hibernate/目录下。

6。运行ant deploy即可完成整个开发步骤。

你可能感兴趣的:(DAO,xml,Hibernate,ant,Appfuse)