一、 简介

1.1前言

1.2作用

二、 实现方式与原理

2.1实现方式

2.2原理

三、 体系与图解

3.1创建表与插数据脚本

3.2添加或修改表脚本

3.3删除表脚本

3.4删除与创建索引脚本

3.5删除与创建序列脚本

3.6删除与创建存储过程脚本

3.7删除与创建视图脚本

四、 开发环境与工具

4.1Nexu中央仓库

4.2 Eclipse

4.3 Tomcat

4.4 JDK

4.5Maven

4.6ER-Ermaster

五、 使用技术体系实现

5.1前端UI

5.1.1 BootStrap

5.1.2 Font Awesome

5.1.3 jQuery

5.1.4 jQuery高亮插件

5.2.5 LayerUI与jBox弹窗技术

5.2.6 colResizable拖拽插件

5.2.7 bumpyText插件

5.2框架与技术

5.2.1 Servlet3.x

5.2.2 SpringMVC

5.2.3 ORM

5.2.4 POI与JXL

5.2.5 JSON

六、 代码实现与效果

6.1Servlet3.x+jdbc实现

6.1.1Pojo

6.1.2Service

6.1.3Util

6.1.4Controler

6.1.5其他说明

6.1.6效果

6.2SpringMVC+JdbcTemplate实现

6.2.1Pojo

6.2.2Service

6.2.3DAO

6.2.4Controler

6.2.5前端技术

6.2.6JXL实现

6.2.7Util底层封装代码

6.2.8其他说明

6.2.9功能与效果

七、 个人总结

7.1为什么要总结

7.2为什么记录笔记

7.3其他说明

一、简介

1.1前言 
     
1、由于最近工作一直用Oracle,故对Oracle数据库研究为对象。
    
2、根据工作业务需求实际情况进行功能研发。为什么要开发呢?因为在数据库升级或者迁移的时候,为了保证不同环境不同数据库数据保持同步,故数据库SQL脚本非常作用。比如:数据库主脚本,副脚本,增量脚本。

3、 什么是主脚本、副脚本、增量脚本呢?

3.1、主脚本指数据库表或存储过程,视图脚本,序列等脚本。

3.2、副脚本指必须执行主脚本之后才执行的脚本。换句话说在没执行主键脚本的情况下,副脚本执行之后会回滚事务失败。

3.3、增量脚本指在执行主脚本或副脚本之后,根据需求对某个表添加/修改约束(主外键约束,长度约束等),添加/修改字段/添加数据等情况对数据库结构改变处理的一种行为脚本。

1.2作用
1、 快速产出自定义规则需要的SQL脚本。

2、减少人工编写SQL脚本出错率问题,完全通过程序检测SQL准确性。

3、帮助开发人员提高SQL编写效率,减少人工编写SQL开发成本问题。

4、帮助开发人员节约时间,同时避免繁琐不必要编写SQL的工作。

二、实现方式与原理

2.1实现方式
1、实现方式分:正向与逆向实现。什么是正向与逆行呢【是否有鸡还是有蛋,先后道理同等】

2、正向方式:首先把设计好数据库表文档,把所有表的字段属性配置到EXCEL或者CSV格式的文件通过JXL/POI技术去读取文件的字段,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。

3、逆向方式:首先有数据库表,然后通过ORM持久化技术连接数据库再读取表的字段等属性出来,再通过其他技术一系列程序处理之后生成所需要的SQL脚本。

2.2原理

对数据库软件内置核心表或视图查询出来存储用户行为表结构所有属性信息,对此属性结构信息进行分析与组装所需要SQL脚本。

三、体系与图解


 

3.1创建表与插数据脚本

3.2添加或修改表脚本

3.3删除表脚本

3.4删除与创建索引脚本

3.5删除与创建序列脚本

3.6删除与创建存储过程脚本


3.7删除与创建视图脚本

四、开发环境与工具
4.1Nexu中央仓库
   Nexus 是Maven仓库管理器,如果你使用Maven,你可以从Maven中央仓库 下载所需要的构件(artifact),但这通常不是一个好的做法,你应该在本地架设一
个Maven仓库服务器,在代理远程仓库的同时维护本地仓库,以节省带宽和时间,Nexus就可以满足这样的需要。此外,他还提供了强大的仓库管理功能,构件搜
索功能,它基于REST,友好的UI是一个extjs的REST客户端,它占用较少的内存,基于简单文件系统而非数据库。这些优点使其日趋成为最流行的Maven仓库管理器。

官方网:http://www.sonatype.org/nexus/ 
学习博客:http://blog.csdn.net/wang379275614/article/details/43940259

4.2 Eclipse
Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了
一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
   
  官方网:http://www.eclipse.org/downloads/

4.3 Tomcat
   Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun
的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet2.4和JSP2.0规范。因为Tomcat 技术先进、性能稳定,而且免费,因而
深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
  Tomcat服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的
首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat
部分是Apache服务器的扩展,但它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。诀窍是,当配置正确时,Apache 为HTML页
面服务,而Tomcat 实际上运行JSP页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器
是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0

官方网:http://tomcat.apache.org/

4.4 JDK
JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库

官方网:http://www.oracle.com/technetwork/java/javase/downloads/index.html

4.5Maven
    Apache Maven是一个软件项目管理和理解工具。 基于项目对象模型(POM)的概念,Maven可以从中央信息管理项目的构建,报告和文档。

官方网:http://maven.apache.org/
学习博客:
  https://yq.aliyun.com/articles/28591  
  http://www.yiibai.com/maven/maven_project_documents.html

4.6ER-Ermaster
ERMaster是一个用于设计ER模型图的Eclipse插件。提供的功能包括:从数据库导入关系生成ER图,导出设计图,导出DDL数据定义语句等,详细教程请看
   
官方网:http://ermaster.sourceforge.net/

五、使用技术体系实现

5.1前端UI
5.1.1 BootStrap

BootStrap,来自 Twitter,是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS
语言Less写成。Bootstrap一经推出后颇受欢迎,一直是GitHub上的热门开源项目,包括NASA的MSNBC(微软全国广播公司)的Breaking News都使
用了该项目。国内一些移动开发者较为熟悉的框架,如WeX5前端开源框架等,也是基于Bootstrap源码进行性能优化而来。

官方网: http://www.bootcss.com/ 
BootStrap图标:http://v3.bootcss.com/components/

5.1.2 Font Awesome
   Font Awesome为您提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小、颜色、阴影或者其它任何支持的效果。

官方网:http://fontawesome.dashgame.com/

5.1.3 jQuery
jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)jQuery设计的宗旨是“write Less,Do More”,
即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
jQuery的核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制
和丰富的插件。jQuery兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等

官方网: http://jquery.com/

5.1.4 jQuery高亮插件
   一款优秀的JavaScript代码高亮插件,将会帮助你渲染任何一种编程语言,包括一些关键字的着色,以及每行代码的缩进等,非常有效地帮你实现在网页上的代码编辑和展示。
在项目中我首选了SyntaxHighlighter 
  
  1、SyntaxHighlighter–最优秀的JavaScript代码高亮插件SyntaxHighlighter 是一款完全基于JavaScript的代码高亮插件,SyntaxHighlighter可以对大部分编程语言进行着色渲染,
而且代码高亮的性能也非常不错。SyntaxHighlighter 可以自定义主题文件,在初始化的时候指定自己喜欢的主题即可。 
官方网站:http://alexgorbatchev.com/SyntaxHighlighter/

2、Google Code Prettify–自由地JavaScript代码高亮插件Google Code Prettify是一款由Google推出的JavaScript代码高亮插件,Google Code Prettify可以对C/C++,Java
,Python,Ruby,PHP,VisualBasic,AWK,Bash,SQL,HTML,XML,CSS,JavaScript,Makefiles和部分Perl编程语言代码高亮着色。
官方网站:http://code.google.com/p/google-code-prettify/  下载

3、Highlight.js –多风格JavaScript代码高亮插件Highlight.js是一个用于在任何web页面上高亮着色显示各种示例源代码语法的JavaScript项目。
官方网站:https://highlightjs.org/

4. Prism.JS - 轻量级JavaScript代码高亮插件Prism.JS是目前最为轻量级的JavaScript代码高亮插件,他压缩后只有2KB的大小,Prism.JS也支持大部分流行的编程语言,并且支
持多种主题样式,开发者只需要引用CSS文件和JS文件即可完成。
官方网站:http://prismjs.com/

5、jQuery.Syntax–jQuery轻量级代码高亮插件
   这款代码高亮插件是基于jQuery的,同样也是轻量级的,渲染速度非常快。同时jQuery.Syntax还具有wordpress的插件应用,对于个人博主来说,使用wordpress和jQuery.Synt
ax可以完美实现0代买的高亮功能。

官方网站:http://www.codeotaku.com/projects/jquery-syntax/index.en

6、DlHighlight–jQuery简单高效代码高亮插件
   DlHighlight是基于JavaScript的代码高亮插件,非常简单,目前只支持JavaScript, CSS, XML, HTML。 
官方网站:http://mihai.bazon.net/projects/javascript-syntax-highlighting-engine

7、Rainbow.js – 可扩展的JavaScript代码高亮插件
   Rainbow 是JavaScript开发的语法高亮工具。被设计为轻量级(压缩后仅1.4 kb),使用简单,可扩展。语法高亮主题完全通过CSS定义。基于正则表达式实现。
官方网站:http://craig.is/making/rainbows

5.2.5 LayerUI与jBox弹窗技术
  layer是一款web弹层组件,致力于服务各个水平段的开发人员。
  
  官方网:   http://layer.layui.com/ 
           http://www.5imvc.com/scripts/jbox/jbox-demo.html

官方API:  http://layer.layui.com/api.html 
    
5.2.6 colResizable拖拽插件
   colResizable是一个jQuery插件,用于调整手动拖动HML的Table标签列。 它兼容鼠标和触摸设备,并具有一些不错的功能,如页面刷新或回发后的布局持久性。
这个插件在处理大表提高可用性时非常方便。 它的体积很小(colResizable 1.0只有2kb),它与所有主流浏览器(IE7 +,Firefox,Chrome和Opera)完全兼容。

官方网:http://www.bacubacu.com/colresizable/

5.2.7 bumpyText插件
   bumpyText一款能让文字跳舞的jQuery文字插件,鼠标划过文字即可看到效果。兼容主流浏览器!

Github: https://github.com/alexanderdickson/bumpyText

5.2框架与技术

5.2.1 Servlet3.x
     Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的
开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声
  
推荐学习博客
https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ 
http://jinnianshilongnian.iteye.com/category/255452

5.2.2 SpringMVC
     Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring
可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。而且Spring
体系非常庞大,这里不做详细描述,想继续了解和学习请到官方网。

Spring官方网 http://spring.io

推荐学习博客:http://jinnianshilongnian.iteye.com/category/231099

5.2.3 ORM
对象关系映射(英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的
数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上
发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。对象关系映射(
Object-Relational Mapping)提供了概念性的、易于理解的模型化数
据的方法。

ORM方法论基于三个核心原则: 
简单:以最基本的形式建模数据。传达性:数据库结构被任何人都能理解的语言文档化。精确性:基于数据模型创建正确标准化的结构。 
典型地,建模者通过收集来自那些熟悉应用程序但不熟练的数据建模者的人的信息开发信息模型。建模者必须能够用非技术企业专家可以理解的术语在概念层次
上与数据结构进行通讯。建模者也必须能以简单的单元分析信息,对样本数据进行处理。ORM专门被设计为改进这种联系。比如:(JDBC,JdbcTemplate,Hibernate ,Ibatis/MyBatis)等

本项目框架在3年前工作中用到JdbcTemplate在资料的时候看到oschina大牛的一篇文章,故下决心通过学习整理一个SpringMVC工程作为技术积累。

推荐博客:https://www.oschina.net/code/snippet_1245103_33821

5.2.4 POI与JXL
   简述:POI与JXL都是一个处理Excel文档的技术。个人认为:从两者的使用过程中的角度来看,JXL相对POI会轻巧,占空间内存少,Jar只有一个,上手快。
不过从知识上的支持没POI友好,实现方式没POI强大。毕竟POI是Apache下的工程项目。建议可以根据自己的情况进行选择与学习。

1、POI官方网: http://poi.apache.org/
2、JXL官方网: http://jxl.sourceforge.net/
3、入门例子:
  https://github.com/jilongliang/excel-doc-pdf 
  https://github.com/jilongliang/JL_OutExcel

5.2.5 JSON
fastjson gson jackjson json-lib org.json
JSON工程例子代码 https://github.com/jilongliang/json 
博客文章:http://blog.csdn.net/jilongliang/article/category/2813267

六、代码实现与效果

6.1Servlet3.x+jdbc实现

6.1.1Pojo

6.1.2Service


 
6.1.3Util

6.1.4Controler

6.1.5其他说明
1、Servlet3.x注意事项1

2、Servlet3.x注意事项2

由于jdbc实现代码较多和关闭数据源处理不好经常断,后面所有功能转为spring架构实现

6.1.6效果
启动Tomcat访问url:
http://localhost:8080/flong/sqlScriptController?executeMethod=queryTableList

6.2SpringMVC+JdbcTemplate实现

6.2.1Pojo

6.2.2Service

Java代码 
  1. package com.flong.modules.service.impl;
  2. import java.math.BigDecimal;
  3. import java.util.List;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import org.springframework.transaction.annotation.Transactional;
  7. import com.flong.commons.persistence.bean.SimplePage;
  8. import com.flong.commons.persistence.dao.impl.EntityDaoSupport;
  9. import com.flong.commons.utils.ObjectUtil;
  10. import com.flong.modules.dao.TableColumnsDao;
  11. import com.flong.modules.dao.TableDao;
  12. import com.flong.modules.dao.UserColCommentsDao;
  13. import com.flong.modules.dao.UserConsColumnsDao;
  14. import com.flong.modules.dao.UserTabCommentsDao;
  15. import com.flong.modules.pojo.Sequences;
  16. import com.flong.modules.pojo.UserColComments;
  17. import com.flong.modules.pojo.UserConsColumns;
  18. import com.flong.modules.pojo.UserTabColumns;
  19. import com.flong.modules.pojo.UserTabComments;
  20. import com.flong.modules.pojo.UserTables;
  21. import com.flong.modules.service.TableService;
  22. /**
  23. * @Description TODO
  24. * @ClassName   TableService
  25. * @Date        2017年3月1日 上午10:48:44
  26. * @Author      liangjilong
  27. * @Copyright (c) All Right Reserved , 2017.
  28. */
  29. @Service
  30. @Transactional
  31. @SuppressWarnings("all")
  32. public class TableServiceImpl extends  EntityDaoSupport<UserTables> implements TableService {
  33. @Autowired TableDao tableDao;
  34. @Autowired TableColumnsDao  tableColumnsDao;
  35. @Autowired UserColCommentsDao  userColCommentsDao;
  36. @Autowired UserTabCommentsDao  userTabCommentsDao;
  37. @Autowired UserConsColumnsDao  userConsColumnsDao;
  38. public  List<UserTables> queryTables(SimplePage page, UserTables object) {
  39. return tableDao.queryTables(page,object);
  40. }
  41. public List<UserTables> queryTableByName(String table_name){
  42. return tableDao.queryTableByName(table_name);
  43. }
  44. @Override
  45. public String createTableSQLScript(String tableName) {
  46. String result = "";
  47. //1、判断是否存在这个表
  48. List<UserTables> findList = queryTableByName( tableName);
  49. //2、组装execute immediate 'create table ...'
  50. if(findList!=null &&findList.size()>0){
  51. StringBuffer buffer =  new StringBuffer();
  52. //3、获取表的字段名称,并且获取约束是否为空(Null or Not null)
  53. List<UserTabColumns> userTabColumnList = tableColumnsDao.getUserTabColumnsByName(tableName);
  54. List<UserTabComments> userTabCommentList = userTabCommentsDao.getUserTabCommentsByName(tableName);
  55. List<UserColComments> userColCommentList = userColCommentsDao.getUserColCommentsByName(tableName);
  56. UserConsColumns userConsColumns = userConsColumnsDao.getUserConsColumnsByName(tableName);
  57. //----组装表字段列名
  58. int size = userTabColumnList.size()-1;//计算最后一个表列名
  59. buffer.append("--创建"+tableName+"表").append(ENTER);
  60. buffer.append("declare").append(ENTER);
  61. buffer.append(TAB).append("iCnt number := 0;").append(ENTER);
  62. buffer.append("begin ").append(ENTER);
  63. buffer.append("  select count(*) into iCnt from user_tables where lower(table_name) = lower('"+tableName+"');").append(ENTER);
  64. buffer.append("  if iCnt = 0 then ").append(ENTER);
  65. buffer.append(TAB).append("execute immediate 'create table "+tableName+"").append(ENTER);
  66. buffer.append(TAB).append("(").append(ENTER);
  67. for (int i = 0; i < userTabColumnList.size(); i++) {
  68. UserTabColumns userTabColumns = userTabColumnList.get(i);
  69. UserColComments userColComments = userColCommentList.get(i);
  70. String column_name1 = userColComments.getColumn_name();//列名
  71. String column_name2 = userTabColumns.getColumn_name();//列名
  72. String nullable = userTabColumns.getNullable();//是否允许为空
  73. String data_type = userTabColumns.getData_type();//数据库表的字段类型.
  74. BigDecimal data_length = userTabColumns.getData_length();
  75. BigDecimal data_precision = userTabColumns.getData_precision();
  76. BigDecimal data_scale = userTabColumns.getData_scale();
  77. if(ObjectUtil.isNotEmpty(column_name1) &&  ObjectUtil.isNotEmpty(column_name2) && column_name1.equalsIgnoreCase(column_name2)){
  78. //判断表字段类型是否为NULL或NOT NULL
  79. if(ObjectUtil.isNotEmpty(nullable) && !"N".equalsIgnoreCase(nullable)){
  80. if(size==i){
  81. if("VARCHAR2".equalsIgnoreCase(data_type) || "NVARCHAR2".equalsIgnoreCase(data_type) ||"CHAR".equalsIgnoreCase(data_type)){
  82. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_length+")" ).append(ENTER);
  83. }else if("NUMBER".equalsIgnoreCase(data_type)){
  84. if(data_precision!= null && data_scale!=null){
  85. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+","+data_scale+") ").append(ENTER);
  86. }else if(data_precision!= null && data_scale==null){
  87. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+",0) ").append(ENTER);
  88. }else{
  89. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(ENTER);
  90. }
  91. }else if(("DATE".equalsIgnoreCase(data_type))||(data_type!=null && data_type.contains("TIMESTAMP")) ){
  92. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(ENTER);
  93. }else if("LONG".equalsIgnoreCase(data_type) ||"NCLOB".equalsIgnoreCase(data_type)){
  94. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(ENTER);
  95. }
  96. }else{
  97. //为空但是有逗号分开
  98. if("VARCHAR2".equalsIgnoreCase(data_type) || "NVARCHAR2".equalsIgnoreCase(data_type) ||"CHAR".equalsIgnoreCase(data_type)){
  99. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_length+")" ).append(COMMA).append(ENTER);
  100. }else if("NUMBER".equalsIgnoreCase(data_type)){
  101. if(data_precision!= null && data_scale!=null){
  102. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+","+data_scale+") ").append(COMMA).append(ENTER);
  103. }else if(data_precision!= null && data_scale==null){
  104. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+",0) ").append(COMMA).append(ENTER);
  105. }else{
  106. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(COMMA).append(ENTER);
  107. }
  108. }else if(("DATE".equalsIgnoreCase(data_type))||(data_type!=null && data_type.contains("TIMESTAMP")) ){
  109. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(COMMA).append(ENTER);
  110. }else if("LONG".equalsIgnoreCase(data_type) ||"NCLOB".equalsIgnoreCase(data_type)){
  111. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(COMMA).append(ENTER);
  112. }
  113. }
  114. }else{
  115. if(size==i){
  116. if("VARCHAR2".equalsIgnoreCase(data_type) || "NVARCHAR2".equalsIgnoreCase(data_type) ||"CHAR".equalsIgnoreCase(data_type)){
  117. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_length+")  not null "  ).append(ENTER);
  118. }else if("NUMBER".equalsIgnoreCase(data_type)){
  119. if(data_precision!= null && data_scale!=null){
  120. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+","+data_scale+")  not null").append(ENTER);
  121. }else if(data_precision!= null && data_scale==null){
  122. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+",0)  not null ").append(ENTER);
  123. }else{
  124. buffer.append(TAB+TAB+column_name1+TAB+data_type+"").append(ENTER);
  125. }
  126. }else if(("DATE".equalsIgnoreCase(data_type))||(data_type!=null && data_type.contains("TIMESTAMP")) ){
  127. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(ENTER);
  128. }else if("LONG".equalsIgnoreCase(data_type) ||"NCLOB".equalsIgnoreCase(data_type)){
  129. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(ENTER);
  130. }
  131. }else{
  132. if("VARCHAR2".equalsIgnoreCase(data_type) || "NVARCHAR2".equalsIgnoreCase(data_type) ||"CHAR".equalsIgnoreCase(data_type)){
  133. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_length+")  not null "  ).append(COMMA).append(ENTER);
  134. }else if("NUMBER".equalsIgnoreCase(data_type)){
  135. if(data_precision!= null && data_scale!=null){
  136. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+","+data_scale+")  not null").append(COMMA).append(ENTER);
  137. }else if(data_precision!= null && data_scale==null){
  138. buffer.append(TAB+TAB+column_name1+TAB+data_type+"("+data_precision+",0)  not null ").append(COMMA).append(ENTER);
  139. }else{
  140. buffer.append(TAB+TAB+column_name1+TAB+data_type+" ").append(COMMA).append(ENTER);
  141. }
  142. }else if(("DATE".equalsIgnoreCase(data_type))||(data_type!=null && data_type.contains("TIMESTAMP")) ){
  143. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(COMMA).append(ENTER);
  144. }else if("LONG".equalsIgnoreCase(data_type) ||"NCLOB".equalsIgnoreCase(data_type)){
  145. buffer.append(TAB+TAB+column_name1+TAB+data_type).append(COMMA).append(ENTER);
  146. }
  147. }
  148. }
  149. }
  150. }
  151. buffer.append(TAB).append(")';").append(ENTER);
  152. //4、获取表名给予表加备注.(有就加,无默认表描述)
  153. if(ObjectUtil.isNotEmpty(userTabCommentList) && ObjectUtil.isNotEmpty(userTabCommentList.get(0))){
  154. String comments = userTabCommentList.get(0).getComments();
  155. comments = (comments==null?" this is "+tableName+" tableName ":comments);
  156. buffer.append(TAB).append("execute immediate 'comment on table "+tableName +" is ''"+comments+"'''").append(";").append(ENTER);
  157. }
  158. //5、添加主键执行SQL脚本
  159. if(ObjectUtil.isNotEmpty(userConsColumns) && ObjectUtil.isNotEmpty(userConsColumns.getConstraint_name())){
  160. buffer.append(TAB).append("execute immediate 'alter table "+tableName).append(" add constraint "+userConsColumns.getConstraint_name()+" ");
  161. buffer.append("primary key ("+userConsColumns.getColumn_name()+")' ;").append(ENTER);
  162. }
  163. //6、获取表字段名给予字段加备注(有就加,无默认字段描述)
  164. for(UserColComments col: userColCommentList){
  165. String comments = col.getComments();
  166. String column_name = col.getColumn_name();
  167. comments = (comments==null?" this is "+column_name+" columnName ":comments);
  168. buffer.append(TAB).append("execute immediate 'comment on column "+tableName+"."+col.getColumn_name()+" is ''"+comments+"'''").append(";").append(ENTER);
  169. }
  170. //---end if
  171. buffer.append(" end if;").append(ENTER);
  172. buffer.append("end;").append(ENTER);
  173. buffer.append("/").append(ENTER);
  174. result = buffer.toString();
  175. }
  176. return result;
  177. }
  178. @Override
  179. public String dropTableSQLScript(String table_name) {
  180. List<UserTables> list = queryTableByName(table_name);
  181. StringBuffer buffer = new StringBuffer();
  182. if(list!=null && list.size()>0){
  183. UserTables sequences = list.get(0);
  184. buffer.append("--"+table_name).append(ENTER);
  185. buffer.append("declare").append(ENTER);
  186. buffer.append(TAB+TAB).append("iCnt number := 0;").append(ENTER);
  187. buffer.append(TAB).append("begin").append(ENTER);
  188. buffer.append(TAB).append(" select count(*) into iCnt from user_tables  where  lower(table_name) = '"+table_name+"'; --根据表进行查询").append(ENTER);
  189. buffer.append(TAB).append(" if iCnt > 0 then ").append(ENTER);
  190. buffer.append(TAB).append("     execute immediate 'drop table "+table_name+"'; --删除表,表结构和数据一起清空 ").append(ENTER);
  191. buffer.append(TAB).append(" end if;").append(ENTER);
  192. buffer.append(TAB).append("end;").append(ENTER);
  193. buffer.append("/").append(ENTER);
  194. return buffer.toString();
  195. }
  196. return null;
  197. }
  198. }

6.2.3DAO 
 

6.2.4Controler

Java代码 
  1. package com.flong.modules.controller;
  2. import java.util.List;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.PathVariable;
  8. import org.springframework.web.bind.annotation.RequestMapping;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.flong.codegenerator.FileUtils;
  11. import com.flong.commons.persistence.bean.SimplePage;
  12. import com.flong.commons.web.BaseController;
  13. import com.flong.modules.pojo.UserTables;
  14. import com.flong.modules.service.TableService;
  15. /**
  16. * @author liangjilong
  17. *
  18. */
  19. @Controller
  20. @RequestMapping("table")
  21. public class TableController extends BaseController{
  22. @Autowired TableService tableService;
  23. /***
  24. * 查询所有Oracle内置数据库表或者视图信息
  25. * @param tableIdentifiers
  26. * @param page
  27. * @param request
  28. * @param response
  29. * @return
  30. */
  31. @RequestMapping(value="list")
  32. public String list(UserTables userTables,SimplePage page ,HttpServletRequest request ){
  33. List<UserTables> findList = tableService.queryTables(page, userTables);
  34. request.setAttribute("userTables", userTables);
  35. request.setAttribute("page", page);
  36. request.setAttribute("list", findList);
  37. return "modules/tableList";
  38. }
  39. /**
  40. * @Description 根据表名进行查询表信息
  41. * @Author      liangjilong
  42. * @Date        2017年3月27日 上午8:23:14
  43. * @param table_name
  44. * @param request
  45. * @return      参数
  46. * @return      String 返回类型
  47. */
  48. @RequestMapping(value="createTableSQLScript/{table_name}")
  49. public String createTableSQLScript(@PathVariable  String table_name,HttpServletRequest request ){
  50. String resultSQLStr = tableService.createTableSQLScript(table_name);
  51. request.setAttribute("resultSQLStr", resultSQLStr);
  52. return "modules/sqlScriptInfo";
  53. }
  54. /**
  55. * @Description 根据表名进行查询表信息
  56. * @Author      liangjilong
  57. * @Date        2017年3月27日 上午8:23:14
  58. * @param table_name
  59. * @param request
  60. * @return      参数
  61. * @return      String 返回类型
  62. */
  63. @RequestMapping(value="dropTableSQLScript/{table_name}")
  64. public String dropTableSQLScript(@PathVariable  String table_name,HttpServletRequest request ){
  65. String resultSQLStr = tableService.dropTableSQLScript(table_name);
  66. request.setAttribute("resultSQLStr", resultSQLStr);
  67. return "modules/sqlScriptInfo";
  68. }
  69. /**
  70. *
  71. * @Description 导出SQL
  72. *    本来html的textarea标签可以使用js实现拷贝的,为了模仿iteye或者csdn博客开发页面拷贝功能的,由于找了好几个插件都没试出来,
  73. *    而且他们都是使用swf插件实现,在脚本高亮在显示关键字就研究了SyntaxHighlighter导致textarea使用js拷贝功能失效就放弃按钮拷
  74. *    贝功能。为了更加方便通过文件流处理,指定电脑硬盘路径和名称,并以.sql后缀文件直接输出,这样更方便帮助我们直接省了Ctrl+C
  75. *    和Ctrl+V内容, //再新建文件整理脚本工作动作。cnblogs博客是双击代码,按 Ctrl+C复制代码(此时是jQuery高亮插件自带功能提示)
  76. *    参考博客:http://www.cnblogs.com/tylerdonet/p/4533782.html
  77. * @Author liangjilong
  78. * @Date 2017年3月27日 上午8:21:15
  79. * @param table_name
  80. * @param request
  81. *            参数
  82. * @return void 返回类型
  83. */
  84. @RequestMapping(value="exportCreateSQL/{table_name}")
  85. public void exportCreateSQL(@PathVariable  String table_name,HttpServletResponse response ){
  86. String resultSQLStr = tableService.createTableSQLScript(table_name);
  87. //这里为了快速方便使用指定路径实现,并以.sql后缀文件导出到指定硬盘。可以根据自己的情况进行修改,比如:你可以使用SpringMVC下载文件方式实现,
  88. String path = "C://output-sql/"+"TableSQL-"+formatDate+".sql";
  89. FileUtils.save(path, resultSQLStr);//保存文件
  90. JSONObject jsonObject = new JSONObject();//使用fastjson技术实现ajax异步处理
  91. jsonObject.put("path", path);
  92. jsonObject.put("result", "1");
  93. this.writeJson(jsonObject, response);
  94. }
  95. /**
  96. *
  97. * @Description 导出SQL
  98. *    本来html的textarea标签可以使用js实现拷贝的,为了模仿iteye或者csdn博客开发页面拷贝功能的,由于找了好几个插件都没试出来,
  99. *    而且他们都是使用swf插件实现,在脚本高亮在显示关键字就研究了SyntaxHighlighter导致textarea使用js拷贝功能失效就放弃按钮拷
  100. *    贝功能。为了更加方便通过文件流处理,指定电脑硬盘路径和名称,并以.sql后缀文件直接输出,这样更方便帮助我们直接省了Ctrl+C
  101. *    和Ctrl+V内容, //再新建文件整理脚本工作动作。cnblogs博客是双击代码,按 Ctrl+C复制代码(此时是jQuery高亮插件自带功能提示)
  102. *    参考博客:http://www.cnblogs.com/tylerdonet/p/4533782.html
  103. * @Author liangjilong
  104. * @Date 2017年3月27日 上午8:21:15
  105. * @param table_name
  106. * @param request
  107. *            参数
  108. * @return void 返回类型
  109. */
  110. @RequestMapping(value="exportDropSQL/{table_name}")
  111. public void exportDropSQL(@PathVariable  String table_name,HttpServletResponse response ){
  112. String resultSQLStr = tableService.dropTableSQLScript(table_name);
  113. //这里为了快速方便使用指定路径实现,并以.sql后缀文件导出到指定硬盘。可以根据自己的情况进行修改,比如:你可以使用SpringMVC下载文件方式实现,
  114. String path = "C://output-sql/"+"TableSQL-"+formatDate+".sql";
  115. FileUtils.save(path, resultSQLStr);//保存文件
  116. JSONObject jsonObject = new JSONObject();//使用fastjson技术实现ajax异步处理
  117. jsonObject.put("path", path);
  118. jsonObject.put("result", "1");
  119. this.writeJson(jsonObject, response);
  120. }
  121. }

6.2.5前端技术


 

分页jsp代码 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2. <style>
  3. a{cursor: pointer;}
  4. </style>
  5. <input type="hidden" id="pageNum" name="pageNum" value="${page.pageNum }"/>
  6. <input type="hidden" id="pageCount" name="pageCount" value="${page.pageCount }"/>
  7. <c:set var="startPage" value="${page.pageNum-page.pageNum%5+1 }"/>
  8. <c:if test="${page.pageNum%5==0 }">
  9. <c:set var="startPage" value="${startPage-5 }"/>
  10. </c:if>
  11. <c:set var="endPage" value="${startPage+4 }"/>
  12. <c:if test="${page.pageCount-startPage < 5 }">
  13. <c:set var="endPage" value="${page.pageCount }"/>
  14. </c:if>
  15. <nav>
  16. <ul class="pagination pagination-sm">
  17. <li id="prvPage" οnclick="goPage(1,this.id)"><a title="首页">&laquo;</a></li>
  18. <li id="last" class="<c:if test="${page.pageNum == 1 }">disable</c:if>" οnclick="lastPage(this.id)"><a>上一页</a></li>
  19. <c:choose>
  20. <c:when test="${page.pageCount > 5 }">
  21. <c:forEach var="startIndex" begin="${startPage }" end="${endPage }" step="1">
  22. <li id="current" <c:if test="${page.pageNum == startIndex }">class="active"</c:if> οnclick="goPage(${startIndex },this.id)">
  23. <a>${startIndex }</a>
  24. </li>
  25. </c:forEach>
  26. </c:when>
  27. <c:otherwise>
  28. <c:forEach var="i" begin="1" end="${page.pageCount }" step="1">
  29. <li id="current" <c:if test="${page.pageNum == i }">class="active"</c:if> οnclick="goPage(${i },this.id)">
  30. <a>${i }</a></li>
  31. </c:forEach>
  32. </c:otherwise>
  33. </c:choose>
  34. <li><a>...</a></li>
  35. <li><a>共${page.pageCount }页</a></li>
  36. <li id="next" class="<c:if test="${page.pageNum == page.pageCount }">disable</c:if>" οnclick="nextPage(this.id)"><a>下一页</a></li>
  37. <li id="lastPage" οnclick="goPage(${page.pageCount},this.id)"><a  title="尾页">&raquo;</a></li>
  38. <span>到</span>
  39. <li>
  40. <input type="text" class="input-medium required digits" id="targetPage" style="width: 38px;height:30px; text-align: center;"
  41. value="${page.pageNum }"  οnkeyup="this.value=this.value.replace(/\D/g,'')"  οnblur="checkPageNum(this)">
  42. </li>
  43. <span>页&nbsp;&nbsp;共<strong>${page.rowCount}</strong>条</span>
  44. <input id="go" type="button" value="确定" class="sure btn btn-sm btn-success" οnclick="goPage($('#targetPage').val(),this.id)">
  45. </ul>
  46. </nav>
  47. <script type="text/javascript">
  48. /**
  49. *此分页必须要有表单有有一个Id,而且class=form-search.form表单必须包括分页common-pagination.jsp
  50. */
  51. /**执行第一页**/
  52. function setStart(){
  53. $('#pageNum').val(1);
  54. }
  55. /**检查这个页数**/
  56. function checkPageNum(obj){
  57. var pageCount = $('#pageCount').val();
  58. if(obj.value > parseInt(pageCount)){
  59. //如果大于当前页数的时候就变成btn白色.
  60. $('#go').attr('class', 'sure btn-sm disable');
  61. }else{
  62. $('#go').attr('class', 'btn btn-sm');
  63. }
  64. }
  65. /**执行分页**/
  66. function goPage(pageNum,obj){
  67. var formId = $('#' + obj).parents(".form-search").attr('id');
  68. var pageCount = $('#pageCount').val();
  69. if(parseInt(pageNum) <= parseInt(pageCount)){
  70. $('#pageNum').val(pageNum);
  71. $('#' + formId).submit();
  72. }
  73. }
  74. /**执行最后一页**/
  75. function lastPage(obj){
  76. var formId = $('#' + obj).parents(".form-search").attr('id');
  77. var pageNum = $('#pageNum').val();
  78. var lastPageNum = parseInt(pageNum) - 1;
  79. if(lastPageNum != 0){
  80. $('#pageNum').val(lastPageNum);
  81. $('#' + formId).submit();
  82. }
  83. }
  84. /**执行下一页**/
  85. function nextPage(obj){
  86. var formId = $('#' + obj).parents(".form-search").attr('id');
  87. var pageNum = $('#pageNum').val();
  88. var pageCount = $('#pageCount').val();
  89. var nextPageNum = parseInt(pageNum) + 1;
  90. if(parseInt(pageNum) < parseInt(pageCount)){
  91. $('#pageNum').val(nextPageNum);
  92. $('#' + formId).submit();
  93. }
  94. }
  95. </script>
表管理--tablelist.jsp代码 
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
  2. <%@ include file="/WEB-INF/views/include/taglib.jsp"%>
  3. <!DOCTYPE htm>
  4. <html>
  5. <head>
  6. <%@ include file="/WEB-INF/views/include/meta.jsp"%>
  7. <%@ include file="/WEB-INF/views/include/include.jsp"%>
  8. <title></title>
  9. <style>
  10. .breadcrumb{
  11. background-color: #fff;
  12. }
  13. .form-search{
  14. background-color: #fff;
  15. }
  16. .form-search1{
  17. padding: 8px 15px;
  18. background-color: #f5f5f5;
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <ul class="nav nav-tabs">
  24. <li><a href="${basePath}tableIdentifiers/list">主键管理</a></li>
  25. <li class="active"><a href="${basePath}table/list">表管理</a></li>
  26. <li><a href="${basePath}view/list">视图管理</a></li>
  27. <li ><a href="${basePath}sequence/list">序列管理</a></li>
  28. <li ><a href="${basePath}index/list">索引管理</a></li>
  29. </ul>
  30. <form:form id="searchForm" modelAttribute="userTables" action="${basePath}table/list" method="post" class="breadcrumb form-search form-inline">
  31. <div style="margin-bottom: 20px;" class="form-search1">
  32. <label>TableName :</label><form:input path="table_name" htmlEscape="false" maxlength="50" class="input-medium form-control" placeholder="TableName"/>
  33. &nbsp;<input id="btnSubmit" class="btn btn-info" type="submit" value="查询"/>
  34. </div>
  35. <table id="contentTable" class="table table-striped table-bordered table-hover">
  36. <thead>
  37. <tr>
  38. <th style="width: 58px;">编号</th>
  39. <th>表名称</th>
  40. <th>表空间名称</th>
  41. <th>操作</th>
  42. </tr>
  43. </thead>
  44. <tbody>
  45. <c:forEach items="${list}" var="obj" varStatus="row">
  46. <tr>
  47. <td>${row.index+1}</td>
  48. <td>${obj.table_name}</td>
  49. <td>${obj.tablespace_name}</td>
  50. <td>
  51. <!-- 使用ont-awesome或者fbootstrap图标库 -->
  52. <i class="fa fa-binoculars"></i>
  53. <a href="${basePath}table/dropTableSQLScript/${obj.table_name}" οnclick="return createSQL('生成删除表SQL脚本',this.href);">生成删除脚本</a>&nbsp;&nbsp;
  54. <i class="fa fa-binoculars"></i>
  55. <a href="${basePath}table/createTableSQLScript/${obj.table_name}" οnclick="return createSQL('生成创建表SQL脚本',this.href);">生成创建脚本</a>&nbsp;&nbsp;
  56. <i class="glyphicon glyphicon-export"></i>
  57. <a href="${basePath}table/exportDropSQL/${obj.table_name}" οnclick="return exportSQL('确定要导出删除表脚本?',this.href);">导出删除脚本</a>&nbsp;&nbsp;
  58. <i class="glyphicon glyphicon-export"></i>
  59. <a href="${basePath}table/exportCreateSQL/${obj.table_name}" οnclick="return exportSQL('确定要导出创建表脚本?',this.href);">导出创建脚本</a>&nbsp;&nbsp;
  60. </td>
  61. </tr>
  62. </c:forEach>
  63. </tbody>
  64. </table>
  65. <%@ include file="/WEB-INF/views/include/pagination.jsp"%>
  66. </form:form>
  67. </body>
  68. </html>

6.2.6JXL实现
Excel模板


运行代码:


 

生成声明式高级SQL脚本


6.2.7Util底层封装代码

6.2.8其他说明
如果在运行项目的时候,报Spring监听的时候,说明没找到Maven,引用jar,
解决方法加上Maven 库或者运行maven istanll拷贝jar到工程lib下面【在pom.xml已经配置好】拷贝成功之后此时可以再运行web工程就无错误.


 

 

 

Web.xml配置

Xml代码 
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  3. <display-name>flong</display-name>
  4. <!-- 参数初始化类配置 -->
  5. <context-param>
  6. <param-name>contextConfigLocation</param-name>
  7. <param-value>
  8. classpath*:spring/spring-context.xml,
  9. classpath*:spring/spring-timer.xml
  10. </param-value>
  11. </context-param>
  12. <context-param>
  13. <param-name>spring.profiles.default</param-name>
  14. <param-value>production</param-value>
  15. </context-param>
  16. <!-- ===================================encoding=========================================== -->
  17. <listener>
  18. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  19. </listener>
  20. <filter>
  21. <filter-name>encodingFilter</filter-name>
  22. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  23. <init-param>
  24. <param-name>encoding</param-name>
  25. <param-value>UTF-8</param-value>
  26. </init-param>
  27. <init-param>
  28. <param-name>forceEncoding</param-name>
  29. <param-value>true</param-value>
  30. </init-param>
  31. </filter>
  32. <filter-mapping>
  33. <filter-name>encodingFilter</filter-name>
  34. <url-pattern>/*</url-pattern>
  35. </filter-mapping>
  36. <!-- ===================================SpringMVC=========================================== -->
  37. <servlet>
  38. <servlet-name>SpringMVC</servlet-name>
  39. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  40. <init-param>
  41. <param-name>contextConfigLocation</param-name>
  42. <param-value>classpath*:spring-mvc.xml</param-value>
  43. </init-param>
  44. <load-on-startup>1</load-on-startup>
  45. </servlet>
  46. <servlet-mapping>
  47. <servlet-name>SpringMVC</servlet-name>
  48. <url-pattern>/</url-pattern>
  49. </servlet-mapping>
  50. <!-- ===================================error-page=========================================== -->
  51. <error-page>
  52. <exception-type>java.lang.Throwable</exception-type>
  53. <location>/WEB-INF/views/error/500.jsp</location>
  54. </error-page>
  55. <error-page>
  56. <error-code>500</error-code>
  57. <location>/WEB-INF/views/error/500.jsp</location>
  58. </error-page>
  59. <error-page>
  60. <error-code>400</error-code>
  61. <location>/WEB-INF/views/error/400.jsp</location>
  62. </error-page>
  63. <error-page>
  64. <error-code>403</error-code>
  65. <location>/WEB-INF/views/error/403.jsp</location>
  66. </error-page>
  67. <error-page>
  68. <error-code>404</error-code>
  69. <location>/WEB-INF/views/error/404.jsp</location>
  70. </error-page>
  71. </web-app>

6.2.9功能与效果
   其中有表管理,视图管理,序列管理,索引管理,每个管理都有【删除与创建脚本功能,导出删除和导出创建脚本功能】
启动Tomcat访问url:http://localhost:8080/generator/table/list

1、整体功能--表管理

2、整体功能--视图管理

3、整体功能--序列管理

4、整体功能--索引管理

6、生成删除表SQL脚本


7、生成创建表SQL脚本

8、导出删除表SQL脚本

9、导出创建表SQL脚本

七、个人总结
7.1为什么要总结
1、常言道:一分耕耘一分收获。总结能肯定自己劳动成果,帮助自己找出优缺点。

2、在扬长避短的情况下不断完善自己不足,针对性的学习。

7.2为什么记录笔记

1、在平时工作下来,一天认真工作下来,脑子肯定非常很疲倦,故经常健忘。也许跟年龄的岁数增大有关系。人精力与体力等各方面都有限的,毕竟人不是机器。

2、常言道:好记性不如烂笔头。切记千万别以自己有点小聪明对自己懒惰。

3、如果经常健忘的时候,不防借助一些软件工具或者云服务进行帮助存储生活中的痕迹。比如:思维导图(XMind, MindManager,FreeMind)云道笔记等等方式。

7.3其他说明

1以上问题都是根据自己工作实际情况进行总结整理,除了技术问题查很多网上资料通过进行学习之后梳理。

2在学习过程中也遇到很多困难和疑点,如有问题或误点,望各位老司机多多指出或者提出
建议。本人会采纳各种好建议和正确方式不断完善现况,人在成长过程中的需要优质的养料。

3 导入代码的时候遇到最多的问题,我想应该是Maven较多,此时不懂maven的童鞋们可以通过自身情况,进行网上查资料学习。如通过网上找资料长时间解决不了,
或者框架有不明白可以通过博客留言或者jilongliang@sina.com邮箱进行提问,在能力范围内会尽力帮助大家解决问题所在,希望在过程中一起进步,一起成长。
请牢记一句话:内事问度娘, 外事问谷歌,仅供参考学习。

源代码下载地址  http://download.csdn.net/detail/l_ji_l/9797834

最实际与高效生成数据库高级声明式SQL脚本神器研发相关推荐

  1. 【Java与Python实现】最实际与高效生成数据库高级声明式SQL脚本神器研发

    一. 简介 1.1前言 1.2作用 二. 实现方式与原理 2.1实现方式 2.2原理 三. 体系与图解 3.1创建表与插数据脚本 3.2添加或修改表脚本 3.3删除表脚本 3.4删除与创建索引脚本 3 ...

  2. Oracle工具类-生成数据库现有Job的创建脚本

    生成Oracle数据库现有Job的创建脚本 -- 生成现有Job的创建脚本create or replace procedure proc_generate_job_create_sql isbegi ...

  3. 数据库日常管理常用sql脚本

     / 目录: ###########查询类###########关于session:kill session和kill -9查询session信息以及process信息查找产生大量物理读的进程查找 ...

  4. sqlserver2008数据库自动备份的sql脚本及使用bat命令执行脚本

    -----sql脚本 declare @fileName varchar(255) ,--定义备份文件名变量          @dbname varchar(255)--定义备份数据库名变量 dec ...

  5. Erwin 生成 mysql 带注释(comment )的脚本

    Erwin设计数据库非常方便,有逻辑视图和物理视图,可以很方便的生成数据库文档和SQL 脚本.在使用过程中唯一不爽的地方是脚本不能生成comment. 在百度无数次无法解决下,又翻墙谷歌,在一个日本网 ...

  6. java实体类生成mysql表_springboot+mybatis通过实体类自动生成数据库表的方法

    前言 本章介绍使用mybatis结合mysql数据库自动根据实体类生成相关的数据库表. 首先引入相关的pom包我这里使用的是springboot2.1.8.RELEASE的版本 org.mybatis ...

  7. kubernetes(k8s)使用声明式管理与 创建yaml模板文件

    文章目录 一:声明式管理方法 1.1 什么是声明式管理 1.2 查看资源配置 1.2.1 查看资源配置清单 1.2 使用explain 解释资源配置清单 1.3 修改资源配置清单并应用 1.3.1 离 ...

  8. springMVC重复扫描bean导致声明式事务失效

    文章目录 1 配置文件 1.1 加载spring容器配置 1.2 加载springMvc容器配置 1.3 spring声明式事务配置 2 声明式事务失效 2.1 事务失效的原因 2.2 解决方案 3 ...

  9. datagrip 导出 Oracle 数据库结构和数据到sql脚本中

    文章目录 1. 问题描述 2. 数据库右键 -- 仅对 MySQL 和 PostgreSQL 有效 1. MySQL 备份 -- mysqldump 2. PostgreSQL 备份 -- pgdum ...

最新文章

  1. Python中实现ASCII码与字符相互转换
  2. 36.Silverlight中播放视频和打印文档【附带源码实例】
  3. AppDelegate瘦身之服务化
  4. hm编码工具使用_HM集团旗下最高端品牌ARKET将进驻中国,带你看看真正的“北欧风”...
  5. 苹果屏幕一半失灵一半好的_佛说:一半一半(写的真好!)
  6. 机器学习模型 知乎_知乎CTO李大海:谢邀,来分享下内容社区的AI架构搭建与应用...
  7. 一个具有对象计数功能的基类
  8. .net2005登录控件
  9. LabVIEW2020下载与安装教程
  10. 2021-06-16volatile的三种特性
  11. (字符串)ZigZag Conversion
  12. 计算机二级c语言选择题pdf,计算机二级c语言选择题库(带答案)[汇编].pdf
  13. 【APP自动化测试环境】安装jdk---安装android SDK---安装appium---安装node.js---安装夜神模拟器--调试appium连接夜神模拟器
  14. 百度分词ai php,百度分词技术
  15. 浅谈Android视频缓存库
  16. ubuntu 终端常用命令大全
  17. 通信、电子保研经验贴,北京理工大学+中国科学院大学空天所
  18. transmac装黑苹果_自己安装黑苹果,安装mac简单教程,双系统轻松使用
  19. Ubuntu16.04 开机出现检测到系统程序出现问题
  20. 旧版Chrome浏览器的安装和使用——chrome63

热门文章

  1. 手机的AI之路:从营销噱头到产业变革 | 深度
  2. 小猿圈web之前端的主流框架
  3. python私有成员变量_python类的私有变量
  4. 漏洞修复:Cookie Security: Overly Permissive SameSite Attribute
  5. gearman mysql_Gearman Server 使用 MySQL UDFs 来管理和保持队列
  6. OPPO Watch、Apple Watch 、Amazfit GTS 2中,如何选合适自己的手表
  7. 解决consul出现I/O error on GET request for “http://XXX“: XXX错误
  8. 2011年中的macmini 系统安装,简直作死
  9. 缓存一致性协议(MESI)
  10. 对不同的人说不同的话-王阳明的心学智慧