跟踪ibatis 3 代码,找到获取运行期的动态sql和参数
在其它框架的dao实现,如hibernate或jdbc,可以把sql(hql)集中交给ibatis处理。基于动态sql,使得你的sql(hql)不再在代码中使用String拼接,且获得ibatis动态支持.
用于保存结果
public class IbatisSql {
private String sql;//运行期的sql,带?
private Object[] parameters;//;//运行期的参数,与?相匹配
private Class resultClass;//<select id="XXX" resultType="ZZZ">中的resultType
public Class getResultClass() {
return resultClass;
}
public void setResultClass(Class resultClass) {
this.resultClass = resultClass;
}
public void setSql(String sql) {
this.sql = sql;
}
public String getSql() {
return sql;
}
public void setParameters(Object[] parameters) {
this.parameters = parameters;
}
public Object[] getParameters() {
return parameters;
}
}
获取
/**
*
* @param id xml 中sql的id ,如 <select id="XXX">中的"XXX"
* @param parameterObject 传给这条sql的参数
* @return
*/
public IbatisSql getIbatisSql(String id, Object parameterObject) {
IbatisSql ibatisSql = new IbatisSql();
SqlSessionFactory sqlSessionFactory = ...//参考官方例子
MappedStatement ms = sqlSessionFactory.getConfiguration().getMappedStatement(id);
BoundSql boundSql = ms.getBoundSql(parameterObject);
List<ResultMap> ResultMaps=ms.getResultMaps();
if(ResultMaps!=null&&ResultMaps.size()>0){
ResultMap ResultMap = ms.getResultMaps().get(0);
ibatisSql.setResultClass(ResultMap.getType());
}
ibatisSql.setSql(boundSql.getSql());
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (parameterMappings != null) {
Object[] parameterArray = new Object[parameterMappings.size()];
MetaObject metaObject = parameterObject == null ? null : MetaObject.forObject(parameterObject);
for (int i = 0; i < parameterMappings.size(); i++) {
ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() != ParameterMode.OUT) {
Object value;
String propertyName = parameterMapping.getProperty();
PropertyTokenizer prop = new PropertyTokenizer(propertyName);
if (parameterObject == null) {
value = null;
} else if (ms.getConfiguration().getTypeHandlerRegistry().hasTypeHandler(parameterObject.getClass())) {
value = parameterObject;
} else if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)
&& boundSql.hasAdditionalParameter(prop.getName())) {
value = boundSql.getAdditionalParameter(prop.getName());
if (value != null) {
value = MetaObject.forObject(value).getValue(propertyName.substring(prop.getName().length()));
}
} else {
value = metaObject == null ? null : metaObject.getValue(propertyName);
}
parameterArray[i] = value;
}
}
ibatisSql.setParameters(parameterArray);
}
return ibatisSql;
}
分享到:
相关推荐
在ibatis日志信息中打印SQL语句的方法(个人总结)
ibatis 开发指南 和 iBATIS-SqlMaps两本图书
通过java程序查看ibatis配置文件中的sql语句(注:无法查看变量值)
主要是关于oracle ibatis 的一些sql
sql语句中用问号代替参数
[iBATIS]sql转换工具 简单哦~ 项目组自己写的哦~分享给大家了
Ibatis3,手册,Ibatis3手册,Ibatis3使用手册,Ibatis3参考手册
iBatis最全的动态SQL语句,你需要的都有,资源在于大家共享
ibatis学习 ibatis总结 ibatis ibatis ibatis
ibatis sql生成器 部署成web app 支持多数据库。
ibatis2.0+sqlserver2005环境搭建
ibatis16个常用sql语句
测试抓取ibatis日志生成的sql会有很多问号,参数填充太麻烦,所以写了一个窗口sql参数自动填充工具
ibatis常用sql语句,简单易懂,方便查询,初学者宝典
ibatis教程 输入参数详解 ibatis快速入门
动态sql拼接
ibatis sql 语句的编写 ,包括增删改查,很简单 很实用 ,对初学者是很好的选择
ibatis常用的sql语句,很全的一篇文档。。。
转ibatis动态sql - phoebus0501 - 博客园.mht
ibatis与存储过程(带输出参数的应用)