Abator——Ibatis 代码生成工具
前面讲过 Spring+Ibatis 集成开发实例课程 ,但对于 iBatis 这些配置文件有没有一种能够自动生成相关代码呢?答案是肯定的,有。在 iBatis 官方网站中介绍了一款生成 iBatis 代码工具 ——Abator! 一个 IBatis 自动生成工具,他可以帮助你生成大量的 DAO , DTO 和 sqlmap 。
下面就给大家详细介绍一下如何使用 Abator 工具来自动生成 iBatis 代码:
首先下载 Abator 插件,可以使用 link 方式将其安装到 Eclipse 中 , 也可以进行 Find And Install 来安装 ;
如果使用 link 方式进行安装,其 Abator 下载地址为: http://people.apache.org/builds/ibatis/alpha/AbatorForEclipse1.0.0.zip
( 关于 link 方式如何安装不在本文范畴,要参见 :http://blog.youkuaiyun.com/apicescn/archive/2005/03/19/323478.aspx ).
采用 Find And Install 安装 Eclipse 插件 1. 要求 eclipse3.3 , jdk1.4 以上 2. 在 eclipse 上安装 abator 插件 eclipse菜单栏 --> help --> Software Updates --> Find And Install... 在弹出的对话框中选择 “Search for new features to install” 然后点击 “next” 在对话框中点击按钮 New Remort Site... 在弹出的对话框中的 URL 输入框中填写 http://ibatis.apache.org/tools/abator , Name 输入框就随便写 abator 就行了。 点击 Finish ,安装插件,然后重新启动 eclipse
下面将介绍如何使用该插件完成自动生成 ibatis 代码的功能 : 1. 新建一个 java 工程 ( 如何建立 java 工程以及相关基础知识不在本范畴 ). 2. 在 eclipse 菜单栏中新建一个 abator 配置文件 File --> Abator for iBatis Configration File
好的,我们完成了创建配置文件,下面打开 abator 生成的配置文件:
Abator 配置文件 (abatorConfig.xml)
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE abatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN" "http://ibatis.apache.org/dtd/abator-config_1_0.dtd"
>
<
abatorConfiguration
>
<
abatorContext
>
<!--
TODO: Add Database Connection Information
-->
<
jdbcConnection
driverClass
="???"
connectionURL
="???"
userId
="???"
password
="???"
>
<
classPathEntry
location
="???"
/>
</
jdbcConnection
>
<
javaModelGenerator
targetPackage
="???"
targetProject
="???"
/>
<
sqlMapGenerator
targetPackage
="???"
targetProject
="???"
/>
<
daoGenerator
type
="IBATIS"
targetPackage
="???"
targetProject
="???"
/>
<
table
schema
="???"
tableName
="???"
>
<
columnOverride
column
="???"
property
="???"
/>
</
table
>
</
abatorContext
>
</
abatorConfiguration
>
我们需要做的是替换一些 ??? : 1. 填写 driverClass ( jdbc 驱动,例如 MySql 的就是 com.mysql.jdbc.Driver ) 2. 填写 connectionURL (连接字符串,例如MySql 的就是 jdbc:mysql://localhost:3306/ibatis ) 3. 填写 classPathEntry 的 location ( jdbc 驱动 jar 包的位置,例如: lib/mysql-connector-java-3.1.5-gamma-bin.jar ) 4. 填写 javaModelGenerator ,生成的 DTO ( java model 类) targetPackage:目标包的位置,如 com.etong.test.daomain targetProject :目标源文件夹位置,如:../test/src/main/java/ 5. 填写 sqlMapGenerator ,生成的 xml sqlmap 的相关配置 targetPackage:目标位置,如 .表示放在该目标源文件夹的根目录下. targetProject :目标源文件夹位置,如:../test/src/main/resources/ 6. 填写 daoGenerator ,生成的 DAO 的相关配置 type:生成的 dao 实现的类型,如果你使用 spring 的话写 SPRING ,否则写 IBATIS targetPackage :目标位置,如 com.etong.test.dao targetProject :目标源文件夹位置,如:../test/src/main/java/ 7. 配置相关数据库的表 schema:数据库 schema (如果是 oracle 就是填写数据库的用户名) tableName:表名 columnOverride:表的字段名.
修改后的abatorConfig.xml配置文件内容如下:
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE abatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Abator for iBATIS Configuration 1.0//EN" "http://ibatis.apache.org/dtd/abator-config_1_0.dtd"
>
<
abatorConfiguration
>
<
abatorContext
>
<
jdbcConnection
driverClass
="com.mysql.jdbc.Driver"
connectionURL
="jdbc:mysql://localhost:3306/ibatis"
userId
="Allen"
password
="Allen"
>
<
classPathEntry
location
="lib/mysql-connector-java-3.1.5-gamma-bin.jar"
/>
</
jdbcConnection
>
<
javaTypeResolver
>
<
property
name
="forceBigDecimals"
value
="false"
/>
</
javaTypeResolver
>
<
javaModelGenerator
targetPackage
="com.etong.test.daomain"
targetProject
=".. estsrcmainjava"
>
<
property
name
="enableSubPackages"
value
="true"
/>
<
property
name
="trimStrings"
value
="true"
/>
</
javaModelGenerator
>
<
sqlMapGenerator
targetPackage
="."
targetProject
=".. estsrcmain esources"
>
<
property
name
="enableSubPackages"
value
="true"
/>
</
sqlMapGenerator
>
<
daoGenerator
type
="SPRING"
targetPackage
="com.etong.test.dao"
targetProject
=".. estsrcmainjava"
>
<
property
name
="enableSubPackages"
value
="true"
/>
</
daoGenerator
>
<
table
schema
="ibatis"
tableName
="ibatis"
>
<
property
name
="useActualColumnNames"
value
="true"
/>
<
generatedKey
column
="ID"
sqlStatement
="ORACLE"
identity
="true"
/>
<
columnOverride
column
="id"
property
="id"
/>
<
columnOverride
column
="name"
property
="name"
/>
</
table
>
</
abatorContext
>
</
abatorConfiguration
>
配置完这个 xml 文件以后 , 下面就可以开始自动自成 iBatis 的相关文件了,有三种方法可供选择,具体做法如下:
一、 在配置文件上点击右键,选择 “Generate iBatis Artifacts” ,即可生成所有的 java 文件以及 sqlmap 配置文件等等,但这种方式在 Eclipse 中需要先运行 abator 这个程序,所以不太好用,不建议使用。
二、 使用 Ant 来构建, Ant 配置文件如下所示:
<?
xml version="1.0" encoding="GBK"
?>
<!--
作者:Allen create date: 2007-08-20
-->
<
project
name
="test"
default
="compile"
basedir
="."
>
<!--
properies 源文件夹
-->
<
property
name
="src.dir"
value
="src/main/java"
/>
<
property
name
="main.resource.dir"
value
="src/main/resources"
/>
<
property
name
="junitsrc.dir"
value
="src/test/java"
/>
<
property
name
="junitsrc.resource.dir"
value
="src/test/resources"
/>
<
property
name
="generated.source.dir"
value
="${basedir}"
/>
<!--
temporary build directory names 编译及引用类库文件夹
-->
<
property
name
="classes.dir"
value
="target/classes"
/>
<
property
name
="lib.dir"
value
="lib"
/>
<
property
name
="dist.dir"
value
="dist"
/>
<
property
name
="doc.dir"
value
="doc"
/>
<!--
单元测试和Todo报告文件夹
-->
<
property
name
="junit.dir"
value
="junit"
/>
<
property
name
="report.main.dir"
value
="report/main"
/>
<
property
name
="report.test.dir"
value
="report/test"
/>
<!--
定义classpath
-->
<
path
id
="master-classpath"
>
<!--
替换如下方式 <fileset file="${lib.dir}/*.jar" />
-->
<!--
也可以写成如下方式,此方式同上面方式基本一致,这种方式可以通过include来限定 导入的类库,如果不限定即可使用通配符**/*来替代!
-->
<
fileset
dir
="${lib.dir}"
>
<
include
name
="**/*.jar"
/>
</
fileset
>
<
pathelement
path
="${classes.dir}"
/>
</
path
>
<!--
初始化开始任务
-->
<
target
name
="init"
>
<
mkdir
dir
="${src.dir}"
/>
<
mkdir
dir
="${main.resource.dir}"
/>
<
mkdir
dir
="${junitsrc.dir}"
/>
<
mkdir
dir
="${junitsrc.resource.dir}"
/>
<
mkdir
dir
="${classes.dir}"
/>
<
mkdir
dir
="${lib.dir}"
/>
<
mkdir
dir
="${dist.dir}"
/>
</
target
>
<!--
清除任务
-->
<
target
name
="clean"
>
<
delete
dir
="${classes.dir}"
/>
</
target
>
<!--
清除所有任务
-->
<
target
name
="cleanAll"
depends
="clean"
>
<
delete
dir
="${src.dir}"
/>
<
delete
dir
="${main.resource.dir}"
/>
<
delete
dir
="${junitsrc.dir}"
/>
<
delete
dir
="${junitsrc.resource.dir}"
/>
<
delete
dir
="${dist.dir}"
/>
<
delete
dir
="${doc.dir}"
/>
<
delete
dir
="${junit.dir}"
/>
<
delete
dir
="${report.main.dir}"
/>
<
delete
dir
="${report.test.dir}"
/>
</
target
>
<!--
================================= target: prepart 记录构建时间 =================================
-->
<
target
name
="prepart"
depends
="init"
description
="create the build dirdctories prior to a compile"
>
<
tstamp
>
<
format
property
="now"
pattern
="MMMM d yyyy hh:mm aa"
/>
<
format
property
="hour_earlier"
pattern
="MMMM d yyyy hh:mm aa"
offset
="-1"
unit
="hour"
/>
<
format
property
="minute_later"
pattern
="MMMM d yyyy hh:mm aa"
offset
="1"
unit
="minute"
/>
</
tstamp
>
<
echo
>
now=${now}
</
echo
>
</
target
>
<!--
编译
-->
<
target
name
="compile"
depends
="prepart"
description
="compile the source files"
>
<
javac
srcdir
="${src.dir}:${junitsrc.dir}"
destdir
="${classes.dir}"
target
="1.4"
>
<
classpath
refid
="master-classpath"
/>
</
javac
>
<
copy
todir
="${classes.dir}"
>
<
fileset
dir
="${main.resource.dir}"
includes
="**/*.properties"
/>
<
fileset
dir
="${main.resource.dir}"
includes
="**/*.xml"
/>
<!--
copy the primary program and modules
-->
<
fileset
dir
="${junitsrc.resource.dir}"
includes
="*.properties"
/>
<
fileset
dir
="${junitsrc.resource.dir}"
includes
="**/*.xml"
/>
</
copy
>
</
target
>
<!--
生成ToDo报告,这个target依赖的库有 commons-collections-2.1.jar commons-logging.jar
-->
<
target
name
="todo"
depends
="init"
>
<
mkdir
dir
="${report.main.dir}"
/>
<
mkdir
dir
="${report.test.dir}"
/>
<
docdoclet
destdir
="${report.main.dir}"
>
<
fileset
dir
="${src.dir}"
>
<
include
name
="**/*.java"
/>
</
fileset
>
<
info
/>
</
docdoclet
>
<
docdoclet
destdir
="${report.test.dir}"
>
<
fileset
dir
="${junitsrc.dir}"
>
<
include
name
="**/*.java"
/>
</
fileset
>
<
info
/>
</
docdoclet
>
</
target
>
<!--
单元测试
-->
<
target
name
="junit"
depends
="compile"
description
="run junit test"
>
<
mkdir
dir
="${junit.dir}"
/>
<
junit
printsummary
="on"
haltonfailure
="false"
failureproperty
="tests.failed"
showoutput
="true"
>
<
classpath
refid
="master-classpath"
/>
<
formatter
type
="plain"
/>
<
batchtest
todir
="${junit.dir}"
>
<
fileset
dir
="${classes.dir}"
>
<
include
name
="**/*Test.*"
/>
</
fileset
>
</
batchtest
>
</
junit
>
<
fail
if
="tests.failed"
>
*********************************************************** **** One or more tests failed! Check the output ... **** ***********************************************************
</
fail
>
</
target
>
<!--
打包成jar
-->
<
target
name
="jar"
depends
="compile"
description
="make .jar file"
>
<
delete
file
="${dist.dir}/${ant.project.name}.jar"
>
</
delete
>
<
jar
jarfile
="${dist.dir}/${ant.project.name}.jar"
basedir
="${classes.dir}"
>
<
exclude
name
="**/*Test.*"
/>
<
exclude
name
="**/Test*.*"
/>
</
jar
>
</
target
>
<
target
name
="rebuild"
depends
="clean,init,compile,jar"
>
</
target
>
<!--
输出api文档
-->
<
target
name
="doc"
depends
="jar"
description
="create api doc"
>
<
mkdir
dir
="${doc.dir}"
/>
<
javadoc
destdir
="${doc.dir}"
author
="true"
version
="true"
use
="true"
windowtitle
="Test API"
>
<
packageset
dir
="${src.dir}"
defaultexcludes
="yes"
>
<
include
name
="*/**"
/>
</
packageset
>
<
doctitle
>
<![CDATA[
<h1>Hello, test</h1>
]]>
</
doctitle
>
<
bottom
>
<![CDATA[
<i>All Rights Reserved.</i>
]]>
</
bottom
>
<
tag
name
="todo"
scope
="all"
description
="To do:"
/>
</
javadoc
>
</
target
>
<!--
自动生成iBatis相关代码和sqlMap配置文件
-->
<
target
name
="genfiles"
description
="Generate the files"
>
<
taskdef
name
="abator"
classname
="org.apache.ibatis.abator.ant.AbatorAntTask"
classpath
="${lib.dir}/abator.jar"
/>
<
abator
overwrite
="true"
configfile
="${main.resource.dir}/abatorConfig.xml"
verbose
="false"
>
<
propertyset
>
<
propertyref
name
="${generated.source.dir}"
/>
</
propertyset
>
</
abator
>
</
target
>
</
project
>
然后运行“genfiles”此任务即可看到生成的java代码以及sqlMap的配置文件(此方法推荐)。
三、 可以使用 java 类来自动生成,类代码内容如下:
package
com.etong.test.test;
import
java.io.File;
import
java.io.IOException;
import
java.sql.SQLException;
import
java.util.ArrayList;
import
java.util.List;
import
org.apache.ibatis.abator.api.Abator;
import
org.apache.ibatis.abator.config.AbatorConfiguration;
import
org.apache.ibatis.abator.config.xml.AbatorConfigurationParser;
import
org.apache.ibatis.abator.exception.InvalidConfigurationException;
import
org.apache.ibatis.abator.exception.XMLParserException;
import
org.apache.ibatis.abator.internal.DefaultShellCallback;
public
class
TestClient
...
{ public static void main(String[] args) ... { List warnings = new ArrayList(); // Abator will add Strings to this // list boolean overwrite = true ; File configFile = new File( " abatorConfig.xml " ); AbatorConfigurationParser cp = new AbatorConfigurationParser(warnings); AbatorConfiguration config = null ; try ... { config = cp.parseAbatorConfiguration(configFile); } catch (IOException e1) ... { e1.printStackTrace(); } catch (XMLParserException e1) ... { e1.printStackTrace(); } DefaultShellCallback callback = new DefaultShellCallback(overwrite); Abator abator = new Abator(config, callback, warnings); try ... { abator.generate( null ); } catch (InvalidConfigurationException e) ... { e.printStackTrace(); } catch (SQLException e) ... { e.printStackTrace(); } catch (IOException e) ... { e.printStackTrace(); } catch (InterruptedException e) ... { e.printStackTrace(); } } }
最后运行此类即可看到生成的文件!