`

Ibatis中获得执行的SQL及字段信息

    博客分类:
  • ORM
阅读更多
import com.ibatis.sqlmap.engine.mapping.result.ResultMapping;

/**
 * @description Ibatis Sql 实体类
 * @author 杨惠
 * @version 1.0
 * @date 2010-8-13
 */

public class IbatisSql {

	// SQL语句
	private String sql = "";
	// SQL字段信息
	private ResultMapping[] resultMappings = null;

	/**
	 * 获得:SQL语句
	 * 
	 * @return the sql
	 */

	public final String getSql() {
		return sql;
	}

	/**
	 * 设置:SQL语句
	 * 
	 * @param sql
	 *            the sql to set
	 */

	public final void setSql(String sql) {
		if (sql != null) {
			this.sql = sql;
		}
	}

	/**
	 * 获得:SQL字段信息
	 * 
	 * @return the resultMappings
	 */

	public final ResultMapping[] getResultMappings() {
		return resultMappings;
	}

	/**
	 * 设置:SQL字段信息
	 * 
	 * @param resultMappings
	 *            the resultMappings to set
	 */

	public final void setResultMappings(ResultMapping[] resultMappings) {
		if (resultMappings != null) {
			this.resultMappings = resultMappings;
		}
	}

}


import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.engine.mapping.result.ResultMapping;
import com.ibatis.sqlmap.engine.mapping.sql.Sql;
import com.ibatis.sqlmap.engine.mapping.statement.MappedStatement;
import com.ibatis.sqlmap.engine.scope.SessionScope;
import com.ibatis.sqlmap.engine.scope.StatementScope;

/**
 * @description Ibatis SQL公共类
 * @author 杨惠
 * @version 1.0
 * @date 2010-8-13
 */

public class IbatisUtil {


	/**
	 * 获得Ibatis 执行参数,并转成实体类IbatisSql
	 * 
	 * @param id
	 *            SQL的ID
	 * @param sqlMapClient
	 *            com.ibatis.sqlmap.client.SqlMapClient;
	 * @param parameterObject
	 *            参数对象
	 * @return IbatisSql
	 */
	public static final IbatisSql getIbatisSql(String id,
			SqlMapClient sqlMapClient, Object parameterObject) {
		IbatisSql ibatisSql = new IbatisSql();
		MappedStatement mappedStatement = sqlMapClient.getDelegate()
				.getMappedStatement(id);
		Sql sql = mappedStatement.getSql();
		SessionScope sessionScope = new SessionScope();
		sessionScope.incrementRequestStackDepth();
		StatementScope statementScope = new StatementScope(sessionScope);
		mappedStatement.initRequest(statementScope);
		String strSql = sql.getSql(statementScope, parameterObject);
		strSql = strSql != null ? strSql.trim().toLowerCase() : strSql;
		ibatisSql.setSql(strSql);// 设置SQL语句
		ResultMapping[] resultMappingsArray = statementScope.getResultMap().getResultMappings();//获得字段信息
		ibatisSql.setResultMappings(resultMappingsArray);
		sql.cleanup(statementScope);
		sessionScope.cleanup();
		mappedStatement = null;
		sql = null;
		sessionScope = null;
		statementScope = null;
		id = null;
		parameterObject = null;
		return ibatisSql;
	}

}
修改Ibatis源码:
在SqlMapExecutor接口中增加如下代码:
  public abstract SqlMapExecutorDelegate getDelegate();

调用示例:
XML:返回一个List<HashMap>类型
	<select id="queryBusiTypeBySettleDateAsList" parameterClass="spBalance"
		resultClass="java.util.HashMap">
		select s.applicationtypeid as applicationtypeid,d.pname as
		busitypename from (select ApplicationTypeID from tb_spbalance
		where settledate=#settleDate# group by ApplicationTypeID)
		s,tb_datadict_collection d where d.spbusitype='Mobile' and
		d.property='BusiType' and s.ApplicationTypeID=d.pvalue order by d.seq asc
	</select>
代码:
	@SuppressWarnings("unchecked")
	public List<List<String>> queryBusiTypeBySettleDateAsList(
			SPBalance spBalance) {
               //必须先执行查询方法
		List<Map<?, ?>> listMap = sqlClient.queryForList( "queryBusiTypeBySettleDateAsList", spBalance);
               //然后调用此方法才能获得SQL及字段信息
		IbatisSql ibatisSql = IbatisUtil.getIbatisSql("queryBusiTypeBySettleDateAsList", this
				.getSqlMapClient(), spBalance);
		return CommonCovert.listMapToList(listMap, ibatisSql);
	}
0
0
分享到:
评论
4 楼 huiy 2010-08-17  
List<Map>的数据是无序的,只有自己在规定字段顺序的情况,才能显示有序结果集。但是有些时候你根本无法知道字段的数目及具体名称。
3 楼 huiy 2010-08-17  
1.版本是2.3.4
2.有些情况是需要这些信息的,只是你没有遇到罢了
2 楼 abear 2010-08-17  
多此一举,
1 楼 qq123zhz 2010-08-17  
ibatis2?

相关推荐

    ibatis常用sql语句

    ibatis常用sql语句,简单易懂,方便查询,初学者宝典

    根据MyBatis或iBatis的SQLMapper文件反向生成数据库表

    生成数据库表结构: 根据解析得到的SQL语句中的表名、字段名、数据类型等信息,动态地生成相应的数据库表结构。这可以通过编程语言与数据库操作的API来实现,比如Java中的JDBC或者MyBatis/iBatis提供的API。 执行SQL...

    Mygeneration_1309_20081006—IBatis_SQL映射+实体模板

    压缩包里包括Mygeneration_1309_2008100代码生成软件,自带IBatisObject模板,可根据数据库字段生成实体类和SQLMapping映射文件。

    ASP.NET MVC+iBatis+SQL

    前段时间学习Ibatis,没事整理出来的demo,大家可以参考一下,程序中数据库名是SSH,表名是Test,字段是id主键自增 name address 数据库自己建哦

    SQL参数自动填充工具

    测试抓取ibatis日志生成的sql会有很多问号,参数填充太麻烦,所以写了一个窗口sql参数自动填充工具

    iBATIS介绍入门

    iBATIS是以SQL为中心的持久化层框架。能支持懒加载、关联查询、继承等特性。 iBATIS不同于一般的OR映射框架。OR映射框架,将数据库表、字段等映射到类、属性,那是一种元数据(meta-data)映射。iBATIS则是将SQL查询的...

    在java控制台提取sql语句

    在java的控制台中看到的sql日志通常是如下的样子, Preparing: SELECT in (0,1) ORDER BY i.UPDATE_DATE_TIME DESC 2019-01-18 10:12:52,566 [DEBUG](org.apache.ibatis.logging.log4j.Log4jImpl.debug(Log4jImpl....

    ibatis的一个CRUD

    体现了Ibatis的作用及优点: 1.Ibatis的优点 (1) Ibatis更容易进行数据库优化。从配置文件中优化sql语句。 (2) ibatis可以进行细度优化。可以针对一个表中一个或几个字段进行更新等操作。Hibernate会更新所有的...

    IBatis多数据库,可通过配置指定不同的实体使用不同的数据库

    1.每个实体类需要配置各自的“SqlMap.config”在“config/SysConfig.xml”中,SqlMap,db1.Db1SqlMap就是“ibatis/db1/Db1SqlMap.config”,不同的db将分配不同的mapper类。 2.数据库链接统一放在“config/ibatis/...

    iBatis入门Helloworld

    iBatis的最简单的Helloworld工程,解压后可以直接在eclipse中使用。 需要你自己在SQL Server中创建表:UserVo,字段:id、name、sex、age。

    maven3+struts2+spring+ibatis

    maven3+struts2+spring+ibatis,本来是用maven3+struts2+spring+hibernate但考虑到hibernate在多表级联查询的时候执行效率不高,所以改用性能更好不过sql比较麻烦的的ibatis,本项目只有登录和插入数据,仅供参考: ...

    iBATIS教程

    一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立 iBATIS则与之不同,它不是直接在类与数据表或字段与列之间进行关联,而是把SQL语句的参数(parameter)和返回结果(result)映射至类。...

    ibatis 开发指南

    也就是说,ibatis 并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映 射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 使用ibatis 提供的ORM机制,对业务...

    ibatis 开发指南(pdf)

    也就是说,ibatis 并不会为程序员在运行期自动生成SQL 执行。具体的SQL 需要程序员编写,然后通过映 射配置文件,将SQL 所需的参数,以及返回的结果字段映射到指定POJO 。 使用ibatis 提供的ORM 机制,对...

    Java iBatis源码范例和教程

    一个映射层,在对象和数据库间传递数据,并保持两者与映射层本身相独立 iBATIS则与之不同,它不是直接在类与数据表或字段与列之间进行关联,而是把SQL语句的参数(parameter)和返回结果(result)映射至类。...

    iBATIS技术教程PPT和代码.rar

    程序员甚至不需要对 SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的 SQL 并调用 JDBC 接口加以执行。 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL...

    最简单的ibatiS实现增删改查

    5分绝对不会让你失望,数据库没有上传,我用的sqlserver,有个student数据库,student表,3个字段。 自己建一个,另外不要忘了改数据库连接。

    SSI STRUTS+SPRING+IBATIS框架搭建

    精简了jar包,只导入必要jar包 更改其他数据库需要导入数据库jar包,以及利用ABATOR生成代码 建立一个sqlserver的数据库 为test test表,字段ID,name两个字段

    AppFramework_V1.0

    1.1 引言 约有90%的企业信息化管理系统基于数据库实现,这类系统中又有超过30%的代码集中在数据访问层负责业务数据存取。除了实现数据的增删改查,数据访问层还要提供一些与业务无关功能,例如面向对象的持久化与...

    ibatis的SqlMap辅助生成工具

    工具的使用,我写了一个说明。 功能: 能节省写SqlMap的时间,和创建实体的时间。 而且快捷准确,不必担心sql语句会写错,或者字段对应不上

Global site tag (gtag.js) - Google Analytics