假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过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个特殊字符,其中必须转换的是'&'和'<',这里会全部转换5个特殊字符: 377 * <ul> 378 * <li>& - 与符号转换成&amp;</li> 379 * <li>< - 小于号转换成&lt;</li> 380 * <li>> - 大于号转换成&gt;</li> 381 * <li>" - 双引号转换成&quot;</li> 382 * <li>' - 单引号转换成&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("&"); 399 break; 400 case '<': 401 sb.append("<"); 402 break; 403 case '\"': 404 sb.append("""); 405 break; 406 case '\'': 407 sb.append("'"); 408 break; 409 case '>': 410 sb.append(">"); 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>
八,生成代码案例
用法就是只要修改红色的地方的代码就行了。。。。
祥见附件