本文接上文
http://www.cnblogs.com/suyuan/archive/2009/04/16/1437360.html
从本篇文章开始我将逐步讲解如果通过修改Ibatis源代码实现上述功能,而本篇先介绍Ibatis下载,编译和sqlmapconfig的解析.此处我们使用的是java版本,.net版本请参考本版本.
下载:
Ibatis的官方网站http://ibatis.apache.org/
你可以通过官方网站下载最新的Ibatis源代码.
官方提供的源码中是不含依赖包的.仅仅提供了一份依赖包清单,并且还没有列全.同时官方给的清单中个别包已经升级而老版本下载已经不再提供,我们尽量找和官方提供清单中最接近的版本.否则可能会造成编译不通过.
如果你觉得麻烦,我这里提供了官方所列清单中的依赖包
/Files/suyuan/IbatisNeedlib.rar
下载源代码,并且附加了依赖包后,请注意,ibatis是在jdk1.5环境下面编译的通过,如果你选择的是jdk1.6,请更改设置,否则编译错误.
下面开始动刀了,呵呵
上篇文章中,我们已经介绍了要在sqlmaperconfig文件中增加一个节点
<BaseDirectory resource=”d:/ibatis/”/>
这个节点的作用就是指定文件系统存储根路径.
Ibatis初始化的时候会根据sql-map-2.dtd 和 sql-map-config-2.dtd 验证xml文件是否正确,如果我们之间在sqlmaperconfig 中增加该节点就会初始化出错.
首先我们修改sql-map-config-2.dtd文件

然后还要定义这个节点

完成上面的操作后,在xml中增加我们配置的节点 就不会初始化出错了.
仅仅配置完成后,并不起作用,因为还没有解析,还要增加解析的部分.
Ibatis 对xml的解析 都放在这个package com.ibatis.sqlmap.engine.builder.xml 下面
此处对于sqlmapconfig 解析的类对应的是 SqlMapConfigParser
我们只需要在这个类中增加下面一个方法,并且把这个方法放到 SqlMapConfigParser的构造方法中就可以了.

将这个方法放到构造方法中 其实就是NodeletParser中增加了一个node的处理方法.

注意 这句代码

就是把我们解析到的值赋给了一个对象的一个属性.而这个对象就是SqlMapExecutorDelegate,就是说,我们需要在这个对象中增加一个属性是
private String baseDirectory; SqlMapExecutorDelegate 仿佛一个大管家,一样,以后的改造中,我们会多次使用到该对象.
这里假如我们没有在配置文件中 配置 BaseDirectory 节点, 则默认使用当前目录
baseDirectory = System.getProperty("user.dir");
ok,到现在对于 我们就成功了增加了 BaseDirectory 节点了, 这个配置路径会和以后生成的hash路径组合成我们的文件存储路径.
本文到此结束,其余部分将在下文讲解
不知道 IbatisHelper 是什么东东的请先参看这里
http://www.cnblogs.com/suyuan/archive/2008/12/26/1362745.html
自从IbatisHelper发布以来,很多朋友给我邮件,需要源代码,以前都是通过email发个需要的人,但是随着收到的email增多,感觉一个个分发好麻烦!
索性直接在这里发布了,需要的自己下载吧!
自己认为自己的代码写的很生硬,如果哪个朋友有精力完善该功能,就再接再厉,目前这个能满足我们的需求就懒得做了.如果你们完善了 就麻烦回馈给我一份代码
废话不多说了 直接提供下载地址吧
/Files/suyuan/IbatisHelper_src.rar
如果对您有帮助 麻烦捧个人场 呵呵~~~~~~~
另外贴一个比较比较完整的sqlmap模板,目前我们生成就是用这个模板,具体应用自己改吧
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://java.plugbase.org/dtd/sql-map-2.dtd">
<sqlMap namespace="${table}">
<typeAlias alias="${table}" type="${package}.${table}"/>
<typeAlias alias="SQLPager" type="org.plugbase.sql.SQLPager"/>
<resultMap id="${table}resultMap" class="${table}">
#foreach($item in $list)
<result property="${item.name.ToLower()}" column="${item.name.ToLower()}"/>
#end
</resultMap>
<select id="Count${table}" resultClass="int">
select count(*) from ${table}
</select>
<select id="Select${table}ById" parameterClass="int" resultMap="${table}resultMap">
select * from ${table} where id=#value#
</select>
<insert id="Insert${table}" parameterClass = "${table}">
insert into ${table}
(
#foreach($item in $list)
#if(${item.name.ToLower()}!="id")
#if($velocityCount==$list.Count())
${item.name.ToLower()}
#else
${item.name.ToLower()},
#end
#end
#end
)
values
(
#foreach($item in $list)
#if(${item.name.ToLower()}!="id")
#if($velocityCount==$list.Count())
#${item.name.ToLower()}#
#else
#${item.name.ToLower()}#,
#end
#end
#end
)
</insert>
<update id="Update${table}" parameterClass = "${table}">
update ${table}
#foreach($item in $list)
#if($velocityCount==1)
set
#end
#if(${item.name.ToLower()}!="id")
#if($velocityCount==$list.Count())
${item.name.ToLower()}=#${item.name.ToLower()}#
#else
${item.name.ToLower()}=#${item.name.ToLower()}#,
#end
#end
#end
where id=#value#
</update>
<delete id="Delete${table}ById" parameterClass="int">
delete from ${table} where id=#value#
</delete>
</sqlMap>