一个可以用的逆向工程

本文介绍了一种基于Java的后端代码自动生成方案,包括XML配置文件、属性文件、数据源配置、工具类及主要业务逻辑类的实现。通过简单的配置即可生成包括DAO层、Service层等在内的完整后端代码。

 

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html

 一,xml文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <beans xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="
 8             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 9             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
10             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
11             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
12 
13     <!-- c3p0连接池配置 -->
14     <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
15         <!-- 用户名 -->
16         <property name="user" value="root" />
17         <!-- 用户密码 -->
18         <property name="password" value="111111" />
19         <property name="driverClass" value="com.mysql.jdbc.Driver" />
20         <!-- <property name="jdbcUrl" value="jdbc:mysql://192.*****:3306/库命" /> -->
21         <property name="jdbcUrl" value="jdbc:mysql://192*****:3306/库名" />
22         <!--连接池中保留的最大连接数。默认值: 15 -->
23         <property name="maxPoolSize" value="20" />
24         <!-- 连接池中保留的最小连接数,默认为:3 -->
25         <property name="minPoolSize" value="2" />
26         <!-- 初始化连接池中的连接数,取值应在minPoolSize与maxPoolSize之间,默认为3 -->
27         <property name="initialPoolSize" value="2" />
28 
29         <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。默认值: 0 -->
30         <property name="maxIdleTime"><value>60</value></property>
31 
32         <!-- 当连接池连接耗尽时,客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。默认: 
33             0 -->
34         <property name="checkoutTimeout" value="3000" />
35 
36         <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。默认值: 3 -->
37         <property name="acquireIncrement" value="2" />
38 
39         <!--定义在从数据库获取新连接失败后重复尝试的次数。默认值: 30 ;小于等于0表示无限次 -->
40         <property name="acquireRetryAttempts" value="0" />
41 
42         <!--重新尝试的时间间隔,默认为:1000毫秒 -->
43         <property name="acquireRetryDelay" value="1000" />
44 
45         <!--关闭连接时,是否提交未提交的事务,默认为false,即关闭连接,回滚未提交的事务 -->
46         <property name="autoCommitOnClose"><value>false</value></property>
47 
48         <!--c3p0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数那么属性preferredTestQuery将被忽略。你不能在这张Test表上进行任何操作,它将只供c3p0测试使用。默认值: 
49             null -->
50         <property name="automaticTestTable"><value>boss.t_assets_backup</value></property>
51 
52         <!--如果为false,则获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常,但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认: 
53             false -->
54         <property name="breakAfterAcquireFailure"><value>false</value></property>
55 
56         <!--每60秒检查所有连接池中的空闲连接。默认值: 0,不检查 -->
57         <property name="idleConnectionTestPeriod"><value>60</value></property>
58         <!--c3p0全局的PreparedStatements缓存的大小。如果maxStatements与maxStatementsPerConnection均为0,则缓存不生效,只要有一个不为0,则语句的缓存就能生效。如果默认值: 
59             0 -->
60         <property name="maxStatements"><value>100</value></property>
61         <!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。默认值: 0 -->
62         <property name="maxStatementsPerConnection"><value>0</value></property>
63     </bean>
64 
65 </beans>

 

二,property文件

 1 log4j.rootLogger=debug,console,logfile
 2 
 3 
 4 log4j.appender.console=org.apache.log4j.ConsoleAppender
 5 
 6 log4j.appender.console.layout=org.apache.log4j.PatternLayout
 7 log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS} [%-5p] %t(%c:%L) - %m%n
 8 
 9 log4j.appender.logfile=org.apache.log4j.RollingFileAppender
10 log4j.appender.logfile.File=d:/app-boss-codegenerator.log
11 log4j.appender.logfile.MaxFileSize=250MB
12 # Keep three  backup files.
13 log4j.appender.logfile.MaxBackupIndex=10
14 # Pattern to output: date priority [category] - message
15 log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
16 log4j.appender.logfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS} [%-5p] %t(%c:%L) - %m%n
17 
18 log4j.logger.com.ibatis= DEBUG
19 log4j.logger.java.sql.Connection=debug

 

三,加载数据源文件

 1 package com.bill99.boss.code;
 2 
 3 public class DataSourceConfig {
 4 
 5     private String driverClass;
 6     private String jdbcUrl;
 7     private String userId;
 8     private String password;
 9 
10     public String getDriverClass() {
11         return driverClass;
12     }
13 
14     public void setDriverClass(String driverClass) {
15         this.driverClass = driverClass;
16     }
17 
18     public String getJdbcUrl() {
19         return jdbcUrl;
20     }
21 
22     public void setJdbcUrl(String jdbcUrl) {
23         this.jdbcUrl = jdbcUrl;
24     }
25 
26     public String getUserId() {
27         return userId;
28     }
29 
30     public void setUserId(String userId) {
31         this.userId = userId;
32     }
33 
34     public String getPassword() {
35         return password;
36     }
37 
38     public void setPassword(String password) {
39         this.password = password;
40     }
41 
42 }

 

四,工具类

  1 package com.bill99.boss.code;
  2 
  3 import java.io.ByteArrayInputStream;
  4 import java.io.File;
  5 import java.io.FileOutputStream;
  6 import java.io.FileWriter;
  7 import java.io.IOException;
  8 import java.util.ArrayList;
  9 import java.util.HashSet;
 10 import java.util.List;
 11 import java.util.Map;
 12 import java.util.Set;
 13 import java.util.StringTokenizer;
 14 
 15 import javax.xml.transform.Transformer;
 16 import javax.xml.transform.TransformerException;
 17 import javax.xml.transform.TransformerFactory;
 18 import javax.xml.transform.dom.DOMSource;
 19 import javax.xml.transform.stream.StreamResult;
 20 
 21 import org.dom4j.Document;
 22 import org.dom4j.DocumentException;
 23 import org.dom4j.Element;
 24 import org.dom4j.io.OutputFormat;
 25 import org.dom4j.io.SAXReader;
 26 import org.dom4j.io.XMLWriter;
 27 import org.w3c.dom.Node;
 28 
 29 /**
 30  * XML操作工具类 DOM4j实现
 31  * 
 32  * @author yong.zhan
 33  * 
 34  */
 35 public class XMLUtil {
 36 
 37     private Document doc;
 38     private Element rootElement;
 39     private String rootNameStr;
 40 
 41     /**
 42      * 初始化xml工具类,通过传入xml文本string形式
 43      * 
 44      * @param xmlStr
 45      *            xml文本string形式
 46      * @throws NullPointerException
 47      * @throws DocumentException
 48      *             xml解析异常
 49      */
 50     public XMLUtil(String xmlStr) throws NullPointerException,
 51             DocumentException {
 52         SAXReader reader = new SAXReader();
 53         doc = reader.read(new ByteArrayInputStream(xmlStr.getBytes()), "UTF-8");
 54         rootElement = doc.getRootElement();
 55         rootNameStr = rootElement.getName();
 56     }
 57 
 58     /**
 59      * 初始化xml工具类,通过文件形式
 60      * 
 61      * @param file
 62      *            xml文件
 63      * @throws NullPointerException
 64      * @throws DocumentException
 65      *             xml解析异常
 66      */
 67     public XMLUtil(File file) throws NullPointerException, DocumentException {
 68         SAXReader reader = new SAXReader();
 69         doc = reader.read(file);
 70         rootElement = doc.getRootElement();
 71         rootNameStr = rootElement.getName();
 72     }
 73 
 74     /**
 75      * 获取xml的Document对象
 76      * 
 77      * @return Document对象
 78      */
 79     public Document getDocument() {
 80         return doc;
 81     }
 82 
 83     /**
 84      * 通过路径取得属性的值
 85      * 
 86      * @param path
 87      *            要取得节点的路径用.分隔
 88      * @param attributeName
 89      *            属性名
 90      * @return 属性值列表
 91      */
 92     public List<String> getAttribute(String path, String attributeName) {
 93         List<String> lstRe = new ArrayList();
 94         List<Element> lstTmpElement = getElement(path);
 95         // 如果没找到,则返回空List
 96         if (lstTmpElement == null || lstTmpElement.size() == 0) {
 97             return lstRe;
 98         }
 99         for (Element el : lstTmpElement) {
100             String attri = el.attributeValue(attributeName);
101             if (attri != null) {
102                 lstRe.add(attri);
103             }
104         }
105         return lstRe;
106     }
107 
108     /**
109      * 通过路径取得节点的值
110      * 
111      * @param path
112      *            要取得节点的路径用.分隔
113      * @return 节点值列表
114      */
115     public List<String> getValue(String path) {
116         List<String> lstRe = new ArrayList();
117         List<Element> lstElement = getElement(path);
118         // 如果没找到,则返回空List
119         if (lstElement == null || lstElement.size() == 0) {
120             return lstRe;
121         }
122         for (Element el : lstElement) {
123             lstRe.add(el.getText());
124         }
125         return lstRe;
126     }
127 
128     /**
129      * 通过路径取得元素
130      * 
131      * @param path
132      *            要取得元素的路径用.分隔
133      * @return 元素列表
134      */
135     public List<Element> getElement(String path) {
136         // 临时的list
137         List<Element> lstTmpElement = new ArrayList();
138         List<Element> lstReElement = new ArrayList();
139         StringTokenizer st = new StringTokenizer(path, ".");
140         // 从根节点开始查
141         Element currentElement = doc.getRootElement();
142         lstReElement.add(currentElement);
143         // 当前遍历的层级
144         int i = 0;
145         String nextName = "";
146         while (st.hasMoreTokens()) {
147             nextName = (String) st.nextToken();
148             // 如果当前是根不是根节点,这样做为了使得path既可以从根节点开始,也可以直接从根后第一个节点开始
149             if (!nextName.equals(rootNameStr) || i != 0) {
150                 for (Element el : lstReElement) {
151                     // 取得下级的节点放入临时list中
152                     lstTmpElement.addAll(el.elements(nextName));
153                 }
154                 // 更新符合条件的list
155                 lstReElement.clear();
156                 lstReElement.addAll(lstTmpElement);
157                 // 清空临时list
158                 lstTmpElement.clear();
159             }
160             i++;
161         }
162         return lstReElement;
163     }
164 
165     /**
166      * 通过路径设置节点的值
167      * 
168      * @param path
169      *            节点的路径用.分隔
170      * @param value
171      *            值
172      */
173     public void setElementValue(String path, String value) {
174         if (value == null) {
175             value = "";
176         }
177         List<Element> lstElement = getElement(path);
178         if (lstElement == null || lstElement.size() == 0) {
179             // 没有找到不处理
180         }
181         for (Element el : lstElement) {
182             el.setText(value);
183         }
184     }
185 
186     /**
187      * 设置节点的值
188      * 
189      * @param path
190      *            节点的路径用.分隔
191      * @param value
192      *            值
193      */
194     public void setAttributeValue(String path, String name, String value) {
195         if (value == null) {
196             value = "";
197         }
198         List<Element> lstElement = getElement(path);
199         if (lstElement == null || lstElement.size() == 0) {
200             // 没有找到不处理
201         }
202         for (Element el : lstElement) {
203             el.addAttribute(name, value);
204         }
205     }
206 
207     /**
208      * 根据路径增加元素(可多个)
209      * 
210      * @param path
211      *            路径
212      * @param name
213      *            元素名
214      * @param value
215      *            元素值
216      * @param isChildNode
217      *            是否增加到源节点的子节点
218      * @param index
219      *            0 根据路径查出符合条件的所有元素 1到n 根据路径查出符合条件的第几个元素
220      * @return 元素的集合
221      */
222     public List<Element> addElementByPath(String path, String name,
223             String value, boolean isChildNode, int index) {
224         List<Element> lst = getElement(path);
225         List<Element> reLst = new ArrayList();
226         int i = 1;
227         for (Element el : lst) {
228             if (index == 0 || i == index) {
229                 Element currentlyElement = addElement(el, name, value,
230                         isChildNode);
231                 reLst.add(currentlyElement);
232             }
233             i++;
234         }
235         return reLst;
236     }
237 
238     /**
239      * 新增元素
240      * 
241      * @param el
242      *            源节点
243      * @param name
244      *            元素名
245      * @param value
246      *            节点值,如无填入""
247      * @param isChildNode
248      *            是否增加到源节点的子节点
249      * @return 元素
250      */
251     public Element addElement(Element el, String name, String value,
252             boolean isChildNode) {
253         Element currentlyElement = null;
254         // 如果值为null,则赋值为""
255         if (value == null) {
256             value = "";
257         }
258         if (name == null) {
259             throw new NullPointerException();
260         }
261         if (isChildNode) {
262             currentlyElement = el.addElement(name);
263         } else {
264             currentlyElement = el.getParent().addElement(name);
265         }
266         currentlyElement.setText(value);
267         return currentlyElement;
268     }
269 
270     /**
271      * 根据路径增加元素(可多个)
272      * 
273      * @param path
274      *            路径
275      * @param name
276      *            属性名
277      * @param value
278      *            属性值
279      * @param index
280      *            0 根据路径查出符合条件的所有元素 1到n 根据路径查出符合条件的第几个元素
281      * @return 元素的集合
282      */
283     public List<Element> addAttributeByPath(String path, String name,
284             String value, int index) {
285         List<Element> lst = getElement(path);
286         List<Element> reLst = new ArrayList();
287         int i = 1;
288         for (Element el : lst) {
289             if (index == 0 || i == index) {
290                 Element currentlyElement = addAttribute(el, name, value);
291                 reLst.add(currentlyElement);
292             }
293             i++;
294         }
295         return reLst;
296     }
297 
298     /**
299      * 新增属性
300      * 
301      * @param el
302      *            需增加属性的元素
303      * @param name
304      *            属性名
305      * @param value
306      *            属性值
307      * @return 元素
308      */
309     public Element addAttribute(Element el, String name, String value) {
310         // 如果值为null,则赋值为""
311         if (value == null) {
312             value = "";
313         }
314         if (name == null) {
315             throw new NullPointerException();
316         }
317         Element currentlyElement = null;
318         currentlyElement = el.addAttribute(name, value);
319         return currentlyElement;
320     }
321 
322     /**
323      * 将Document类型 xml文件转成string格式
324      * 
325      * @param doc
326      *            Document类型
327      * @return string类型
328      * @throws TransformerException
329      */
330     public String getStrXml() {
331         String xmlStr = doc.asXML();
332         return xmlStr;
333     }
334 
335     /**
336      * 将xml中的${key}内标记的值用Map中value值替换key
337      * 
338      * @param xml
339      *            xml文本
340      * @param value
341      *            用于替换的map(key,value)
342      * @return 替换后的文本
343      */
344     public static String replace(String xml, Map<String, String> value) {
345         int len = xml.length();
346         StringBuffer buf = new StringBuffer(len);
347         for (int i = 0; i < len; i++) {
348             char c = xml.charAt(i);
349             if (c == '$') {
350                 i++;
351                 StringBuffer key = new StringBuffer();
352                 char temp = xml.charAt(i);
353                 while (temp != '}') {
354                     if (temp != '{') {
355                         key.append(temp);
356                     }
357                     i++;
358                     temp = xml.charAt(i);
359                 }
360                 String variable = (String) value.get(key.toString());
361                 if (null == variable) {
362                     buf.append("");
363                 } else {
364                     buf.append(variable);
365                 }
366             } else {
367                 buf.append(c);
368             }
369         }
370         return buf.toString();
371     }
372 
373     /**
374      * 编码XML文档里的特殊字符
375      * <p>
376      * XML文件有5个特殊字符,其中必须转换的是'&amp;'和'&lt;',这里会全部转换5个特殊字符:
377      * <ul>
378      * <li>&amp; - 与符号转换成&amp;amp;</li>
379      * <li>&lt; - 小于号转换成&amp;lt;</li>
380      * <li>&gt; - 大于号转换成&amp;gt;</li>
381      * <li>" - 双引号转换成&amp;quot;</li>
382      * <li>' - 单引号转换成&amp;apos</li>
383      * </ul>
384      * 
385      * @param 需要编码的XML文档
386      * @return 编码后的XML文档
387      */
388     public static String encode(String source) {
389         if (source == null)
390             return null;
391         String result = null;
392         StringBuffer sb = new StringBuffer();
393 
394         for (int i = 0; i < source.length(); i++) {
395             char c = source.charAt(i);
396             switch (c) {
397             case '&':
398                 sb.append("&amp;");
399                 break;
400             case '<':
401                 sb.append("&lt;");
402                 break;
403             case '\"':
404                 sb.append("&quot;");
405                 break;
406             case '\'':
407                 sb.append("&apos;");
408                 break;
409             case '>':
410                 sb.append("&gt;");
411                 break;
412             default:
413                 sb.append(c);
414             }
415         }
416         result = sb.toString();
417         return result;
418     }
419 
420     public static void main(String[] args) {
421         XMLUtil a = null;
422         try {
423             a = new XMLUtil(
424                     new File(
425                             "E:\\workspace\\fo-osf-base\\src\\main\\resources\\context\\context-limitcontrol-service.xml"));
426         } catch (NullPointerException e) {
427             // TODO Auto-generated catch block
428             e.printStackTrace();
429         } catch (DocumentException e) {
430             // TODO Auto-generated catch block
431             e.printStackTrace();
432         }
433         List<Element> element = a.getElement("context:component-scan");
434         System.err.println(element.size());
435 //        for (Element e : element) {
436 //        }
437         Element e = element.get(element.size()-1);
438         Element beanHelloWorld = e.getParent().addElement("bean")
439                 .addAttribute("id", "HelloWorld")
440                 .addAttribute("class", "com.iteye.bolide74.action.HelloWorld");
441         Element propertyHelloWorld = beanHelloWorld.addElement("property")
442                 .addAttribute("name", "msg");
443         propertyHelloWorld.addElement("ref").addAttribute("bean", "session");
444         XMLWriter outXml=null;
445         try {
446              outXml = new XMLWriter(new FileWriter(new File("E:\\workspace\\fo-osf-base\\src\\main\\resources\\context\\context-limitcontrol-service.xml")));
447             outXml.write(a.getDocument());
448         } catch (Exception e2) {
449             e2.printStackTrace();
450         }finally{
451             try {
452                 outXml.close();
453             } catch (IOException e1) {
454                 // TODO Auto-generated catch block
455                 e1.printStackTrace();
456             }
457         }
458 
459         //
460         // try {
461         // OutputFormat format = OutputFormat.createPrettyPrint();
462         // XMLWriter writer = new XMLWriter(new FileOutputStream("d:\\a.xml"),
463         // format);
464         // writer.write(a.getDocument());
465         // writer.close();
466         //
467         // } catch (Exception e) {
468         // e.printStackTrace();
469         // }
470 
471     }
472 
473     private void getBeanName(Element element, Set<String> value,
474             List<String[]> property) {
475         List<Element> elements = null;
476         List<Element> preElement = null;
477         List<Element> lastElement = new ArrayList<Element>();
478         boolean flg = true;
479         for (String[] fileds : property) {
480             for (String filed : fileds) {
481                 if (elements != null && elements.size() > 0) {
482                     for (Element e : elements) {
483                         elements = getValue(e, filed, value);
484                         // 循环到就保留当前节点的,避免被下一次获取覆盖,导致不能进行循环直接点的ref属性
485                         if (elements.size() > 0) {
486                             preElement = elements;
487                         }
488                     }
489                     elements = preElement;
490                     continue;
491                 }
492                 if (flg) {
493                     elements = getValue(element, filed, value);
494                     lastElement.addAll(elements);
495                     flg = false;
496                 } else {
497                     break;
498                 }
499             }
500             elements = lastElement;
501         }
502     }
503 
504     private List<Element> getValue(Element element, String nodeName,
505             Set<String> value) {
506         @SuppressWarnings("unchecked")
507         List<Element> elements = element.elements(nodeName);
508         for (Element e : elements) {
509             checkAttributeValue(e, value);
510         }
511         return elements;
512     }
513 
514     private void checkAttributeValue(Element e, Set<String> value) {
515         String[] checkFiled = { "bean", "local", "ref" };
516         String result = null;
517         for (String filed : checkFiled) {
518             result = e.attributeValue(filed);
519             if (result != null && !"".equals(result)) {
520                 value.add(result);
521                 break;
522             }
523         }
524     }
525 }

 

五,主要业务逻辑类

   1 package com.bill99.boss.code;
   2 
   3 import java.io.File;
   4 import java.io.FileOutputStream;
   5 import java.io.FileWriter;
   6 import java.io.IOException;
   7 import java.io.OutputStreamWriter;
   8 import java.sql.Connection;
   9 import java.sql.DatabaseMetaData;
  10 import java.sql.ResultSet;
  11 import java.sql.ResultSetMetaData;
  12 import java.sql.SQLException;
  13 import java.sql.Statement;
  14 import java.sql.Types;
  15 import java.util.List;
  16 import java.util.Vector;
  17 
  18 import org.dom4j.Element;
  19 import org.dom4j.io.XMLWriter;
  20 
  21 import com.bill99.inf.ibatis.DBFactory;
  22 
  23 public class SqlMapXMLGeneratorIbatis {
  24     private String driverClass;
  25     private String jdbcUrl;
  26     private String userId;
  27     private String password;
  28     private String srcPath;
  29     private String xmlPath;
  30     private String charset;
  31 
  32     private DatabaseMetaData dmd;
  33 
  34     ResultSetMetaData rsm;
  35 
  36     private String[] primaryKeys;
  37 
  38     public SqlMapXMLGeneratorIbatis(DataSourceConfig config) {
  39         super();
  40         this.driverClass = config.getDriverClass();
  41         this.jdbcUrl = config.getJdbcUrl();
  42         this.userId = config.getUserId();
  43         this.password = config.getPassword();
  44 //        this.srcPath = srcPath;
  45 //        this.xmlPath = xmlPath;
  46         this.charset = "UTF-8";
  47     }
  48 
  49     private void setPrimaryKey(String[] primaryKeys) {
  50         // TODO Auto-generated method stub
  51         this.primaryKeys = primaryKeys;
  52     }
  53 
  54     /**
  55      * 根据数据库的表生成后端java代码
  56      * @param dataBaseName   数据库名字 比如 appmobile  org
  57      * @param tableName   表名 例如 t_config  默认class 名称 和表名一致 去掉t开头
  58      * @param projectPath  生成到项目的根目录
  59      * @return
  60      * @return String    返回类型
  61      */
  62     public String generateSql(String dataBaseName, String tableName,String projectPath) {
  63         return this.generateSql(dataBaseName, tableName, null,projectPath);
  64     }
  65 
  66     /**
  67      * 根据数据库的表生成后端java代码
  68      * @param dataBaseName   数据库名字 比如 appmobile  org
  69      * @param tableName   表名 例如 t_config
  70      * @param className    定制java class名字 
  71      * @param projectPath  生成到项目的根目录
  72      * @return
  73      * @return String    返回类型
  74      */
  75     public String generateSql(String dataBaseName, String tableName,
  76             String className,String projectPath) {
  77         this.srcPath =projectPath+"/src/main/java/";
  78         this.xmlPath =projectPath+"\\src\\main\\resources\\";
  79         String rootpackage = "com.bill99.boss.domain.org.";
  80         String xmlFolder = xmlPath + "context";
  81         String xmlOrmFolder = "ormapping/ibatis";
  82         className = className == null ? getModeClassName(tableName.replaceFirst(
  83                 "t", "")) : className;
  84         return this.generateSql(tableName, toName(dataBaseName, className),
  85                 rootpackage + "model", rootpackage + "dao", rootpackage
  86                         + "service", className, xmlOrmFolder, null, xmlFolder,
  87                 dataBaseName);
  88     }
  89 
  90     private String generateSql(String tableName, String namespace,
  91             String modelPackageName, String daoPackageName,
  92             String servicePackageName, String className, String xmlOrmFolder,
  93             String seqName, String xmlFolder, String dataBaseName) {
  94         Connection con = null;
  95         OutputStreamWriter osw =null;
  96         try {
  97             Class.forName(this.driverClass);
  98             con = java.sql.DriverManager.getConnection(this.jdbcUrl,
  99                     this.userId, this.password);
 100             this.dmd = con.getMetaData();
 101             String sql = "select * from " + tableName;
 102             Statement st = con.createStatement();
 103             ResultSet rs = st.executeQuery(sql);
 104             this.rsm = rs.getMetaData();
 105 
 106             if (this.primaryKeys == null || this.primaryKeys.length == 0) {
 107                 ResultSet rp = this.dmd.getPrimaryKeys(null, null, tableName);
 108                 List lt = new Vector();
 109                 while (rp.next()) {
 110                     lt.add(rp.getString(4));
 111                 }
 112                 //rp.close();
 113                 if (lt.size() < 1) {
 114                     lt.add(this.rsm.getColumnName(1));// 把第一个字段作为主键
 115                 }
 116                 if (lt.size() > 0) {
 117                     this.primaryKeys = new String[lt.size()];
 118                     lt.toArray(this.primaryKeys);
 119                 } else {
 120                     System.out.println("" + tableName
 121                             + "没有定义主键,强烈推荐定义主键!!!!!!!!!!!!");
 122                 }
 123             }
 124             this.generateJavaDao(daoPackageName, modelPackageName, className,
 125                     namespace, seqName);
 126             this.generateJavaService(servicePackageName, daoPackageName,
 127                     modelPackageName, className);
 128             this.generateJavaServiceImpl(servicePackageName
 129                     +".impl", daoPackageName,
 130                     modelPackageName, className);
 131             String parameterClass = this.generateJavaModel(modelPackageName,
 132                     className);
 133             final String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
 134             final String xmlDocType = "<!DOCTYPE sqlMap PUBLIC \"-//iBATIS.com//DTD SQL Map 2.0//EN\" \"http://ibatis.apache.org/dtd/sql-map-2.dtd\">";
 135             String data = xmlStr + "\r\n" + xmlDocType
 136                     + "\r\n<sqlMap namespace=\"" + namespace + "\">\r\n";
 137             data += "\r\n"
 138                     + this.generatSelectSql(tableName, namespace,
 139                             parameterClass, parameterClass, "Model");
 140             data += "\r\n"
 141                     + this.generatSelectSql(tableName, namespace,
 142                             "java.util.HashMap", parameterClass, "Map");
 143             data += "\r\n" + this.generatInsertSql(tableName, namespace);
 144             data += "\r\n" + this.generatUpdateSql(tableName, namespace);
 145             data += "\r\n" + this.generatDeleteSql(tableName, namespace);
 146             data += "\r\n</sqlMap>";
 147             
 148             if (xmlOrmFolder != null) {
 149                 String path = this.xmlPath + File.separator + xmlOrmFolder;
 150                 File fp = new File(path);
 151                 if (!fp.exists())
 152                     fp.mkdirs();
 153                 String fileName = path + File.separator + className + ".xml";
 154                 // File file = new File(fileName);
 155                  osw = new OutputStreamWriter(
 156                         new FileOutputStream(fileName), this.charset);
 157                 osw.write(data);
 158                 osw.flush();
 159             }
 160             if (daoPackageName != null && servicePackageName != null) {
 161                 String springConfig = this.generateSpringConfig(daoPackageName,
 162                         servicePackageName+".impl", className, xmlFolder, dataBaseName);
 163                 return springConfig;
 164             } else {
 165                 return data;
 166             }
 167         } catch (Exception e) {
 168             // TODO Auto-generated catch block
 169             e.printStackTrace();
 170             return "";
 171         } finally {
 172             try {
 173 //                st.close();
 174                 con.close();
 175                 osw.close();
 176             } catch (Exception e) {
 177                 // TODO Auto-generated catch block
 178                 e.printStackTrace();
 179             }
 180         }
 181     }
 182 
 183     private void generateJavaDao(String packageName, String modelPackageName,
 184             String className, String namespace, String seqName) {
 185         if (packageName == null || packageName.trim().equals("")
 186                 || className == null || className.trim().equals("")) {
 187             return;
 188         }
 189         String oldCls = className;
 190         String clz = modelPackageName + "." + className;
 191         className = className + "Dao";
 192         String pt = packageName;
 193         if (packageName.indexOf(".") > 0)
 194             pt = packageName.replace(".", File.separator);
 195         String path = srcPath + File.separator + pt;
 196         File dir = new File(path);
 197         if (!dir.exists())
 198             dir.mkdirs();
 199         String fileName = path + File.separator + className + ".java";
 200         OutputStreamWriter osw=null;
 201         try {
 202             StringBuilder sb = new StringBuilder();
 203             sb.append("package " + packageName + ";\r\n\r\n");
 204             sb.append("import " + clz + ";\r\n");
 205             sb.append("import java.util.List;\r\n");
 206             sb.append("import java.util.Map;\r\n");
 207             sb.append("import com.bill99.inf.ibatis.PageInfo;\r\n");
 208             sb.append("\r\n");
 209 
 210             sb.append("public class " + className
 211                     + " extends com.bill99.inf.ibatis.BaseDao{\r\n");
 212 
 213             sb.append("    public " + oldCls + " create" + oldCls + "(" + oldCls
 214                     + " model){\r\n");
 215             String getSeqFunName = "super.getSequence";
 216             if (DBFactory.isMySql) {
 217                 getSeqFunName = "super.getMySqlSequence";
 218             }
 219             if (seqName != null && seqName.trim().length() > 0) {
 220                 sb.append("        model.setId(" + getSeqFunName + "(\"" + seqName
 221                         + "\"));//如果主键是sequence生成\r\n");
 222             } else {
 223                 sb.append("        //model.setId(" + getSeqFunName
 224                         + "(\"seqName\"));//如果主键是sequence生成\r\n");
 225             }
 226             sb.append("        dao.insert(\"" + namespace + "."
 227                     + this.toName("insert", namespace) + "\",model);\r\n");
 228             sb.append("        return model;\r\n");
 229             sb.append("    }\r\n\r\n");
 230 
 231             sb.append("    public void delete" + oldCls + "(Object id){\r\n");
 232             sb.append("        dao.delete(\"" + namespace + "."
 233                     + this.toName("delete", namespace) + "\",id);\r\n");
 234             sb.append("    }\r\n\r\n");
 235 
 236             sb.append("    public void update" + oldCls + "(" + oldCls
 237                     + " model){\r\n");
 238             sb.append("        dao.update(\"" + namespace + "."
 239                     + this.toName("update", namespace) + "\",model);\r\n");
 240             sb.append("    }\r\n\r\n");
 241 
 242             sb.append("    public List<" + oldCls + "> query" + oldCls
 243                     + "ByModel(" + oldCls + " model){\r\n");
 244             sb.append("        return (List<" + oldCls + ">)dao.queryForList(\""
 245                     + namespace + "." + this.toName("queryModel", namespace)
 246                     + "\",model);\r\n");
 247             sb.append("    }\r\n\r\n");
 248 
 249             sb.append("    public List<" + oldCls + "> query" + oldCls
 250                     + "ByModelPage(" + oldCls + " model,PageInfo page){\r\n");
 251             sb.append("        return (List<" + oldCls + ">)dao.queryForList(\""
 252                     + namespace + "." + this.toName("queryModel", namespace)
 253                     + "\",model,page);\r\n");
 254             sb.append("    }\r\n\r\n");
 255 
 256             sb.append("    public List<" + oldCls + "> query" + oldCls
 257                     + "ByMap(Map  map){\r\n");
 258             sb.append("        return (List<" + oldCls + ">)dao.queryForList(\""
 259                     + namespace + "." + this.toName("queryMap", namespace)
 260                     + "\",map);\r\n");
 261             sb.append("    }\r\n\r\n");
 262 
 263             sb.append("    public List<" + oldCls + "> query" + oldCls
 264                     + "ByMapPage(Map  map,PageInfo page){\r\n");
 265             sb.append("        return (List<" + oldCls + ">)dao.queryForList(\""
 266                     + namespace + "." + this.toName("queryMap", namespace)
 267                     + "\",map,page);\r\n");
 268             sb.append("    }\r\n\r\n");
 269 
 270             sb.append("    public " + oldCls + " find" + oldCls + "ByModel("
 271                     + oldCls + " model){\r\n");
 272             sb.append("        return (" + oldCls + ")dao.queryForObject(\""
 273                     + namespace + "." + this.toName("queryModel", namespace)
 274                     + "\",model);\r\n");
 275             sb.append("    }\r\n");
 276 
 277             sb.append("    public " + oldCls + " find" + oldCls
 278                     + "ByMap(Map  map){\r\n");
 279             sb.append("        return (" + oldCls + ")dao.queryForObject(\""
 280                     + namespace + "." + this.toName("queryMap", namespace)
 281                     + "\",map);\r\n");
 282             sb.append("    }\r\n");
 283 
 284             if (this.primaryKeys != null && this.primaryKeys.length > 0) {
 285                 sb.append("    public " + oldCls + " find" + oldCls + "ById(");
 286                 for (int i = 0; i < this.primaryKeys.length; i++) {
 287                     if (i > 0)
 288                         sb.append(",");
 289                     String javaName = this.sql2JavaName(this.primaryKeys[i]);
 290                     sb.append("Object " + javaName);
 291                 }
 292                 sb.append("){\r\n");
 293                 sb.append("        Map map=new java.util.HashMap();\r\n");
 294                 for (int i = 0; i < this.primaryKeys.length; i++) {
 295                     String javaName = this.sql2JavaName(this.primaryKeys[i]);
 296                     sb.append("        map.put(\"" + javaName + "\"," + javaName
 297                             + ");\r\n");
 298                 }
 299 
 300                 sb.append("        return (" + oldCls + ")dao.queryForObject(\""
 301                         + namespace + "." + this.toName("queryMap", namespace)
 302                         + "\",map);\r\n");
 303                 sb.append("    }\r\n");
 304             }
 305 
 306             sb.append("\r\n\r\n");
 307             sb.append("}");
 308             File file = new File(fileName);
 309              osw = new OutputStreamWriter(
 310                     new FileOutputStream(file), this.charset);
 311             osw.write(sb.toString());
 312             osw.flush();
 313         } catch (Exception e) {
 314             // TODO Auto-generated catch block
 315             e.printStackTrace();
 316         }finally{
 317             if (osw!=null) {
 318                 try {
 319                     osw.close();
 320                 } catch (IOException e) {
 321                     // TODO Auto-generated catch block
 322                     e.printStackTrace();
 323                 }
 324             }
 325         }
 326     }
 327 
 328     private String generateSpringConfig(String daoPackageName,
 329             String servicePackageName, String className, String xmlFilePath,
 330             String dataBaseName) {
 331         File file = new File(xmlFilePath);
 332         if (!file.exists()) {
 333             file.mkdirs();
 334         }
 335         XMLWriter outXml=null;
 336         OutputStreamWriter osw=null;
 337         try {
 338             String daoVar = className.toLowerCase().substring(0, 1)
 339                     + className.substring(1) + "Dao";
 340             String daoClass = daoPackageName + "." + className + "Dao";
 341             String xmlFileName = xmlFilePath + File.separator + "context-"
 342                     + dataBaseName + "-orm" + ".xml";
 343             File xmlfile = new File(xmlFileName);
 344             if (xmlfile.exists()) {
 345                 XMLUtil xml = new XMLUtil(xmlfile);
 346                 List<Element> element = xml.getElement("bean");
 347                 Element e = element.get(element.size() - 1);
 348                 Element beanNode = e.getParent().addElement("bean")
 349                         .addAttribute("id", daoVar)
 350                         .addAttribute("class", daoClass);
 351                 Element beanNodeproperty = beanNode.addElement("property")
 352                         .addAttribute("name", "dao");
 353                 beanNodeproperty.addElement("ref").addAttribute("bean",
 354                         "sqlMapDao");
 355                outXml = new XMLWriter(new FileWriter(new File(
 356                         xmlFileName)));
 357                 outXml.write(xml.getDocument());
 358                 outXml.flush();
 359             } else {
 360                 StringBuilder sbdao = new StringBuilder();
 361                 sbdao.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\">\r\n");
 362                 sbdao.append("    <!--dao spring config-->\r\n");
 363                 sbdao.append("    <bean id=\"" + daoVar + "\" class=\"" + daoClass
 364                         + "\">\r\n");
 365                 sbdao.append("        <property name=\"dao\" ref=\"sqlMapDao\"></property>\r\n");
 366                 sbdao.append("    </bean>\r\n\r\n");
 367                 sbdao.append("</beans>");
 368 //                XMLWriter outXml = new XMLWriter(new FileWriter(new File(
 369 //                        xmlFileName)));
 370 //                outXml.write(sbdao);
 371 //                outXml.close();
 372                  osw = new OutputStreamWriter(
 373                         new FileOutputStream(xmlFileName), this.charset);
 374                 osw.write(sbdao.toString());
 375                 osw.flush();
 376             }
 377 
 378             String serviceVar = className.toLowerCase().substring(0, 1)
 379                     + className.substring(1) + "Service";
 380             String serviceClass = servicePackageName + "." + className
 381                     + "ServiceImpl";
 382             xmlFileName = xmlFilePath + File.separator + "context-"
 383                     + dataBaseName + "-domain" + ".xml";
 384             xmlfile = new File(xmlFileName);
 385             if (xmlfile.exists()) {
 386                 XMLUtil xml = new XMLUtil(xmlfile);
 387                 List<Element> element = xml.getElement("bean");
 388                 Element e = element.get(element.size() - 1);
 389                 Element beanNode = e.getParent().addElement("bean")
 390                         .addAttribute("id", serviceVar)
 391                         .addAttribute("class", serviceClass);
 392                 Element beanNodeproperty = beanNode.addElement("property")
 393                         .addAttribute("name", daoVar);
 394                 beanNodeproperty.addElement("ref").addAttribute("bean", daoVar);
 395                 outXml = new XMLWriter(new FileWriter(new File(
 396                         xmlFileName)));
 397                 outXml.write(xml.getDocument());
 398                 outXml.flush();
 399             } else {
 400                 StringBuilder sbservice = new StringBuilder();
 401                 sbservice
 402                         .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<beans xmlns=\"http://www.springframework.org/schema/beans\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd\">\r\n");
 403                 sbservice.append("    <!--service spring config-->\r\n");
 404                 sbservice.append("    <bean id=\"" + serviceVar + "\" class=\""
 405                         + serviceClass + "\">\r\n");
 406                 sbservice.append("        <property name=\"" + daoVar + "\" ref=\""
 407                         + daoVar + "\"></property>\r\n");
 408                 sbservice.append("    </bean>\r\n");
 409                 sbservice.append("</beans>");
 410                  osw = new OutputStreamWriter(
 411                         new FileOutputStream(xmlFileName), this.charset);
 412                 osw.write(sbservice.toString());
 413                 osw.flush();
 414             }
 415 
 416         } catch (Exception e) {
 417             e.printStackTrace();
 418         }finally{
 419             try {
 420                 if (outXml!=null) {
 421                     outXml.close();
 422                 }
 423                 if (osw!=null) {
 424                     osw.close();
 425                 }
 426             } catch (IOException e) {
 427                 // TODO Auto-generated catch block
 428                 e.printStackTrace();
 429             }
 430         }
 431         return null;
 432     }
 433 
 434     private void generateJavaService(String packageName, String daoPackageName,
 435             String modelPackageName, String className) {
 436         if (packageName == null || packageName.trim().equals("")
 437                 || className == null || className.trim().equals("")) {
 438             return;
 439         }
 440         String modelClz = className;
 441         String modelClassName = modelPackageName + "." + className;
 442         String serviceClassName = className + "Service";
 443         String pt = packageName;
 444         if (packageName.indexOf(".") > 0)
 445             pt = packageName.replace(".", File.separator);
 446         String path = srcPath + File.separator + pt;
 447         File dir = new File(path);
 448         if (!dir.exists())
 449             dir.mkdirs();
 450         String fileName = path + File.separator + serviceClassName + ".java";
 451         OutputStreamWriter osw=null;
 452         try {
 453             StringBuilder sb = new StringBuilder();
 454             sb.append("package " + packageName + ";\r\n\r\n");
 455             sb.append("import " + modelClassName + ";\r\n");
 456             sb.append("import java.util.List;\r\n");
 457             sb.append("import java.util.Map;\r\n");
 458             sb.append("import com.bill99.inf.ibatis.PageInfo;\r\n");
 459             sb.append("\r\n");
 460             sb.append("public interface " + serviceClassName + "{\r\n");
 461 
 462             sb.append("    public " + modelClz + " create" + modelClz + "("
 463                     + modelClz + " model);\r\n");
 464 
 465             sb.append("    public void delete" + modelClz + "(Object id);\r\n");
 466 
 467             sb.append("    public void update" + modelClz + "(" + modelClz
 468                     + " model);\r\n");
 469 
 470             sb.append("    public List<" + modelClz + "> query" + modelClz
 471                     + "ByModel(" + modelClz + " model);\r\n");
 472 
 473             sb.append("    public List<" + modelClz + "> query" + modelClz
 474                     + "ByModelPage(" + modelClz + " model,PageInfo page);\r\n");
 475 
 476             sb.append("    public List<" + modelClz + "> query" + modelClz
 477                     + "ByMap(Map  map);\r\n");
 478 
 479             sb.append("    public List<" + modelClz + "> query" + modelClz
 480                     + "ByMapPage(Map  map,PageInfo page);\r\n");
 481 
 482             sb.append("    public " + modelClz + " find" + modelClz + "ByModel("
 483                     + modelClz + " model);\r\n");
 484 
 485             sb.append("    public " + modelClz + " find" + modelClz
 486                     + "ByMap(Map  map);\r\n");
 487 
 488             if (this.primaryKeys != null && this.primaryKeys.length > 0) {
 489                 sb.append("    public " + modelClz + " find" + modelClz + "ById(");
 490                 String str = "";
 491                 for (int i = 0; i < this.primaryKeys.length; i++) {
 492                     if (i > 0) {
 493                         sb.append(",");
 494                         str += ",";
 495                     }
 496                     String javaName = this.sql2JavaName(this.primaryKeys[i]);
 497                     sb.append("Object " + javaName);
 498                     str += javaName;
 499                 }
 500                 sb.append(");\r\n");
 501             }
 502             sb.append("\r\n\r\n");
 503             sb.append("}");
 504             File file = new File(fileName);
 505              osw = new OutputStreamWriter(
 506                     new FileOutputStream(file), this.charset);
 507             osw.write(sb.toString());
 508             osw.flush();
 509         } catch (Exception e) {
 510             // TODO Auto-generated catch block
 511             e.printStackTrace();
 512         }finally{
 513             try {
 514                 osw.close();
 515             } catch (IOException e) {
 516                 // TODO Auto-generated catch block
 517                 e.printStackTrace();
 518             }
 519         }
 520     }
 521     
 522     private void generateJavaServiceImpl(String packageName, String daoPackageName,
 523             String modelPackageName, String className) {
 524         if (packageName == null || packageName.trim().equals("")
 525                 || className == null || className.trim().equals("")) {
 526             return;
 527         }
 528         String modelClz = className;
 529         String daoVar = className.toLowerCase().substring(0, 1)
 530         + className.substring(1) + "Dao";
 531         String modelClassName = modelPackageName + "." + className;
 532         String daoClassName = daoPackageName + "." + className + "Dao";
 533         String serviceClassName = className + "ServiceImpl";
 534         String pt = packageName;
 535         if (packageName.indexOf(".") > 0)
 536             pt = packageName.replace(".", File.separator);
 537         String path = srcPath + File.separator + pt;
 538         File dir = new File(path);
 539         if (!dir.exists())
 540             dir.mkdirs();
 541         String fileName = path + File.separator + serviceClassName + ".java";
 542         OutputStreamWriter osw =null;
 543         try {
 544             StringBuilder sb = new StringBuilder();
 545             sb.append("package " + packageName + ";\r\n\r\n");
 546             sb.append("import " +(packageName.replace(".impl", ".")+className)+"Service;\r\n");
 547             sb.append("import " + modelClassName + ";\r\n");
 548             sb.append("import " + daoClassName + ";\r\n");
 549             sb.append("import java.util.List;\r\n");
 550             sb.append("import java.util.Map;\r\n");
 551             sb.append("import com.bill99.inf.ibatis.PageInfo;\r\n");
 552             sb.append("\r\n");
 553             sb.append("public class " + serviceClassName + " implements "+className+"Service {\r\n");
 554             sb.append("  private " + className + "Dao " + daoVar + ";\r\n\r\n");
 555             
 556             sb.append("    public " + modelClz + " create" + modelClz + "("
 557                     + modelClz + " model){\r\n");
 558             sb.append("        return " + daoVar + ".create" + modelClz
 559                     + "(model);\r\n");
 560             sb.append("    }\r\n\r\n");
 561             
 562             sb.append("    public void delete" + modelClz + "(Object id){\r\n");
 563             sb.append("        " + daoVar + ".delete" + modelClz + "(id);\r\n");
 564             sb.append("    }\r\n\r\n");
 565             
 566             sb.append("    public void update" + modelClz + "(" + modelClz
 567                     + " model){\r\n");
 568             sb.append("        " + daoVar + ".update" + modelClz + "(model);\r\n");
 569             sb.append("    }\r\n\r\n");
 570             
 571             sb.append("    public List<" + modelClz + "> query" + modelClz
 572                     + "ByModel(" + modelClz + " model){\r\n");
 573             sb.append("        return " + daoVar + ".query" + modelClz
 574                     + "ByModel(model);\r\n");
 575             sb.append("    }\r\n\r\n");
 576             
 577             sb.append("    public List<" + modelClz + "> query" + modelClz
 578                     + "ByModelPage(" + modelClz + " model,PageInfo page){\r\n");
 579             sb.append("        return " + daoVar + ".query" + modelClz
 580                     + "ByModelPage(model,page);\r\n");
 581             sb.append("    }\r\n\r\n");
 582             
 583             sb.append("    public List<" + modelClz + "> query" + modelClz
 584                     + "ByMap(Map  map){\r\n");
 585             sb.append("        return " + daoVar + ".query" + modelClz
 586                     + "ByMap(map);\r\n");
 587             sb.append("    }\r\n\r\n");
 588             
 589             sb.append("    public List<" + modelClz + "> query" + modelClz
 590                     + "ByMapPage(Map  map,PageInfo page){\r\n");
 591             sb.append("        return " + daoVar + ".query" + modelClz
 592                     + "ByMapPage(map,page);\r\n");
 593             sb.append("    }\r\n\r\n");
 594             
 595             sb.append("    public " + modelClz + " find" + modelClz + "ByModel("
 596                     + modelClz + " model){\r\n");
 597             sb.append("        return " + daoVar + ".find" + modelClz
 598                     + "ByModel(model);\r\n");
 599             sb.append("    }\r\n");
 600             
 601             sb.append("    public " + modelClz + " find" + modelClz
 602                     + "ByMap(Map  map){\r\n");
 603             sb.append("        return " + daoVar + ".find" + modelClz
 604                     + "ByMap(map);\r\n");
 605             sb.append("    }\r\n");
 606             
 607             if (this.primaryKeys != null && this.primaryKeys.length > 0) {
 608                 sb.append("    public " + modelClz + " find" + modelClz + "ById(");
 609                 String str = "";
 610                 for (int i = 0; i < this.primaryKeys.length; i++) {
 611                     if (i > 0) {
 612                         sb.append(",");
 613                         str += ",";
 614                     }
 615                     String javaName = this.sql2JavaName(this.primaryKeys[i]);
 616                     sb.append("Object " + javaName);
 617                     str += javaName;
 618                 }
 619                 sb.append("){\r\n");
 620                 sb.append("        return " + daoVar + ".find" + modelClz + "ById("
 621                         + str + ");\r\n");
 622                 sb.append("    }\r\n");
 623             }
 624             
 625             sb.append("    public void set" + modelClz + "Dao(" + modelClz
 626                     + "Dao dao){\r\n");
 627             sb.append("        this." + daoVar + "=dao;\r\n");
 628             sb.append("    }\r\n\r\n");
 629             
 630             sb.append("\r\n\r\n");
 631             sb.append("}");
 632             File file = new File(fileName);
 633             osw = new OutputStreamWriter(
 634                     new FileOutputStream(file), this.charset);
 635             osw.write(sb.toString());
 636             osw.flush();
 637             
 638         } catch (Exception e) {
 639             // TODO Auto-generated catch block
 640             e.printStackTrace();
 641         }finally{
 642             try {
 643                 osw.close();
 644             } catch (IOException e) {
 645                 // TODO Auto-generated catch block
 646                 e.printStackTrace();
 647             }
 648         }
 649     }
 650 
 651     private String streamToByteFunction() {
 652         StringBuilder sb = new StringBuilder();
 653         sb.append("\r\n\r\n    private byte[] streamToByte(java.io.InputStream is) {\r\n");
 654         sb.append("        try {\r\n");
 655         sb.append("            java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(4096);\r\n");
 656         sb.append("            byte[] buf = new byte[1024];\r\n");
 657         sb.append("            int len = 0;\r\n");
 658         sb.append("            while ((len = is.read(buf)) > 0) {\r\n");
 659         sb.append("                bos.write(buf, 0, len);\r\n");
 660         sb.append("            }\r\n");
 661         sb.append("            byte[] data = bos.toByteArray();\r\n");
 662         sb.append("            is.close();\r\n");
 663         sb.append("            return data;\r\n");
 664         sb.append("        } catch (Exception e) {\r\n");
 665         sb.append("            throw new RuntimeException(\r\n");
 666         sb.append("                    \"unkown type******:\", e);\r\n");
 667         sb.append("        }\r\n");
 668         sb.append("    }\r\n");
 669         return sb.toString();
 670     }
 671 
 672     private String createGetObjectFunction(String javaName) {
 673         StringBuilder sb = new StringBuilder();
 674         sb.append("\r\n\r\n    public byte[] " + this.toMethod(javaName, "get")
 675                 + "() {\r\n");
 676         sb.append("        if (this." + javaName + " == null)\r\n");
 677         sb.append("            return null;\r\n");
 678         sb.append("        if (this." + javaName + " instanceof byte[]) {\r\n");
 679         sb.append("            return (byte[]) this." + javaName + ";\r\n");
 680         sb.append("        }\r\n");
 681         sb.append("        if (this." + javaName
 682                 + " instanceof oracle.sql.BLOB) {\r\n");
 683         sb.append("            try {\r\n");
 684         sb.append("                return streamToByte(((oracle.sql.BLOB) this." + javaName
 685                 + ").getBinaryStream());\r\n");
 686         sb.append("            } catch (java.sql.SQLException e) {\r\n");
 687         sb.append("                throw new RuntimeException(\r\n");
 688         sb.append("                        \"getBinaryStream() SQLException occured!!!!\", e);\r\n");
 689         sb.append("            }\r\n");
 690         sb.append("        } else if (this." + javaName
 691                 + " instanceof oracle.sql.CLOB) {\r\n");
 692         sb.append("            try {\r\n");
 693         sb.append("                return streamToByte(((oracle.sql.CLOB) this." + javaName
 694                 + ").getAsciiStream());\r\n");
 695         sb.append("            } catch (java.sql.SQLException e) {\r\n");
 696         sb.append("                throw new RuntimeException(\r\n");
 697         sb.append("                        \"getAsciiStream() SQLException occured!!!!\", e);\r\n");
 698         sb.append("            }\r\n");
 699         sb.append("        }\r\n");
 700         sb.append("        else {\r\n");
 701         sb.append("            throw new RuntimeException(\"unkown type:\" + this."
 702                 + javaName + ".getClass());\r\n");
 703         sb.append("        }\r\n");
 704         sb.append("    }\r\n");
 705         return sb.toString();
 706     }
 707 
 708     private String createSetObjectFunction(String javaName) {
 709         StringBuilder sb = new StringBuilder();
 710         sb.append("\r\n\r\n    public void " + this.toMethod(javaName, "set")
 711                 + "(Object data) {\r\n");
 712         sb.append("        if (data == null) {\r\n");
 713         sb.append("            this." + javaName + " = null;\r\n");
 714         sb.append("            return;\r\n");
 715         sb.append("        }\r\n");
 716         sb.append("        if (data instanceof oracle.sql.BLOB) {\r\n");
 717         sb.append("            this." + javaName + " = (oracle.sql.BLOB) data;\r\n");
 718         sb.append("        } else if (data instanceof byte[]) {\r\n");
 719         sb.append("            this." + javaName + " = (byte[]) data;\r\n");
 720         sb.append("        } else if (data instanceof oracle.sql.CLOB) {\r\n");
 721         sb.append("            this." + javaName + " = (oracle.sql.CLOB) data;\r\n");
 722         sb.append("        } else\r\n");
 723         sb.append("            throw new RuntimeException(\r\n");
 724         sb.append("                    \"BankCert.setContent(Object data):unknow data type!!!\"\r\n");
 725         sb.append("                            + data.getClass());\r\n");
 726         sb.append("    }\r\n");
 727         return sb.toString();
 728     }
 729 
 730     private String generateJavaModel(String packageName, String className) {
 731         if (packageName == null || packageName.trim().equals("")
 732                 || className == null || className.trim().equals("")) {
 733             return "java.util.HashMap";
 734         }
 735         String clz = packageName + "." + className;
 736         String pt = packageName;
 737         if (packageName.indexOf(".") > 0)
 738             pt = packageName.replace(".", File.separator);
 739         String path = srcPath + File.separator + pt;
 740         File dir = new File(path);
 741         if (!dir.exists())
 742             dir.mkdirs();
 743         String fileName = path + File.separator + className + ".java";
 744         boolean useStreamFun = false;
 745         OutputStreamWriter osw =null;
 746         try {
 747             StringBuilder sb = new StringBuilder();
 748             sb.append("package " + packageName + ";\r\n\r\n");
 749             sb.append("public class " + className + "{\r\n");
 750             StringBuilder tt = new StringBuilder();
 751             if ("AssetsDscpp".equals(className)) {
 752 
 753                 System.out.println("rsm.getColumnCount()=" + rsm.getColumnCount());
 754             }
 755             for (int i = 1; i <= rsm.getColumnCount(); i++) {
 756                 String colName = rsm.getColumnName(i);
 757                 String javaName = this.sql2JavaName(colName);
 758                 int type = rsm.getColumnType(i);
 759                 String typeName = this.toTypeName(type);
 760                 sb.append("    private " + typeName + " " + javaName + ";\r\n");
 761 
 762                 if ("Object".equals(typeName)) {
 763                     if (useStreamFun == false) {
 764                         tt.append(this.streamToByteFunction());
 765                         useStreamFun = true;
 766                     }
 767                     tt.append(this.createGetObjectFunction(javaName));
 768                     tt.append(this.createSetObjectFunction(javaName));
 769                 } else {
 770                     tt.append("\r\n    public " + typeName + " "
 771                             + this.toMethod(javaName, "get") + "( ){\r\n");
 772                     tt.append("            return " + javaName + ";\r\n");
 773                     tt.append("    }\r\n");
 774                     tt.append("    public void "
 775                             + this.toMethod(javaName, "set") + "(" + typeName
 776                             + " " + javaName + "){\r\n");
 777                     tt.append("            this." + javaName + "=" + javaName
 778                             + ";\r\n");
 779                     tt.append("    }\r\n");
 780                 }
 781             }
 782             tt.append("\r\n    public String getOrderField(){\r\n"
 783                     + "            return orderField;\r\n" + "    }\r\n");
 784             tt.append("    public void setOrderField(String orderField){\r\n"
 785                     + "            this.orderField = orderField;\r\n" + "    }\r\n");
 786             sb.append("    private String orderField;\r\n");
 787             sb.append("\r\n\r\n");
 788             sb.append(tt.toString());
 789             sb.append("}");
 790             File file = new File(fileName);
 791             osw = new OutputStreamWriter(
 792                     new FileOutputStream(file), this.charset);
 793             osw.write(sb.toString());
 794             osw.flush();
 795             
 796         } catch (Exception e) {
 797             // TODO Auto-generated catch block
 798             e.printStackTrace();
 799             return null;
 800         }finally{
 801             try {
 802                 osw.close();
 803             } catch (IOException e) {
 804                 // TODO Auto-generated catch block
 805                 e.printStackTrace();
 806             }
 807         }
 808         return clz;
 809     }
 810 
 811     private String toMethod(String javaName, String method) {
 812         String name = ("" + javaName.charAt(0)).toUpperCase()
 813                 + javaName.substring(1);
 814         return method + name;
 815     }
 816 
 817     private String toTypeName(final int t) {
 818         switch (t) {
 819         case Types.VARCHAR:
 820         case Types.CHAR:
 821             return "String";
 822         case Types.NUMERIC:
 823         case Types.INTEGER:
 824         case Types.BIGINT:
 825             return "Long";
 826         case Types.BIT:
 827         case Types.SMALLINT:
 828         case Types.TINYINT:
 829             return "Integer";
 830         case Types.REAL:
 831         case Types.DOUBLE:
 832         case Types.FLOAT:
 833             return "Double";
 834         case Types.DATE:
 835         case Types.TIMESTAMP:
 836         case Types.TIME:
 837             return "java.util.Date";
 838         case Types.BLOB:
 839             return "Object";
 840         case Types.CLOB:
 841             return "Object";
 842         case Types.LONGVARCHAR:
 843             return "String";
 844         default:
 845             return "unknowType";
 846         }
 847     }
 848 
 849     protected String generatDeleteSql(String tableName, String namespace)
 850             throws Exception {
 851         String deleteSql = "<delete id=\"" + this.toName("delete", namespace)
 852                 + "\">";
 853         deleteSql += "\r\n delete from " + tableName;
 854         String where = "";
 855         if (this.primaryKeys != null) {
 856             for (int i = 0; i < this.primaryKeys.length; i++) {
 857                 String colName = this.primaryKeys[i];
 858                 String javaName = this.sql2JavaName(colName);
 859                 if (i > 0)
 860                     where += " and ";
 861                 where += colName + "=#" + javaName + "#";
 862             }
 863         }
 864         for (int i = 1; i <= rsm.getColumnCount(); i++) {
 865             String colName = rsm.getColumnName(i);
 866             // String type = rsm.getColumnTypeName(i);
 867             String javaName = this.sql2JavaName(colName);
 868             if (where.equals("") && i == 1) {
 869                 where += colName + "=#" + javaName + "#";
 870             }
 871         }
 872         deleteSql += "\r\nwhere " + where;
 873         deleteSql += "\r\n</delete>\r\n";
 874         return deleteSql;
 875 
 876     }
 877 
 878     protected String generatUpdateSql(String tableName, String namespace)
 879             throws Exception {
 880         String updateSql = "<update id=\"" + this.toName("update", namespace)
 881                 + "\">";
 882         updateSql += "\r\n update " + tableName + " \r\n";
 883         String where = "";
 884         if (this.primaryKeys != null) {
 885             for (int i = 0; i < this.primaryKeys.length; i++) {
 886                 String colName = this.primaryKeys[i];
 887                 String javaName = this.sql2JavaName(colName);
 888                 if (i > 0)
 889                     where += " and ";
 890                 where += colName + "=#" + javaName + "#";
 891             }
 892         }
 893         for (int i = 1; i <= rsm.getColumnCount(); i++) {
 894             String colName = rsm.getColumnName(i);
 895             // String type = rsm.getColumnTypeName(i);
 896             String javaName = this.sql2JavaName(colName);
 897             int type = rsm.getColumnType(i);
 898             String typeName = this.toTypeName(type);
 899             if (i == 1) {
 900                 updateSql += " <dynamic prepend=\"set\">  ";
 901             } else if (!this.isPrimaryKey(colName) && i > 1) {
 902                 if ("Object".equals(typeName)) {
 903                     updateSql += "\r\n <isNotEmpty prepend=\",\" property=\""
 904                             + javaName
 905                             + "\">"
 906                             + "\r\n    "
 907                             + colName
 908                             + "=#"
 909                             + javaName
 910                             + ",handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler# \r\n </isNotEmpty>";
 911                 } else {
 912                     updateSql += "\r\n <isNotEmpty prepend=\",\" property=\""
 913                             + javaName + "\">" + "\r\n    " + colName + "=#"
 914                             + javaName + "# \r\n </isNotEmpty>";
 915                 }
 916             }
 917             if (where.equals("") && i == 1) {
 918                 where += colName + "=#" + javaName + "#";
 919             }
 920         }
 921         updateSql += "\r\n </dynamic>\r\nwhere " + where;
 922         updateSql += "\r\n</update>\r\n";
 923         return updateSql;
 924     }
 925 
 926     protected String generatInsertSql(String tableName, String namespace)
 927             throws Exception {
 928         String insertSql = "<insert id=\"" + this.toName("insert", namespace)
 929                 + "\">";
 930         insertSql += "\r\n insert into " + tableName + "(";
 931         String values = "";
 932 
 933         String pkName = "";
 934         if (this.primaryKeys != null) {
 935             for (int i = 0; i < this.primaryKeys.length; i++) {
 936                 String colName = this.primaryKeys[i];
 937                 String javaName = this.sql2JavaName(colName);
 938                 pkName = javaName;
 939                 if (i > 0) {
 940                     insertSql += ",";
 941                     values += ",";
 942                 }
 943                 insertSql += colName;
 944                 values += "#" + javaName + "#";
 945             }
 946         }
 947 
 948         String pkType = "string";
 949 
 950         for (int i = 1; i <= rsm.getColumnCount(); i++) {
 951             String colName = rsm.getColumnName(i);
 952             // String type = rsm.getColumnTypeName(i);
 953             String javaName = this.sql2JavaName(colName);
 954             int type = rsm.getColumnType(i);
 955             String typeName = this.toTypeName(type);
 956             if (!this.isPrimaryKey(colName)) {
 957                 insertSql += "\r\n <isNotEmpty prepend=\",\" property=\""
 958                         + javaName + "\">" + "\r\n    " + colName
 959                         + "\r\n </isNotEmpty>";
 960                 if ("Object".equals(typeName)) {
 961                     values += "\r\n <isNotEmpty prepend=\",\" property=\""
 962                             + javaName
 963                             + "\">"
 964                             + "\r\n    #"
 965                             + javaName
 966                             + ",handler=org.springframework.orm.ibatis.support.BlobByteArrayTypeHandler# \r\n </isNotEmpty>";
 967                 } else {
 968                     values += "\r\n <isNotEmpty prepend=\",\" property=\""
 969                             + javaName + "\">" + "\r\n    #" + javaName
 970                             + "# \r\n </isNotEmpty>";
 971                 }
 972             } else {
 973                 pkType = typeName.toLowerCase();
 974             }
 975         }
 976         insertSql += ") ";
 977         insertSql += "\r\nvalues(\r\n" + values + "\r\n)";
 978         insertSql += "\r\n<selectKey resultClass=\"" + pkType
 979                 + "\"  keyProperty=\"" + pkName
 980                 + "\" >  SELECT last_insert_id() as " + pkName
 981                 + " ;</selectKey>\r\n";
 982         insertSql += "\r\n</insert>\r\n";
 983         return insertSql;
 984 
 985     }
 986 
 987     protected String generatSelectSql(String tableName, String namespace,
 988             String parameterClass, String resultClass, String strId)
 989             throws Exception {
 990         String selectSql = "<select id=\""
 991                 + this.toName("query" + strId, namespace)
 992                 + "\" parameterClass=\"" + parameterClass + "\" resultClass=\""
 993                 + resultClass + "\" >";
 994         selectSql += "\r\nselect ";
 995         String where = "";
 996         if (this.primaryKeys != null) {
 997             for (int i = 0; i < this.primaryKeys.length; i++) {
 998                 String colName = this.primaryKeys[i];
 999                 String javaName = this.sql2JavaName(colName);
1000                 colName = "t." + colName;
1001                 where += "\r\n <isNotEmpty prepend=\"and\" property=\""
1002                         + javaName + "\">" + "\r\n     " + colName + "=#"
1003                         + javaName + "#" + "\r\n </isNotEmpty>";
1004             }
1005         }
1006         for (int i = 1; i <= rsm.getColumnCount(); i++) {
1007             String colName = rsm.getColumnName(i);
1008             String cname = colName;
1009             // String type = rsm.getColumnTypeName(i);
1010             String javaName = this.sql2JavaName(colName);
1011             colName = "t." + colName;
1012             if (i > 1)
1013                 selectSql += ",";
1014             if (i % 4 == 0)
1015                 selectSql += "\r\n";
1016             selectSql += colName + " as \"" + javaName + "\"";
1017             if (!this.isPrimaryKey(cname)) {
1018                 where += "\r\n <isNotEmpty prepend=\"and\" property=\""
1019                         + javaName + "\">" + "\r\n     " + colName + "=#"
1020                         + javaName + "#" + "\r\n </isNotEmpty>";
1021             }
1022         }
1023         selectSql += "\r\n from " + tableName + " t ";
1024         selectSql += "\r\n where 1=1";
1025         selectSql += where;
1026         selectSql += "\r\n<isEmpty prepend=\"order by\" property=\"orderField\">";
1027         selectSql += "\r\n t." + rsm.getColumnName(1) + " desc";
1028         selectSql += "\r\n </isEmpty>";
1029         selectSql += "\r\n<isNotEmpty prepend=\"order by\" property=\"orderField\">";
1030         selectSql += "\r\n $orderField$";
1031         selectSql += "\r\n </isNotEmpty>";
1032         selectSql += "\r\n</select>\r\n";
1033         return selectSql;
1034 
1035     }
1036 
1037     private boolean isPrimaryKey(String colName) {
1038         if (this.primaryKeys == null)
1039             return false;
1040         for (int i = 0; i < this.primaryKeys.length; i++) {
1041             if (this.primaryKeys[i].equalsIgnoreCase(colName)) {
1042                 return true;
1043             }
1044         }
1045         return false;
1046     }
1047 
1048     private String toName(String operation, String namespace) {
1049         String first = "" + namespace.charAt(0);
1050         String left = namespace.substring(1);
1051         String str = operation + first.toUpperCase() + left;
1052         return str;
1053     }
1054 
1055     private String java2sqlName(Object obj) {
1056         if (obj == null)
1057             return null;
1058         String s = obj.toString();
1059         StringBuffer sqlBuffer = new StringBuffer(s.length() * 2);
1060         for (int i = 0; i < s.length(); i++) {
1061             if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z')
1062                 sqlBuffer.append('_');
1063             sqlBuffer.append(s.charAt(i));
1064         }
1065         return sqlBuffer.toString().toLowerCase();
1066     }
1067 
1068     private String sql2JavaName(Object obj) {
1069         if (obj == null)
1070             return null;
1071         String s = obj.toString();
1072         if(s.equals("assets_id")){
1073             
1074             return "assetsId";
1075         }
1076         if(s.contains("_")) {
1077             String[] split = s.split("_");
1078             for(int j=1;j<split.length;j++) {
1079                 split[j]=split[j].substring(0, 1).toUpperCase() + split[j].substring(1);                        
1080             }
1081             StringBuffer tString=new StringBuffer();
1082             for(int k=0;k<split.length;k++) {
1083                 tString.append(split[k]);
1084             }
1085             s=tString.toString();
1086             System.out.println(s);
1087         }
1088         
1089         
1090         StringBuffer strBuffer = new StringBuffer(s.length());
1091         boolean bf = false;
1092         for (int i = 0; i < s.length(); i++) {
1093             /* if (s.charAt(i) == '_') {
1094                 bf = true;
1095                 continue;
1096             }  //wanghao 注释 用于CRM产品字段的生成
1097             if (bf) {
1098                 strBuffer.append(Character.toUpperCase(s.charAt(i)));
1099                 bf = false;
1100             } 
1101             else {
1102                 //strBuffer.append(Character.toLowerCase(s.charAt(i)));//----by wanghao
1103                 strBuffer.append(s.charAt(i));
1104             }*/
1105             strBuffer.append(s.charAt(i));
1106         }
1107         return strBuffer.toString();
1108     }
1109     
1110     private StringBuffer StringBuffer(String s) {
1111         // TODO Auto-generated method stub
1112         return null;
1113     }
1114 
1115     private String getModeClassName(Object obj) {
1116         if (obj == null)
1117             return null;
1118         String s = obj.toString();
1119         StringBuffer strBuffer = new StringBuffer(s.length());
1120         boolean bf = false;
1121         for (int i = 0; i < s.length(); i++) {
1122             if (s.charAt(i) == '_') {
1123                 bf = true;
1124                 continue;
1125             }
1126             if (bf) {
1127                 strBuffer.append(Character.toUpperCase(s.charAt(i)));
1128                 bf = false;
1129             } 
1130             else {
1131                 //strBuffer.append(Character.toLowerCase(s.charAt(i)));//----by wanghao
1132                 strBuffer.append(s.charAt(i));
1133             }
1134             //strBuffer.append(s.charAt(i));
1135         }
1136         return strBuffer.toString();
1137     }
1138 }

 

六,主方法类

 1 package com.bill99.boss.code;
 2 
 3 import com.bill99.boss.code.DataSourceConfig;
 4 import com.bill99.boss.code.SqlMapXMLGeneratorIbatis;
 5 
 6 public class CodeGenerator {
 7     public static void main(String[] args) {
 8         System.err.println("COE单表操作 JAR结构后端代码生成开始................");
 9         System.err.println("");
10         DataSourceConfig c = new DataSourceConfig();
11         c.setDriverClass("com.mysql.jdbc.Driver");
12         c.setJdbcUrl("jdbc:mysql://****:3306/库命?useUnicode\\=true&characterEncoding\\=utf-8");
13         c.setUserId("root");
14         c.setPassword("111111");
15         SqlMapXMLGeneratorIbatis ibatis = new SqlMapXMLGeneratorIbatis(c);
16         //数据库实例名    表名    项目JAR的根目录
17         ibatis.generateSql("org", "t_assets_backup","D:\\nixianggongcheng");
18         System.err.println("");
19         System.err.println("COE单表操作后端代码自动生成结束................");
20         
21     }
22 }

 

七,用到的jar包

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <ivy-module version="1.0">
 3     <info organisation="com.99bill" module="app-coe-boss-mdp"/>
 4     <configurations>
 5         <conf name="default"/>
 6         <conf name="compile"/>
 7         <conf name="zip"/>
 8         <conf name="test"/>
 9     </configurations>
10     <publications>
11         <artifact ext="war"/>
12     </publications>
13     <dependencies>
14         <dependency org="com.ibatis" name="mybatis" rev="2.3.5" conf="zip->default"/>
15         <dependency org="net.sf" name="cglib" rev="2.1_3" conf="zip->default"/>
16         <dependency org="oracle" name="ojdbc" rev="1.4" conf="zip->default"/>
17         <dependency org="org.apache" name="commons-logging" rev="1.1.1.2" conf="zip->default"/>
18         <dependency org="org.apache" name="log4j" rev="1.2.14" conf="compile->default"/>
19         <dependency org="org.objectweb" name="asm" rev="1.5.3" conf="zip->default"/>
20         <dependency org="org.spring" name="spring" rev="2.5.5" conf="zip->default"/>
21         <dependency org="unknown" name="c3p0" rev="0.9.1.2" conf="zip->default"/>
22         <dependency org="com.99bill" name="if-orm-ibatis" rev="4.3.54.5" conf="zip->default"/>
23         <dependency org="org.dom4j" name="dom4j" rev="1.6.1" conf="zip->default"/>
24         <dependency org="mysql" name="mysql-connector-java" rev="5.1.12" conf="zip->default"/>
25     </dependencies>
26 </ivy-module>

 

八,生成代码案例

用法就是只要修改红色的地方的代码就行了。。。。

祥见附件

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值