问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

用ant脚本执行sql语句

发布网友 发布时间:2022-05-03 07:17

我来回答

4个回答

懂视网 时间:2022-05-03 11:39

数据备份对于经常在运维部署方面的工作者来说,是一件相对简单的事情,都可以通过某一个SQL工具进行备份,但是如果在项目运行当中,我们需要对数据进行实时,或者是每隔一星期,一个月,等等进行数据的备份,这样就需要java工具来操作备份SQL文件,目前可以通过调用mysql安装的命令进行数据备份,另外通过Job任务调度器进行配合使用,这里技术选型为Quartz。

在下面代码当中address为SQL脚本文件存放的地址。

其中path为mysql的安装位置:

D:mysqlmysql-5.6.35-winx64in

public Map<String, Object> exportDatabase(String address) {
Map<String, Object> resultMap = new HashedMap();
try {
String path = PropertiesFileUtil.getInstance("sql").get("path");
String root = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.username");
String dataBase = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.dataBase");
String table = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.table");
String password = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.password");
String sqlName = System.currentTimeMillis() + ".sql";
Runtime rt = Runtime.getRuntime();
Process child = rt.exec(path + "mysqldump -u" + root + " -p" + password + " -R -c --set-charset=utf8 " + dataBase + " " + table + "");
InputStream in = child.getInputStream();
InputStreamReader xx = new InputStreamReader(in, "utf8");
String inStr;
StringBuffer sb = new StringBuffer("");
String outStr;
BufferedReader br = new BufferedReader(xx);
while ((inStr = br.readLine()) != null) {
sb.append(inStr + "
");
}
outStr = sb.toString();

FileOutputStream fout = new FileOutputStream(address + "/" + sqlName);
OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8");
writer.write(outStr);
writer.flush();
in.close();
xx.close();
br.close();
writer.close();
fout.close();
resultMap.put("result", "success");
resultMap.put("data", address + "/" + sqlName);
return resultMap;
} catch (Exception e) {
e.printStackTrace();
}
resultMap.put("result", "fail");
resultMap.put("data", "地址选择有可能出现问题");
return resultMap;
}

 

 

上述代码当中主要的是用到了Runtime,Runtime封装了运行环境,每一个java运行实例都有一个Runtime类为实例,使程序能够与其环境相接。

一般不能实例化一个Runtime对象,应用程序不能创建自己的Runtime实例,但是可以通过getRuntime的方法获取当前Runtime运行时对象的引用。

一旦得到当前的Runtime对象的引用,就可以调用Runtime对象的方法去控制java虚拟机的状态和行为。

执行SQL脚本,我们可以通过ant来实现,首先我们引入ant的jar包

<!-- https://mvnrepository.com/artifact/org.apache.ant/ant -->
<dependency>
<groupId>org.apache.ant</groupId>
<artifactId>ant</artifactId>
<version>1.7.1</version>
</dependency>

 

 

public Map<String, Object> importDatabase(String filepath) {
Map<String, Object> resultMap = new HashedMap();
try {
String username = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.username");
String password = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.password");
String url = PropertiesFileUtil.getInstance("sql").get("sql.jdbc.url");
String driverClassName =PropertiesFileUtil.getInstance("sql").get("sql.jdbc.driver");
String filepathName = filepath.substring(0, filepath.lastIndexOf("."));
String outputPath = filepathName + ".out";

SQLExec sqlExec = new SQLExec();
//设置数据库参数
sqlExec.setDriver(driverClassName);
sqlExec.setUrl(url);
sqlExec.setUserid(username);
sqlExec.setPassword(password);
//设置字符编码
sqlExec.setEncoding("UTF-8");
//要执行的脚本
sqlExec.setSrc(new File(filepath));
//有出错的语句该如何处理
sqlExec.setOnerror((SQLExec.OnError) (EnumeratedAttribute.getInstance(
SQLExec.OnError.class, "abort")));
sqlExec.setPrint(true); //设置是否输出
//输出到文件 sql.out 中;不设置该属性,默认输出到控制台
sqlExec.setOutput(new File(outputPath));
sqlExec.setProject(new Project()); // 要指定这个属性,不然会出错
sqlExec.execute();
logger.info("执行sql脚本文件成功");
resultMap.put("result", "success");
} catch (Exception e) {
logger.info("执行sql脚本文件失败");
e.printStackTrace();
resultMap.put("result", "fail");
return resultMap;
}
return resultMap;
}

 

技术图片

欢迎关注微信公众号:摘星族,我们在等待您的加入。 

技术图片技术图片?

Java实现数据库备份并利用ant导入SQL脚本

标签:src   工作   默认   控制台   buffered   inpu   epo   改变   bsp   

热心网友 时间:2022-05-03 08:47

<target name="initialize-database" depends="export-dbschema">
<echo message="Initializing database... If error occurs,let it be." />
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost/数据库名"
userid="root"
password="root"
src="${123.sql.dir}/werwerewr.sql"放在src目录下的123目录下的sql目录,werwerewr.sql就是sql的名字
encoding="UTF-8"
onerror="continue">
<classpath refid="classpath"/>
</sql>
</target>
build.xml命名为然后右键run。。。。

热心网友 时间:2022-05-03 10:05

两步即可:
1.将执行sql语句的命令写在一个 xx.bat文件里面
2.在build.xml脚本里 使用 exec标签来执行bat文件即可
例如:<exec executable=" xx.bat" ></exec>

你们数据库是什么数据库呢?如果是oracle数据库,那么执行sql语句的命令是用 sqlplus user/pwd@db example.sql

关于ant脚本标签,请参考:http://hi.baidu.com/woxfy/blog/item/8359887a281899fe0ad1878d.html

热心网友 时间:2022-05-03 11:39

ant手册
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
月经不尽褐色的是怎么回事 月经前后有褐色分泌物是什么原因 二十四节气的重要意义24节气在生活中的作用 你来我往,猜一个数字? 姓谭女孩起什么名字最优雅 男孩姓谭的好名字 黄家驹在beyond的地位 黄家驹是Beyond的主唱吗? 老板对员工的新年微信 每次感冒和一些小毛病,我都是选择运动出身汗,让它自然好,请问这种方 ... 孕妇为什么会觉得恶心想吐 世嘉更换防冻液要几升 予以抵扣的进项税额和进项税额之间有什么区别啊? 什么是思维空间 什么是五维空间啊 我们地球是几维空间呀 四维空间与五维空间有什么不同 已抵扣进项税额发生不允许抵扣的情形如何处理? 世嘉防冻液多久换一次 如果人类进入四维空间,生活状态会变成什么样? 什么叫已抵扣增值税进项税 已抵扣的进项税额的购进货物,如果在投资给其他单位,应将该货物的进项税额从当期发生的进项税额中扣减? 四维空间是不是真的,怎么识别和进入思维空间? 四维空间有什么?科学家为何很愿意研究四维空间? 什么是思维空间呢? 最近一直迷上四维空间,可是又不太懂什么是思维空间。谁能解释详细一点什么是四维空间吗?谢谢了 什么是四维空间?谢谢? 世嘉车防冻液多长时间换一回 什么叫“思维空间” 世嘉怎样更换冷却液和制动液 世嘉 防冻液换一次需要加多少升 雪铁龙世嘉多久更换一次刹车油和防冻液 我再辽宁沈阳使用 世嘉漏防冻液是不是过减速带过快造成的 四维空间,人神秘的失踪。这些是怎么回事? 进项税已抵扣,但后来发现发票有问题需要重开,怎么操作 雪铁龙世嘉2.0用多少升机油,防冻液 世嘉更换防冻液需要多少升 孕妇头晕恶心怎么回事? 为孩子拓宽一片“异想天开”的思维空间,父母该怎么做? 人人网为什么我看不到好友的相册? 我的人人网看不了别人的相册,请问这是什么回事? 脚指甲发黑是啥病的预兆 请教:世嘉的防冻液是什么颜色的 已经抵扣的发票怎么做进项转出 为什么我的人人看不到相册啊,是好友啊、、、 如何能在短时间内把字给练好?能写一手漂亮的好字? 雪铁龙世嘉防冻液三通接头处漏,怎么处理?修理说要换整个三通。 思维空间的时间指的是什么? 已抵扣的增值税进项税转出处理 人人网校内为什么查看不了别人的相册? 当人类进入四维空间时会发生什么? 购进原材料时进项税额已经抵扣是什么意思 如何短时间把字写的看起来很舒服?