说起来倒是挺简单的,就是听着名字感觉挺高大上。逆向工程方式有很多,比如mybatis就提供了一个这样的工具mybatis-genderator,这个我反正是没用过只是听说过,以前在公司都是用公司写好的的工具,最近也是闲的无聊自己动手写了一个。

我的这个工程师基于spring和mybatis写的,有兴趣的加上spring-mvc,加个页面也是不错的。

其实呢使用mybatis做逆向工程很简单就是两个select查询就好了,数据库底子好的童鞋们应该记得一下这两个查询语句的(不记得也没关系,可以学嘛):

  1. 查询库中的所有表: select * from information_schema.TABLES where TABLE_SCHEMA=(select database())

  2.查询表中的所有字段信息: select * from information_schema.COLUMNS where TABLE_SCHEMA = (select database()) and TABLE_NAME=#{tableName}

对于第一条sql来说查询那个库就连接哪个就行了,不需要传参数。但是第二条sql需要将表名传进去的(这也是无可厚非的)

必不可少的我们是需要数据库的4大连接参数,凡是和数据库挂钩应该都需要这几个玩意(这声明一下我这里是用的MySQL)。其他的配置文件上的事情我就不多说了。今天重点不在这里

接下来简单的将dao、service层贴出来了,和平时的web结构一样很简单。

service层

service实现类

接下来就是今天的重点了。其实也很简单,可能很多人都已经想到了,我们都已经获取到了表字段信息了,那么我们只需要一个文件流不就可以了?(嗯,没错,大兄弟,反正我就是这么写的)

其实我的这个很简单,主要围绕一个stringbuffer进行,先拼接到字符串中,然后用流写到文件中。下边我粘一下我的代码吧。

  1. package com.ml.code.one.codegenerator.util;
  2.  
  3. import com.ml.code.one.codegenerator.myservice.MyCodeService;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6.  
  7. import java.io.File;
  8. import java.io.FileWriter;
  9. import java.io.IOException;
  10. import java.util.Iterator;
  11. import java.util.List;
  12. import java.util.Map;
  13.  
  14. @Component
  15. public class CodeGenerator {
  16. @Autowired
  17. private MyCodeService service;
  18.  
  19. public void codeGenerator(String tableName,String path){
  20. List<Map> columns = service.listColumn(tableName);//查询所有的表字段信息
  21. String className = getClassName(tableName);
  22. StringBuffer sb = new StringBuffer();
  23. sb.append("package "+getPackageName(path)+";\n");
  24. sb.append("import java.io.Serializable;"+"\n");
  25. sb.append("import java.util.*;\n");
  26. sb.append("import java.lang.*;\n");
  27. sb.append("import lombok.Data;\n");
  28. sb.append("import lombok.ToString;\n\n");
  29. sb.append("@Data\n@ToString\n");
  30. sb.append("public class "+className+" implements Serializable {\n");
  31. sb.append("\tprivate static final long serialVersionUID = 1L;\n\n");
  32. //获取字段信息
  33. Iterator<Map> iterator = columns.iterator();
  34. while (iterator.hasNext()){
  35. Map next = iterator.next();
  36. Object dataType = next.get("DATA_TYPE");//获取数据类型
  37. String type = classCast(dataType);//数据类型
  38. Object property = next.get("COLUMN_NAME");//获取字段名称
  39. String propertity = getPropertity(property);//属性名称
  40. Object annotation = next.get("COLUMN_COMMENT");//注解
  41. sb.append("\tprivate "+type+" "+propertity+";"+"//"+(String)annotation+"\n");
  42. }
  43. sb.append("}");
  44. //拼接结束
  45.  
  46. //生成文件
  47. try {
  48. //生成java文件
  49. getFile(className,sb.toString(),path);
  50. //生成mapper.xml
  51. // getMapperFile(className,path);
  52. } catch (IOException e) {
  53. e.printStackTrace();
  54. }
  55. }
  56.  
  57. /**
  58. * 生成类名
  59. * @param tableName 表名
  60. * @return
  61. */
  62. private String getClassName(String tableName){
  63. String newClassName="";
  64. int i = tableName.indexOf("_");
  65. if (i<0){//没有下划线
  66. newClassName = tableName.substring(0, 1).toUpperCase() + tableName.substring(1)+"Po";
  67. }else{//有下划线
  68. String[] strs = tableName.split("_");
  69. StringBuffer sb = new StringBuffer();
  70. for (int m = 0; m<strs.length; m++){
  71. sb.append(strs[m].substring(0, 1).toUpperCase() + strs[m].substring(1));
  72. }
  73. newClassName=sb.toString()+"Po";
  74. }
  75. return newClassName;
  76. }
  77. //生成属性java类型
  78. private String classCast(Object obj){
  79. String type="";
  80. String str=(String)obj;
  81. if (str.equals("varchar")||str.equals("char")||str.equals("text")){
  82. type="String";
  83. }else if (str.equals("int")){
  84. type="Integer";
  85. }else if (str.equals("bigint")){
  86. type="Long";
  87. }else if (str.equals("double")||str.equals("float")){
  88. type="Double";
  89. }else if (str.equals("date")||str.equals("datetime")||str.equals("timestamp")){
  90. type="Date";
  91. }else {
  92. type="String";
  93. }
  94. return type;
  95. }
  96. //数据库字段名字转java属性名字
  97. private String getPropertity(Object obj){
  98. String pro="";
  99. String colum=(String)obj;
  100. int index = colum.indexOf("_");//判断是否存在下划线
  101. if (index<0){//没有下划线
  102. pro=colum.substring(0,1).toLowerCase()+colum.substring(1);//首字母小写
  103. }else {//有下划线
  104. StringBuilder sb = new StringBuilder();
  105. String[] colums = colum.split("_");
  106. for (int i = 0; i<colums.length; i++){
  107. if (i==0){
  108. sb.append(colums[i].substring(0,1).toLowerCase()+colums[i].substring(1));//拼接第一个,并将首字母小写
  109. }else{
  110. sb.append(colums[i].substring(0,1).toUpperCase()+colums[i].substring(1));//除了第一个都将首字母大写
  111. }
  112. }
  113. pro=sb.toString();
  114. }
  115.  
  116. return pro;
  117. }
  118.  
  119. /**
  120. * 生成包名
  121. */
  122. private String getPackageName(String path){
  123. int index = path.indexOf("java\\");
  124. String newPackage="";
  125. if (index>0){
  126. String substring = path.substring(index+5);
  127. newPackage = substring.replace("\\", ".");
  128. }
  129. return newPackage;
  130. }
  131.  
  132. /**
  133. * 生成文件
  134. * @param fileName 文件名
  135. * @param info 要写入的内容
  136. * @throws IOException
  137. */
  138. private void getFile(String fileName,String info,String path) throws IOException {
  139. //生成文件
  140. File file = new File(path+"\\"+fileName+".java");
  141. if (!file.exists()){
  142. file.createNewFile();
  143. }
  144. FileWriter writer = new FileWriter(file);
  145. writer.write(info);
  146. writer.flush();
  147. writer.close();
  148. }
  149.  
  150. /**
  151. * 生成Mapper.xml
  152. * @param poName
  153. */
  154. private void getMapperFile(String poName,String path) throws IOException {
  155. //获取文件名
  156. StringBuilder fileName = new StringBuilder();
  157. int index = poName.indexOf("Po");
  158. if (index<0){//没有Po后缀时
  159. fileName.append(poName+"Mapper");
  160. }else{//存在Po后缀
  161. String sub = poName.substring(0, index);//截取到需要的部分
  162. fileName.append(sub+"Mapper");
  163. }
  164. //获取路径
  165. StringBuilder newPath = new StringBuilder();
  166. int main = path.indexOf("main\\");
  167. if (main>0){
  168. String substring = path.substring(0, main+5);
  169. newPath.append(substring).append("\\resources\\mapper\\");
  170. }
  171.  
  172. File file = new File(newPath+fileName.toString()+".xml");
  173. StringBuilder xmlInfo = new StringBuilder();
  174. xmlInfo.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
  175. xmlInfo.append("<!DOCTYPE mapper PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\" \n" +
  176. " \"http://mybatis.org/dtd/mybatis-3-mapper.dtd\">\n");
  177. xmlInfo.append("<mapper namespace=\"\">\n");
  178. xmlInfo.append("\n\n");
  179. xmlInfo.append("</mapper>");
  180. FileWriter fw = new FileWriter(file);
  181. fw.write(xmlInfo.toString());
  182. fw.flush();
  183. fw.close();
  184. }
  185. }

这里我用的是boot工程写的,运行的时候我选择用boot自带的test工具运行就ok了(别忘了在启动类上加上dao层的包扫描呦)

到这里呢这个简单的逆向工程就结束了,这个可以直接生成到你指定文件下,顺带连Mapper.xml也生成了的。大佬勿喷。

有需要源码的可以到以下网盘获取,(网盘中的也只是一部分,只是逆向工程部分,其他的需要你们自行补充,应该是不难的) 

补充一下,如果有用idea的我建议用idea的代码生成工具哈  下载一个插件就可以了  EasyCode,至于使用方法很简单,把你的idea连上数据库就好了,而且还可以手动配置呢

链接:https://pan.baidu.com/s/1KW7h9vro2U199hsL85Q38w
提取码:obpf

Java逆向工程(数据库表生成java类)的更多相关文章

  1. django根据已有数据库表生成model类

    django根据已有数据库表生成model类 创建一个Django项目 django-admin startproject 'xxxx' 修改setting文件,在setting里面设置你要连接的数据 ...

  2. 如何通过java反射将数据库表生成实体类?

    首先有几点声明: 1.代码是在别人的基础进行改写的: 2.大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人: 3.刚刚毕业,水平有限,肯定有许多不足之处: 4.希望刚刚学习java的同学能有 ...

  3. JDBCUtils,根据当前MySQL数据库下面的表生成java实体类

    自己简单写的JDBCUtils,可以根据当前数据库下面的表生成java实体类,代码萌新,请多多包涵. 初始化配置: //驱动程序名//不固定,根据驱动 static String driver = & ...

  4. Java 导出数据库表信息生成Word文档

    一.前言 最近看见朋友写了一个导出数据库生成word文档的业务,感觉很有意思,研究了一下,这里也拿出来与大家分享一波~ 先来看看生成的word文档效果吧 下面我们也来一起简单的实现吧 二.Java 导 ...

  5. SqlServer数据库表生成C# Model实体类SQL语句——补充

    在sql语句最前边加上  use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html   --[SQL骚操作]SqlServer数据库表生成C ...

  6. J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式

    J2EE进阶(十五)MyEclipse反向工程实现从数据库反向生成实体类之Hibernate方式   反向工程又称逆向工程.   开发项目涉及到的表太多,一个一个的写JAVA实体类很是费事.MyEcl ...

  7. MyEclipse从数据库反向生成实体类之Hibernate方式 反向工程

    前文: hibernate带给我们的O/RMapping思想是很正确的,即从面相对象的角度来设计工程中的实体对象,建立pojo,然后在编写hbm.xml映射文件来生成数据表.但是在实际开发中,往往我们 ...

  8. MyEclipse数据库反向生成实体类

    MyEclipse数据库反向生成实体类 “计应134(实验班) 凌豪” 当我们在开发项目涉及到的表太多时,一个一个的写JAVA实体类很是费事.然而强大的MyEclipse为我们提供简便的方法:数据库反 ...

  9. 由数据库表生成jpa实体工具

    package cn.net.yto.aaa.dao.generator; /** * 由数据库表生成jpa实体工具 * * @author huike * Created by gf.liu on ...

随机推荐

  1. eclipse默认的WebContent目录修改为webRoot

    从网上下载了个Java Web项目,导入Eclipse后在Tomcat中发布,发现在Tomcat的Webapps目录下没有JSP页面 到项目中去看才发现有两个目录,一个WebContent,一个Web ...

  2. windows更新系统系统时无法更新

    win7系统显示“windows update当前无法检查更新,因为未运行服务,您可能需要重新启动计算机” 解决方法 1.win+r打开运行窗口,输入CMD 2.在dos窗口中输入命令“net sto ...

  3. OpenMP笔记(三)

    个人博客地址:http://www.bearoom.xyz/2019/02/21/openmp3/ 这一部分主要记录一些指令的使用. 一.parallel的使用 parallel是用于构造并行块的,也 ...

  4. C#-类型转换和引用转换

    对象的引用可以被: 隐式地向上转换 显示的向下转换 向上转换 向上转换是指一个从一个基类指向一个子类: House house = new House(); Asset asset = house; ...

  5. MBProgressHUD覆盖键盘

    发送消息的时候,需要用MBProgressHUD来覆盖窗口等待发送成功,但是无论如何键盘都覆盖不上. 于是各种研究,添加到view,添加到window,都无果..想破了脑子,总觉得加到window都覆 ...

  6. 快速dns推荐

    中国互联网络中心:1.2.4.8.210.2.4.8.101.226.4.6(电信及移动).123.125.81.6(联通) 阿里DNS:223.5.5.5.223.6.6.6 googleDNS:8 ...

  7. F5负载均衡综合实例详解(转)

    转载自:https://blog.csdn.net/weixin_43089453/article/details/87937994  女程序员就不脱发了吗来源于:<网络运维与管理>201 ...

  8. 【MySQL优化】数据库结构优化

    原则: 设计表结构,字段类型,最小化磁盘存储的空间,减少IO.数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面.所以尽可能减少 IO 读写量,可 ...

  9. 吴裕雄--天生自然 JAVA开发学习:流(Stream)、文件(File)和IO

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //使用 BufferedReader 在控制台读取 ...

  10. ae基础二

    纯色文本操作快捷键:选中图层点击快捷键(变换)锚点:a(调节中心点)位置:p(左右移动)(利用位置k帧做动画)缩放:s(水平翻转垂直翻转)旋转:r(围绕中心点(锚点)进行旋转)不透明度:tu选中索引 ...