跟踪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 执行。具体的SQL 需要程序员编写,然后通过映 射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定POJO。 使用ibatis 提供的ORM机制,对业务...
- MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集,使得数据库操作更加方便。 - 它通过XML或注解配置和Java的POJOs映射成数据库中的记录。 - MyBatis提供了SQL Maps和DataAccessObjects(DAO)的...
iBatis(现称MyBatis)是一个持久层框架,它的核心概念是映射文件,用于定义SQL语句和结果集的映射关系。映射文件中包含了多个、、、等元素,每个元素对应一条SQL语句。通过合理的映射文件配置,可以实现数据库操作...
它的核心实现是 MicroKernel/Windsor,它采用 IoC 容器对系统进行运行期动态设置,主要包括 Facilities、Components、Services 三大部分。 ActiveRecord 是 Castle 中的一个重要组件,它对当前热门的 ORM 框架 ...
Spring与各种持久层技术如Hibernate、JDO和iBATIS SQL Maps等有很好的集成,提供了统一的DAO抽象层,简化了数据库操作,并且提供了异常处理机制,减少了大量重复的代码。 **其他特性**: Spring还支持其他特性,如...
- **数据层**:通过AntX和iBatis等工具进行数据持久化操作。 - **优势**:提高了系统的整体性能和可维护性,同时也更好地支持了团队协作开发。 #### 四、具体架构细节 ##### 1. 数据库层面 - **V1.0**:采用MySQL...
- **iBatis框架**:简化SQL语句的编写,提供数据库交互能力。 3. **数据层**(Oracle数据库) - **数据存储**:采用Oracle数据库进行数据持久化,确保数据安全性和一致性。 #### 四、性能优化与测试 - **系统...
这些框架包括了Java类加载器架构、JVM架构、Java技术体系、线程运行架构、Java编译与运行结构、JMS技术架构、JMX技术架构、Spring架构、Hibernate架构、iBatis架构、Struts1与Struts2架构、JBPM架构以及EJB技术架构...
- **iBatis**: 现在通常被称为MyBatis,是一个支持普通SQL查询、存储过程以及高级映射的持久层框架。 **2. 前端技术** - **JavaScript (JS)**: 基础的前端脚本语言,用于实现网页上的交互效果。 - **Ext1.0**: ...
依赖注入(DI)是一种设计模式,它允许一个对象通过构造器、工厂方法的参数或属性来定义它们对其他对象的依赖关系,然后由外部实体(通常是IoC容器)在运行期来解析这些依赖关系,并将依赖的对象注入到需要它们的...
它支持自定义SQL查询语句,提供了动态SQL的功能,可以方便地进行数据库操作。 #### 21. JavaScript应用 - JavaScript代码不仅可以嵌入HTML文档中,还可以通过外部文件引入,提高代码的组织性和可维护性。 - 使用`...