Java备份和还原MySQL数据库
引言 在项目中经常会用到Java程序备份和还原MySQL数据库的内容,都是大同小异,但程序也会出现各种各样的问题(运行时异常,乱码等)。实现上都是用Runtime执行MySQL的命令行工具,然后读写IO流数据;也有可能是由于使用Java的Runtime来实现备份还原功能,而由于大家的运行时环境有差异才导致代码运行不成功。在这里记录一下自己使用的工具和方法。
使用MySQL自带工具备份备份使用MySQL的mysqldump命令来实现,示例代码
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455final static Logger logger = LoggerFactory.getLogger(MySQLDatabaseBackupAndRestore.class); /** * Java代码实现MySQL数据库导出 * * @param hostIP MySQL数据库所在服务器地址IP * @param ...
系统中功能点的版本控制
引言 开发过程中我们会使用版本控制工具,如SVN、Git等。但是我们一样会遇到一种情形:在一套试题系统中,有新建题目、编辑题目、删除题目等功能,且题目可以被多个人修改,每人修改一次即是一个版本。现在的需求就是需要记录每一次修改的详细信息,每次版本之间的差异,甚至还可以版本回滚。
例如题目编号为20170919170800000061的题目被A创建,依次被B、C、D各修改了一次,此时需要比较B和A间的差异、C和B间的差异、D和C间的差异,到最后审核阶段如果B 的版本比较符合,则需要把试题版本内容回滚到B版本作为最后的版本。
仔细分析一下题干,我们的需求是1.比较版本的差异,2.版本的回滚。之前有考虑过两种方案:
修改时在前端进行比较,只记录版本的差异,后台只需要进行存取即可。
把所有版本信息全部存储在数据库,在请求时后台进行比较差异。
第一种方案带来的问题是没法进行版本回滚,只记录下来了差异,回滚时将会是灾难,那么第二种方案才是较合适的选择。
下图是数据库中的版本修改记录
题目的所有信息全部存储在itemJson中,比较版本间的差异即是比较版本间的itemJ ...
Spring+Mybatis之Mapper热部署
引言 Spring+Mybatis经常用,在项目中最痛苦的就是修改mapper文件的时候需要重启一下项目,每修改一次就需要重启一次项目。项目小还好,如果项目大,重启一次项目简直是要命。所以,去网上查资料看有没有办法让mybatis热部署,每次更新mapper文件不需要重启项目。
功夫不负有心人,终于找到了,这玩意只要发现mapper文件被修改,就会重新加载被修改的mapper文件。且只加载被修改的mapper文件!这个可省事了,效率又高,简直爽到爆。
创建MapperRefresh刷新类在src下创建一个util包,包下面创建一个类,类名为:MapperRefresh
代码为下面的一串,注意修改下mybatis-refresh.properties 的路径。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 ...
Spring-AOP两种配置方式
引言AOPAOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用”横切”技术,AOP把软件系统分为两个部分: ...
跨页面(Tab/Window)通信的几种方法
今天开发一个功能遇到一个需求,在A页面点击查看详情后打开B页面进行修改或删除,删除后B页面关闭,然后刷新A页面里面的数据。相当于就是两个页面之间进行通讯,作为后端的我第一想法是利用webSocket 进行通讯,之后通过谷歌和百度找出了更为简便的方法。
利用webSocket进行通讯 第一想法是这个,但是这样的话工作量巨大而且还需要后端支持,太麻烦了,对于我这种懒人直接就放弃了,去寻找有没有更简便的方法。
定时器不断检查cookies变化在stackoverflow上看到一个方案,大致思路是:
在页面A设置一个使用 setInterval 定时器不断刷新,检查 Cookies 的值是否发生变化,如果变化就进行刷新的操作。
由于 Cookies 是在同域可读的,所以在页面 B 审核的时候改变 Cookies 的值,页面 A 自然是可以拿到的。这样做确实可以实现我想要的功能,但是这样的方法相当浪费资源。虽然在这个性能过盛的时代,浪费不浪费也感觉不出来,但是这种实现方案,确实不够优(zhuāng)雅(bī)。
localStorage的事件功夫不负有心人,后来发现 w ...
JAVA实现HTML转PDF
最近公司里面有一个任务,在线题卡,就是把客户在线编辑的题卡样式保存下来,然后可以导出为PDF格式。于是上网找了一系列的资料,找到了以下两种方法:
使用wkhtmltox
使用iText+Flying Saucer
但是还是强烈推荐用第一种方法。
使用wkhtmltox(推荐)wkhtmltox实现网页转换成图片或PDF
命令实现
进入wkhtmltox官网软件下载 :https://wkhtmltopdf.org/downloads.html
安装完成后进入${home}/bin目录下有两个exe文件,通过名称就可以辨别wkhtmltoimage.exe是将HTML转化为image,wkhtmltopdf.exe是将HTML转化为PDF文件,这正是我们想要的。
进入${home}/bin目录下打开cmd输入以下命令验证
12wkhtmltopdf HTML路径 保存路径如: wkhtmltopdf www.baidu.com d:\test.pdf
生成完成后会出现Done。
代码实现JAVA代码中调用wkhtmltopdf生成PDF文件,以下为代码片段
...
静态服务器搭建及前端知识点
引言 虽然是做后台开发,但是很多时候自己也兼顾了前台,并不是所有的项目都是前后台分离开发,所以在开发期间自己也总结和学习了前端了一些小知识,在这里进行总结,以便自己温习。
NodeJS搭建静态资源服务器对Node.js只有浅显的认识,但是有时候又要自己搭建静态服务器进行测试。搭建静态服务器需要以下几个步骤:
下载node.js,进入node.js官网下载http://nodejs.cn对应的版本。
安装node.js。
启动node.js,在命令行输入命令安装需要的模块,依次执行命令。
123npm install expressnpm install requestnpm install http-server
简单的静态服务器新建server.js,内容为
1234567891011var express = require('express');var http = require("http");var request = require('request');var app = expre ...
微信公众号网页开发
引言最近一直参与公司开发公众号,关于项目实施平台PC端简化为微信公众号,主要架构为前台H5,使用时的微信的WeUI的SDK,后台就是现在流行的SpringMVC+Mybaties,参与了全程开发,开发过程中也遇到了不少的问题,现在记录下来,希望以后能够用得到。
HTML页面之间传值JSP之间传值已经很熟悉,HTML之间传值是通过解析URL获取所需参数。
12//URL传值URL + "?logId=" + logId;
12345678910111213141516171819202122232425262728//获取所需参数var hrefInfo = getUrlVars(window.location.href); if (hrefInfo.logId && hrefInfo.logId != "undefined") { fillData(hrefInfo.logId); logId = hrefInfo.logId; } else {}// 得到url中的参数functio ...