前言:我们如果要整合Ant与MySQL数据库,那么首先我们需要熟悉数据库的CRUD操作,创建用户和授权操作,以及数据库的备份和导入操作。针对数据库的基本操作我不想提及,但是我会针对我感觉重点的MySQL知识点进行说明。
一、备份及还原数据库
需要导出数据的原因有很多,一个重要的原因是用于备份数据库,而另一个原因是希望导出数据来共享。
1.1 mysqldump程序
我们可以通过mysqldump程序很方便的导入/导出数据。mysqldump程序位于mysql/bin目录中,可以把整个数据库装载到一个单独的文件文本中。这个文件包含所有重建导出的数据库所需要的SQL语句。
我在Windows的控制台下进行了测试得出的结论:执行命令,最后一定不要有分号;执行的时候与MySQL登录时一样需要指定账号和密码,例如(mysqldump -uroot -p ~或者mysqldump -uroot -proot ~)。
<1>将数据库保存到文件中
mysqldump -u账户 -p密码 [数据库] > [导出文件名称]
<2>将特定表保存到文件中
mysqldump -u账户 -p密码 [数据库] [数据表] > [导出文件名称]
注意:导出多个表的时候,在数据表之间用空格。
<3>使用查询语句
mysqldump -u账户 -p密码 -where="" [数据库] [数据表] > [导出文件名称]
下面会对-where参数进行详解。
mysqldump工具的选项
针对选项的详细介绍可以参考:mysqldump参数详细说明
下文中介绍的选项一定要注意大小写。
- --complete-insert或-c:每一个产生INSERT语句加上具体字段(列)的名称。
- --delayed-insert:在INSERT命令中加入DELAY选项。
- -F或者-flush-logs:在执行导出之前将会刷新MySQL服务器的日志。
- -f或者-force:在发生错误的情况下,仍继续导出。
- --full:将附加信息也加到CREATE TABLE的语句中。
- -l或者--lock-tables:导出数据表时服务期将会给表加锁。
- -t或者-no-create-info:该选项使得mysqldump命令不创建CREATE TABLE语句,在用户只需要数据而不需要DDL(数据库定义语句)时很方便。
- -d或者-no-data:该选项使得mysqldump命令不创建INSERT语句,在用户只需要DDL语句时,可以使用这个选项。
- --opt:此选项将打开所有会提高文件导出速度和创建一个可以更快导入的文件的选项。
- -q或者-quick:这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到时就写入文件中。
- -T path或者-tab=path:这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt。路径名是存放这两个文件的目录。(目录必须已经存在,并且命令的使用者有对文件的特权)
- -w “Where Clause”或者-where="Where Clause":筛选将要放到导出文件的数据。
1.2 Select into outfile功能
导出或导入数据的内容,不包括表的结构。
简单的应用:
SELECT * INTO OUTFILE 'D:\\tablae.sql' FIELDS TERMINATED BY ',' FROM account;
作用:从account表中导出数据到'D:\\tablae.sql',并且字段值用逗号隔开。
详细的学习可以参考:MySQL心得8-2-使用SQL语句备份和恢复表数据(非重点)
1.3 mysqlimport程序
可以把一个文本文件(text file)导入到指定的数据库和表中。
mysqlimport [数据库名称] [文本文件]
注意事项:文本文件的名称与导入到的数据表的名称需要一致;文本文件的格式必须与表中的格式一致。
常用选项:
- -d或者-delete:新数据导入数据表中之前删除数据表中的所有内容
- -f或者-force:不管是否遇到错误,都会强制继续插入数据
- -i或者--ignore:跳过或者忽略那些有相同唯一关键字的行,导入文件中的数据将被忽略
- -l或者-lock-tables:数据被插入之前锁定表,这样就防止了用户在更新数据库时其他用户的查询和更新受到影响
- -r或者-replace:这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录
- --fields-enclosed-by=char:指定文本文件中数据的记录是以什么符号括起来的,很多情况下导入的数据以双引号括起。默认的情况下导入的数据是没有被字符括起的
- --fields-terminated-by=char:指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。用户可以用此选项指定数据之间的分隔符。默认的分隔符是跳格符(TAB)
- --lines-terminated-by=str:指定文本文件中行与行之间的数据分隔字符串或分隔字符字符。默认情况下以换行符为行分隔符。可以选择用一个字符串来替代一个单个的字符:一个新行或者一个回车
二、Ant SQL任务
2.1 Ant SQL任务属性及功能
- driver属性:用于指定JDBC的驱动类名称(必须的)
- url属性:用于指定数据库连接串(必须的)
- userid属性:用于指定访问数据库的用户名称(必须的)
- password属性:用于指定数据库访问的密码(必须的)
- src属性:用于指定要执行的包含SQL语句的文件,文件中的所有SQL语句将会被执行
- encoding属性:用于指定SQL语句的文件的编码方式
- delimiter属性:用于指定SQL语句的分隔符,默认为“;”
- autocommit属性:用于设定数据库连接是否自动提交相当于JDBC中的conntection.setAutoCommit(false),默认为false
- print属性:用于指定是否从SQL语句中打印结果集,默认为false
- showheaders属性:用于指定执行SQL语句时是否打印结果集的头,默认为true
- output属性:用于指定结果集的输出文件,默认为输出到System.out中
- append属性:用于指定输出信息是否附加到或覆盖已存在的文件,默认为false
- classpath属性:用于指定JDBC驱动的位置,默认时使用系统的classpath
- classpathref属性:用于指定引用的path类型,path类型指定classpath的位置
- onerror属性:用于指定当系统出错时的处理方式。可取值continue(继续执行),stop(停止运行),abort(忽略)。默认为abort
- rdbms属性:用于指定具体的关系数据库,只有对这种数据库操作时才能运行这个任务。默认时为忽略,不需要指定具体的数据库
- version属性:用于指定关系数据库的版本,只有在指定的版本下才会执行这个任务。默认时忽略这个属性,不需要指定具体的数据库版本
- caching属性:用于指定进行加载驱动时是否使用缓存。默认为true,代表使用
- delimitertype属性:用于指定分隔符的类型是否每行只有一个分隔符。可取值为normal,代表每行分隔符可为任意多个和在任意位置,取值为rows代表该行只有一个分隔符
- keepformat属性:用于指定是否保持SQL语句的格式,当对包或存储过程操作时有用,默认为false
- escapeprocessing属性:用于指定使用Java statement对象而不替换,默认为true
当需要同时执行多个SQL语句块时,为了保证事务操作的完整性,Ant提供了<transaction>元素用于指定事务处理。当需要处理多个SQL文件时很有用。这个元素只有一个src属性用于指定transaction要执行的SQL文件。多个transaction可在一个connection中执行。
2.2 执行单个SQL文件中语句的例子
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/数据库"
userid="root"
password="root"
src="data.sql
>
</sql>
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/数据库"
userid="root"
password="root"
src="data.sql
>
</sql>
2.3 不通过文件直接执行SQL命令的例子
<sql
.....
>
sql语句
</sql>
2.4 执行包含特殊字符的SQL命令
<sql
.....
><![CDATA[
SQL语句
]]>
</sql>
.....
><![CDATA[
SQL语句
]]>
</sql>
2.5 对多个SQL文件的操作进行事务处理的例子
<sql
.....
>
<transaction src="data1.sql"/>
<transaction src="data2.sql"/>
</sql>
2.6 把操作的输出信息定向到外部文件中的例子
<sql
.....
print="yes"
output="outputfile.txt"
<classpath>
<pathelement location="/some/jdbc.jar"/>
</classpath>
>
三、使用Ant工具对MySQL进行CRUD操作
通过Ant对antbook_user表进行CRUD操作。
<?xml version="1.0"?>
<project name="sqlSample" default="execute" basedir=".">
<!-- 定义全局类库位置,包括JDBC的jar文件 -->
<path id="classpath">
<fileset dir="lib">
<include name="**/*.jar"/>
</fileset>
</path>
<!-- 执行插入和更新操作 -->
<target name="execute" >
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/antbook"
userid="antbook"
password="antbook"
classpathref="classpath"
>
insert into antbook_user (name,password,gender,email,createtime)
values('greentomato','gt',1,'abcd@antbook.com',now());
update antbook_user set email='abcd_update@antbook.com' where name='greentomato';
</sql>
</target>
<!-- 执行查询语句 -->
<target name="query" >
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/antbook"
userid="antbook"
password="antbook"
classpathref="classpath"
print="true"
>
select id,name,password,gender,email from antbook_user;
</sql>
</target>
<!-- 执行删除操作 -->
<target name="delete">
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/antbook"
userid="antbook"
password="antbook"
classpathref="classpath"
print="true"
>
delete from antbook_user where name='greentomato';
select id,name,password,gender from antbook_user;
</sql>
</target>
</project>
四、使用Ant工具导出数据到MySQL数据库
<?xml version="1.0"?>
<project name="exportDataSample" default="exportData" basedir=".">
<path id="classpath">
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</path>
<!-- 执行导出数据库到文件的操作 -->
<target name="exportData">
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/firpro"
userid="root"
password="root"
classpathref="classpath"
print="true"
>
<![CDATA[
SELECT * INTO OUTFILE 'E:\\Workspace\\ceshi\\outfile.txt' FIELDS TERMINATED BY ',' FROM account;
]]>
</sql>
</target>
</project>
五、使用Ant工具导入数据到MySQL数据库
<?xml version="1.0"?>
<project name="exportDataSample" default="execute" basedir=".">
<path id="classpath">
<fileset dir="lib">
<include name="*.jar"/>
</fileset>
</path>
<!-- 执行SQL命令 -->
<target name="execute">
<sql
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306"
userid="root"
password="root"
classpathref="classpath"
print="true"
>
<transaction src="data.sql"/>
</sql>
</target>
</project>
参考资料:
《Ant开发及整合应用详解》