`

Ibator支持分页的plugin

    博客分类:
  • JAVA
阅读更多

首先声明:该文章 参照了http://www.iteye.com/topic/674839   matychen  的文章,修改了一下ibator的工作方式,实际分页的原理还是一样的,支持oracle,mysql   , 如果涉及侵犯matychen的利益,请告知,我立即删除

 

/**

 *

 * @author coffeesweet

 *

 */

Ibator支持分页的plugin式的开发步骤

 

1:所涉及到修改的类列表:

org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements目录下所有的类里给attribute属性的id修改成如下:

FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable();
        answer.addAttribute(new Attribute("id", table.getSqlMapNamespace() + "."+XmlConstants.INSERT_STATEMENT_ID));

 

其他修改和添加的类

org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements---OraclePaginationHeadGenerator   

org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements---OraclePaginationTailGenerator   

org.apache.ibatis.ibator.generator.ibatis2.sqlmap.elements---MysqlPaginationLimitGenerator   

org.apache.ibatis.ibator.generator.ibatis2.model---ExampleGenerator

org.apache.ibatis.ibator.api.dom.java---FullyQualifiedJavaType

 

 org.apache.ibatis.ibator.api.dom.xml.XmlElement添加了四个方法,主要用于对xxxx_SqlMap.xml的元素删除和修改

 这个是添加的plugin

org.apache.ibatis.ibator.plugins.PaginationPlugin

 

以上所有修改的类搜索增加开始或者增加结束就能找到修改的地方

 

2:示例ibatorConfig.xml文件

 

一定要注意该xml的元素顺序

 

<classPathEntry标签的位置在<ibatorConfiguration>子元素的第一个位置

ibatorContext 的子元素顺序是

(property*, ibatorPlugin*, commentGenerator?, jdbcConnection, javaTypeResolver?,

 javaModelGenerator, sqlMapGenerator, daoGenerator?, table+)

所以需要注意ibatorPlugin的位置,还有,如果有多个plugin的话,加入第一个的validate失败,那么余下的所有plugin都不执行了

 

还要注意ibatorPlugin的两个必要属性

<property name="enablePagination" value="true" />

        <property name="dbType" value="oracle" />

 

示例ibatorConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE ibatorConfiguration PUBLIC "-//Apache Software Foundation//DTD Apache iBATIS Ibator Configuration 1.0//EN" "http://ibatis.apache.org/dtd/ibator-config_1_0.dtd" >

<ibatorConfiguration>

 

    <classPathEntry location="oracle驱动的本地绝对路径" />

    <ibatorContext id="context1" targetRuntime="Ibatis2Java5">

   

    <!--

    <ibatorPlugin type="org.apache.ibatis.ibator.plugins.RenameExampleClassPlugin">

            <property name="searchString" value="Example$" />

            <property name="replaceString" value="Criteria" />

    </ibatorPlugin>

     -->

    

     <ibatorPlugin type="org.apache.ibatis.ibator.plugins.PaginationPlugin">

        <property name="enablePagination" value="true" />

        <property name="dbType" value="oracle" />

     </ibatorPlugin>

     <!--

     <ibatorPlugin type="org.apache.ibatis.ibator.plugins.SerializablePlugin"></ibatorPlugin>

      -->

    

       <jdbcConnection driverClass="oracle.jdbc.driver.OracleDriver"

           connectionURL="jdbc:oracle:thin:@*.*.*.*:1521:**" userId="**"

           password="**" />

 

       <javaTypeResolver>

           <property name="forceBigDecimals" value="false" />

       </javaTypeResolver>

 

 

       <javaModelGenerator targetPackage="com.mydomain.model"

           targetProject="src">

           <property name="enableSubPackages" value="false" />

           <property name="trimStrings" value="false" />

       </javaModelGenerator>

 

       <sqlMapGenerator targetPackage="com.mydomain.xml"

           targetProject="src">

           <property name="enableSubPackages" value="false" />

       </sqlMapGenerator>

 

       <daoGenerator type="SPRING" targetPackage="com.mydomain.dao"

           targetProject="src">

           <property name="enableSubPackages" value="false" />

       </daoGenerator>

 

 

       <table tableName="CC_TEST1" domainObjectName="Customer">

           <!-- columnOverride column="???" property="???" / -->

       </table>

      

             

    </ibatorContext>

</ibatorConfiguration>

 

3:以下是ibatorjava启动模式,用来测试

package org.apache.ibatis.ibator.test;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.apache.ibatis.ibator.api.Ibator;
import org.apache.ibatis.ibator.config.IbatorConfiguration;
import org.apache.ibatis.ibator.config.xml.IbatorConfigurationParser;
import org.apache.ibatis.ibator.internal.DefaultShellCallback;

public class IbatorRunTest {
	
	public static void main(String...strings){
		try{
			List<String> warnings = new ArrayList<String>();
			   boolean overwrite = true;
			   File configFile = new File(ClassLoader.getSystemResource("ibatorConfig.xml").getFile());
//			   File configFile = new File("ibatorConfig.xml");
			   IbatorConfigurationParser cp = new IbatorConfigurationParser(warnings);
//			   for(String warning:warnings){
//				   System.out.println("1---:"+warning);
//			   }
			   IbatorConfiguration config = cp.parseIbatorConfiguration(configFile);
			   DefaultShellCallback callback = new DefaultShellCallback(overwrite);
			   Ibator ibator = new Ibator(config, callback, warnings);
			   ibator.generate(null);
			   for(String warning:warnings){
				   System.out.println("2---:"+warning);
			   }
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
	
	

}

 

 

 

4:附件是ibator的修改后的源码(包括spring的lib)和jar包,以及测试case

  源码里的有关数据连接信息的东西请自行修改

测试用到了spring

ibator.jar可直接拿到工程中使用

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论
4 楼 matychen 2010-10-14  
surpass_li 写道
我觉得还是修改它的dao Generator 相关方法,使用 list = getSqlMapClientTemplate().queryForList("TESTUSER.ibatorgenerated_selectByExample", example,startRow, pageSize);  这样的方式更通用一些吧:)

困惑的是,这种方式和我手写的sql分页是一样的吗?

今天比较困惑那种的效率高点。

this.smcTemplate.queryForList("find...", map,start,limit);(打印出来的好像是直接写的sql,并没有输入的分页参数)

还是嵌套的分页效率高?

请人解释一下。


3 楼 surpass_li 2010-09-06  
我觉得还是修改它的dao Generator 相关方法,使用 list = getSqlMapClientTemplate().queryForList("TESTUSER.ibatorgenerated_selectByExample", example,startRow, pageSize);  这样的方式更通用一些吧:)
2 楼 coffeesweet 2010-07-22  
<div class="quote_title">matychen 写道</div>
<div class="quote_div">
<div class="quote_title">
<strong>请继续更新,</strong><span style="font-weight: normal;"><img src="/images/smiles/icon_biggrin.gif" alt=""></span> </div>
<div class="quote_title">你这个貌似更方便一点。</div>
<div class="quote_title">刚刚看了下你的代码,不知道这个是不是为了配置方便,只在一个地方配置一次就能把所有的表都用一个分页?</div>
<div class="quote_title">能说下用法吗?</div>
</div>
<p> </p>
<p>呵呵,你原来是把分页控制配置在了<span style="color: #333399;">&lt;table</span>里,就像你说的ibator的xml验证会报错,我现在是把分页信息统一配置在<span style="font-size: x-small; color: #3f5fbf;">&lt;ibatorPlugin <span style="color: #000000;">里,这个标签是可以自定义属<span style="font-size: small;">性的,ibator的dtd也支持,配置了这个以后,如果有多个&lt;table的话,他们生成的Example类里都会包含分页信息的.</span></span></span></p>
<p><span style="font-size: small;">你可以把附件的ibator.jar替换你的ibator的eclipseplugin里,或者是直接在工程里加入ibator.jar,然后运行我给的IbatorRunTest 类生成相关class和XXX_sqlMap.xml</span></p>
<p> </p>
<p><span style="font-size: small;">其实就是借鉴你的思路,我照抄修改了一下</span></p>
1 楼 matychen 2010-07-21  
<div class="quote_title">你这个貌似更方便一点。</div>
<div class="quote_title">刚刚看了下你的代码,不知道这个是不是为了配置方便,只在一个地方配置一次就能把所有的表都用一个分页?</div>
<div class="quote_title">能说下用法吗?</div>

相关推荐

Global site tag (gtag.js) - Google Analytics