`
liyixing1
  • 浏览: 961809 次
  • 性别: Icon_minigender_1
  • 来自: 江西上饶
社区版块
存档分类
最新评论

mybatis的参数

阅读更多
在类DynamicSqlSource
方法
public BoundSql getBoundSql(Object parameterObject) {
    DynamicContext context = new DynamicContext(configuration, parameterObject);
    rootSqlNode.apply(context);
    SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);
    Class<?> parameterType = parameterObject == null ? Object.class : parameterObject.getClass();
    SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType);
    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);
    for (Map.Entry<String, Object> entry : context.getBindings().entrySet()) {
      boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());
    }
    return boundSql;
  }
第一行DynamicContext context = new DynamicContext(configuration, parameterObject);
这句话是根据配置,sql语句,以及参数,来生成context。生成的context会会加入到ognl的contxt,因此在我们的sql访问#{_parameter},只要你插入参数,就一定可以找到我们传入的这个参数,而不用管它是什么类型

进入后可以看到
public DynamicContext(Configuration configuration, Object parameterObject) {
    if (parameterObject != null && !(parameterObject instanceof Map)) {
      MetaObject metaObject = configuration.newMetaObject(parameterObject);
      bindings = new ContextMap(metaObject);
    } else {
      bindings = new ContextMap(null);
    }
    bindings.put(PARAMETER_OBJECT_KEY, parameterObject);
  }
1.bindings.put(PARAMETER_OBJECT_KEY, parameterObject);
这里的PARAMETER_OBJECT_KEY = _parameter;
因此在我们的sql中,类似于
<if test="_parameter != null" >
      <include refid="Example_Where_Clause" />
    </if>
是没有问题的。

随后它会将这个传入的参数对象,根据它的类型,活得它可以得到的表达式。
if (object instanceof ObjectWrapper) {
      this.objectWrapper = (ObjectWrapper) object;
    } else if (objectWrapperFactory.hasWrapperFor(object)) {
      this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
    } else if (object instanceof Map) {
      this.objectWrapper = new MapWrapper(this, (Map) object);
    } else {
      this.objectWrapper = new BeanWrapper(this, object);
    }

传入的是bean,BeanWrapper这个处理器会获取这个传入的参数的所有的get方法,并获取get方法后面的Xxx,如getName,就是name

多个参数
我们可能会碰到多个参数作为参数的情况。

public MessagegetMessages(String id, String messageType);

但ibatis只接受一个参数。
这个时候可以使用javabean作为参数传递,或者使用Map作为参数传递。如
<select id="getMessages" parameterType="java.util.Map"
resultType="com.liyixing.ibatis.model.Message" >
SELECT *
FROM message WHERE ID = #{id} AND MESSAGE_TYPE = #{messageType}
</select>

Map<String, Object> params = new HashMap<String, Object>();

params.put("id", 1);
params.put("messageType", 1);
List<Message> messages = messageDao.getMessages(params);

因为ibatis使用OGNL作为表达式的。它把参数作为root,因为ognl的root只有一个。所以ibatis只能支持一个参数。
分享到:
评论
2 楼 mojunbin 2012-05-14  
很好.呵呵
1 楼 citymoon2000 2011-10-10  
不错

相关推荐

    深入了解MyBatis参数

    "深入了解MyBatis参数" MyBatis作为一个流行的持久层框架,对参数的处理和使用是非常重要的。本文将深入了解MyBatis参数,了解参数处理过程,参数传递方式,参数类型等知识点。 参数处理过程 ---------------- 在...

    MyBatis参数处理.docx

    总结,MyBatis参数处理主要涉及Map或JavaBean的使用,以及如何在映射文件中指定参数类型。通过合理的参数处理,MyBatis可以灵活地构建和执行SQL查询,同时保证数据的安全性。在实际开发中,开发者可以根据需求选择...

    mybatis 动态sql及参数传递

    在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...

    关于MyBatis参数传入#{index}的问题的解决方案【源码】

    在使用MyBatis进行数据库操作时,我们经常会遇到需要传递多个参数的情况。在这个问题中,开发者遇到了一个关于如何正确传入参数#{index}的问题。在MyBatis中,#{index}是参数占位符,它用于动态SQL的拼接,但具体...

    MyBatis参数处理实现方法汇总

    MyBatis参数处理是MyBatis框架中非常重要的一个环节,它决定了如何将Java方法的参数映射到SQL语句中。下面将详细介绍MyBatis中不同类型的参数处理方法。 1. **单个参数**: 当只有一个参数时,MyBatis不会做特殊...

    Mybatis参数传递示例代码

    "Mybatis参数传递示例代码" Mybatis参数传递是Mybatis框架中一个非常重要的概念,它允许开发人员将参数传递给SQL语句,以实现更加灵活和可扩展的数据库交互。以下是关于Mybatis参数传递的详细知识点: 一、SQL语句...

    总结--Mybatis传递参数的几种方法

    Mybatis 传递参数的几种方法 Mybatis 中传递参数有多种方法,以下是其中的四种: 1. 传递单个参数 在 Mybatis 中,传递单个参数非常简单。可以直接将参数写在方法中,参数类型可以是 String,也可以是基本类型,...

    mybatis 日志 sql参数替换工具

    非常好用的,就是你们所要的 Mybatis日志参数快速替换占位符 sql参数替换工具html

    mybatis查询简单示例

    5. **MyBatis参数传递**:MyBatis支持多种方式传递参数,包括Map、@Param注解以及自定义对象。在查询语句中,可以使用#{paramName}来引用传入的参数,例如,查询条件可能来自前端传来的参数。 6. **结果映射**:...

    Mybatis日志中的SQL解析工具(网页版).html

    Mybatis日志中的SQL解析工具(网页版) 说明:复制日志时,必须注意,日志必须包含Preparing:和Parameters:全部内容,而且日志换行格式要保留,不要复制成纯文本,直接ctrl+c即可。

    mybatis全局参数.docx

    在 MyBatis 中,存在一些全局配置参数,这些参数能够影响整个 MyBatis 框架的行为。以下是对这些参数的详细解释: 1. `cacheEnabled`:此参数决定了是否在全局范围内启用缓存。如果设置为 `true`(默认),则开启...

    MyBatis框架笔记1

    4、MyBatis参数传递 MyBatis支持多种参数传递方式。使用#{ }表达式可以接收参数值,例如在XML映射文件中,#{id}将被替换为传入的实际值。参数可以是Map、JavaBean或者单个值。Map传递时,键作为字段名,值作为实际值...

    Mybatis Log(自动填充sql参数打印到控制台)

    Mybatis 提供了一种日志机制,能够自动填充SQL参数并打印到控制台,这对于排查问题和理解查询逻辑非常有帮助。 首先,Mybatis的日志实现依赖于日志库,如Log4j、Logback或Java内置的java.util.logging。为了开启SQL...

    Mybatis多参数查询与列表查询不同方式实现

    在Mybatis这个强大的持久层框架中,多参数查询与列表查询是常见的操作,尤其是在处理复杂的业务逻辑时。本文将深入探讨Mybatis如何实现这两种查询方式,并提供多种实现方法。 首先,我们来理解Mybatis的基本概念。...

    mybatis-stitch:MyBatis 参数-SQL绑定eclipse插件

    MyBatis-Stitch是一款专为Eclipse开发的插件,主要功能是帮助开发者更便捷地管理和操作MyBatis框架中的参数与SQL绑定。这个插件极大地提升了开发效率,减少了手动编写和维护SQL语句的工作量,尤其在处理复杂的动态...

    MyBatis拦截器分页与动态修改SQL及其参数值

    在这个主题中,我们将深入探讨如何利用MyBatis拦截器实现分页以及动态地修改SQL语句和参数值。 首先,我们关注的是"PaginationInterceptor.java",这是一个常见的分页拦截器实现。在MyBatis中,我们可以创建自定义...

    MyBatis拦截器:给参数对象属性赋值的实例

    MyBatis拦截器是MyBatis框架中的一种插件机制,允许用户自定义代码来扩展MyBatis的功能。在这个特定的实例中,我们讨论的是一个用于给参数对象属性赋值的拦截器。这个拦截器的主要目标是在执行增删改操作时,自动为...

    mybatis中的事务的开启

    mybatis中的事务的开启,有利于读者自己配置mybatis参数,实现自己的要求。

    java资源之Mybatis基础入门学习笔记

    **Mybatis参数绑定机制**: 1. **单个参数**:直接对应SQL中的占位符。 2. **多个参数**: - **下标方式**:参数按顺序对应SQL中的占位符,可读性较低。 - **注解方式**:使用@Param注解指定参数名,可读性更高,...

Global site tag (gtag.js) - Google Analytics