<resultMap type="HrMenu" id="menuResultMap">
<id property="id" column="ID" />
<result property="name" column="name" />
<result property="url" column="url" />
<result property="parentid" column="parentid" />
<result property="level" column="level" />
<result property="seq" column="seq" />
<result property="butnstyle" column="butnstyle" />
<association property="parent" column="parentid" select="HrMenu.findMenuById"></association>
<collection property="child" column="id" select="HrMenu.findMenusByParentId"></collection>
</resultMap>
<!-- 查询菜单list -->
<select id="findMenuById" parameterType="int" resultMap="menuNavResultMap">
SELECT * FROM hr_menu where id=#{id} order by seq
</select>
<!-- 查询菜单list -->
<select id="findMenusByParentId" parameterType="int" resultMap="menuResultMap">
SELECT * FROM hr_menu where parentid=#{id} order by seq asc
</select>
方法:在系统运行过程中,针对不同数据库类型区分加载不同文件路径下的sqlmap配置。留给开发人员做的事依旧是快乐地编写原始数据库语句,而不再为多数据库兼容问题挠头。分析问题:
1、解决ibatis多数据库兼容的问题,实际上就是让ibatis可以自动选择不同数据库sqlmap配置文件。
2、打开ibatis源码工程并进行代码跟踪,最终定位到com.ibatis.sqlmap.engine.builder.xml.SqlMapConfigParser.java处,系统中运行的sqlmap节点均从这里统一转化加载的。
3、很明显SqlMapConfigParser源码中的addSqlMapNodelets负责解析“/sqlMapConfig/sqlMap”路径,即也就是sqlmap文件路径。
4、要实现“多数据库兼容”,这里改造下这个方法即可。
解决方法:
1、首选我们在节点新增一个“DBProductName”用于判断数据库种类。当然通过java.sql.DatabaseMetaData也可以获得,但这太依赖于jdbc驱动,还是手动配置保险。
2、重构SqlMapConfigParser的addSqlMapNodelets方法。
" 1)首选获得单个sqlmap文件的位置,如 sqlmap主目录\XXX.xml;
2)依据上面设置的DBProductName属性值获得数据库类型;
3)将sqlmap的文件路径重定位到运行数据库类型文件下。如 sqlmap主目录\mysql\XXX.xml,代表程序当前运行于msql数据库上,并加载系统mysql数据库对应的 sqlmap文件"
4、ok,现在ibatis支持“多数据库兼容”了(完整源码见附件)。
使用方法:
1、编译SqlMapConfigParser.java生成可运行文件SqlMapConfigParser.class(见附件),并将其覆盖添加到ibatis.jar中。
2、在系统sqlmap配置文件存放主目录如src\conf\mapping添加多数据库兼容支持的子目录,如src\conf\mapping\mysql,src\conf\mapping\oracle等
3、以实际项目需要编写多数据库sqlmap配置文件。注意:不同数据库类型需要确保具有相同的sqlmap配置文件名和sql节点名
4、在ibatis主配置文件(如sql-map-config.xml)中,指定当前程序运行数据库类型
流程:1、创建pojo类(在一对多关联关系中,应该在“一”这端的pojo有一个“多”这一端的引用,而多这端有一这端的集合引用(即聚合关联)
2、创建pojo对应的数据库表,并插入数据
3、在ibatis配置文件中配置pojo类(配置方法:SqlMappingConfig.xml文件中添加如<typeAlias alias="Key" type="com.longsky.ibatis.lock.model.Key"/>配置,下文会看到。)
4、在pojo对应的xml配置文件中配置resultMap,比如在Lock.xml文件中添加
<resultMap id="LockResult" class="Lock">
<result property="id" column="id"/><result property="lockName" column="lockName"/>
<result property="keys" column="id" select="getKeysByLockId"/>
</resultMap>
5、在需要级联查询的查询语句中使用resultMap,比如
<select id="selectAllLocks" resultMap="LockResult">
<![CDATA[
select id,lockName from lock
]]>
</select>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)