`
cjm0000000
  • 浏览: 32823 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Mybatis statement-builders文档的坑

阅读更多

前几天把Mybatis升级到3.2.2,发现动态SQL的SqlBuilder/SelectBuilder这几个类应经被弃用,取而代之的是一个叫AbstractSQL的抽象类,打开看源码(什么注释都没有。。。);翻了半天官方文档,发现他有个默认的实现SQL类,新的Mybatis可以通过SQL类来构造动态SQL,详情请见官方文档:

http://mybatis.github.io/mybatis-3/statement-builders.html

 

在参考他的文档的时候,遇到一个奇怪的问题(我参考的是下面这段):

// With conditionals (note the final parameters, required for the anonymous inner class to access them)
public String selectPersonLike(final String id, final String firstName, final String lastName) {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
    FROM("PERSON P");
    if (id != null) {
      WHERE("P.ID like ${id}");
    }
    if (firstName != null) {
      WHERE("P.FIRST_NAME like ${firstName}");
    }
    if (lastName != null) {
      WHERE("P.LAST_NAME like ${lastName}");
    }
    ORDER_BY("P.LAST_NAME");
  }}.toString();
}

 

在我运行这段代码的时候,会报错:org.apache.ibatis.builder.BuilderException

 

通过翻看源码org.apache.ibatis.builder.annotation.ProviderSqlSource

 

终于知道了答案:

 

 public ProviderSqlSource(Configuration config, Object provider) {
    String providerMethodName = null;
    try {
      this.sqlSourceParser = new SqlSourceBuilder(config);
      this.providerType = (Class<?>) provider.getClass().getMethod("type").invoke(provider);
      providerMethodName = (String) provider.getClass().getMethod("method").invoke(provider);

      for (Method m : this.providerType.getMethods()) {
        if (providerMethodName.equals(m.getName())) {
          if (m.getParameterTypes().length < 2
              && m.getReturnType() == String.class) {
            this.providerMethod = m;
            this.providerTakesParameterObject = m.getParameterTypes().length == 1;
          }
        }
      }
    } catch (Exception e) {
      throw new BuilderException("Error creating SqlSource for SqlProvider.  Cause: " + e, e);
    }
    if (this.providerMethod == null) {
      throw new BuilderException("Error creating SqlSource for SqlProvider. Method '"
          + providerMethodName + "' not found in SqlProvider '" + this.providerType.getName() + "'.");
    }
  }

 上面代码10-11行指出:方法返回值必须是String,而且参数只能是0或者一个。于是把上面的一窜参数改成:final Map<String, Object> paramMap,测试通过,mybatis会自动把参数封装到Map里面去。

 

官方文档真是坑爹,希望后面的伙伴们少走弯路。

 

本文出自ITEYE BLOG,转载请注明出处:

http://qurey.iteye.com/blog/1944785

分享到:
评论

相关推荐

    mybatis-3.5.4.pdf

    Statement Builders是MyBatis内部用于构建SQL语句的组件,它根据传入的参数和配置信息生成最终的SQL语句。这部分通常对用户来说是透明的,但在理解MyBatis的工作原理时非常重要。 ### Logging #### 8.1 日志记录 ...

    mybatis-3.2.6.pdf

    - **Statement Builders**:这一章节讲解了如何利用 MyBatis 的 Statement Builder 来构建 SQL 语句,特别是对于复杂的 SQL 逻辑处理非常有帮助。 - **Logging**:最后,文档还讨论了如何配置日志系统以记录 MyBatis...

    MyBatis3.2.2中文官方文档

    在MyBatis中,Statement Builders包括SelectBuilder、SqlBuilder等。 #### 日志记录 MyBatis提供了与第三方日志框架集成的能力,比如Log4j、SLF4J等。在配置文件中可以指定使用哪种日志实现来记录日志信息。 ### ...

    Mybatis官网文档

    以上知识点覆盖了 MyBatis 的基础概念、快速上手指南、配置文件使用方法、Mapper XML 文件定义、动态 SQL 支持、Java API 使用、Statement Builders 和日志配置等方面。这些内容有助于开发者快速了解 MyBatis 的工作...

    mybatis 3.1.1 官方pdf(英文)

    根据给定的文件信息,以下是对MyBatis 3.1.1官方PDF文档的关键知识点的详细解析: ### MyBatis概述 MyBatis是一款顶级的持久层框架,支持自定义SQL、存储过程以及高级映射功能。它极大地简化了JDBC代码编写,避免...

    mybatis 帮助文档

    Statement Builders是MyBatis内部使用的一系列组件,负责构建最终的SQL语句。它们根据Mapper XML文件中的定义和传入的参数生成有效的SQL语句,确保了SQL语句的正确性和安全性。 ### 八、日志(Logging) MyBatis...

    mybatis最新官方API

    5. **statement-builders.html**:MyBatis提供了动态SQL的能力,允许在XML或注解中编写条件语句。Statement Builders,如`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;` 和 `&lt;foreach&gt;`,使得SQL...

    mybatis jar 文件和学习文档

    ### Statement Builders MyBatis使用Statement Builder组件来构建最终的SQL语句。这有助于处理SQL参数化和SQL语句的构造过程。 ### Logging MyBatis支持日志记录功能,可以配置不同的日志实现,如Log4j、SLF4J等...

    mybatis参考文档.CHM

    mybatis参考文档.CHM Core Introduction 入门 XML 映射配置文件 Mapper XML 文件 动态 SQL Java API Statement Builders

    mybatis帮助文档pdf

    根据给定的文件信息,以下是对MyBatis帮助文档PDF中的关键知识点的详细解析: ### 1. MyBatis简介 #### 1.1 MyBatis是什么? MyBatis是一款一流的持久层框架,支持自定义SQL、存储过程及高级映射功能。它几乎消除...

    Mybatis帮助文档

    MyBatis提供了两种类型的Statement Builders:XMLStatementBuilder和AnnotationStatementBuilder。 - **XMLStatementBuilder**:用于处理XML映射文件中的SQL语句。 - **AnnotationStatementBuilder**:用于处理注解...

    Mybatis 3.2.8 user guide

    - **Statement Builders**:这部分主要讲解了如何构建SQL语句,包括预编译语句(PreparedStatement)和原生语句(Statement)。 - **Logging**:MyBatis支持多种日志记录方式,如Log4j、Logback等,便于调试和监控...

    Mybatis官方教程

    Statement Builders StatementBuilders模块负责构建最终执行的SQL语句,这一过程涉及到参数的解析和转换。 #### 9. Logging MyBatis支持日志记录功能,可以集成各种日志框架(如Log4j、SLF4J等),用于记录执行...

    mybatis运用

    Statement Builders是MyBatis中用于构建SQL语句的组件,它们与Mapper XML文件中的动态SQL一起使用,使SQL的构建更加灵活和动态。 日志模块是MyBatis中用于输出运行时信息的模块,它支持多种日志框架,比如Log4j、...

    Web开发MyBatis3

    MyBatis提供了Java API和Statement Builders,通过这些可以自定义操作数据库的逻辑。同时,MyBatis还包含了日志功能,以帮助开发者了解其执行的SQL语句和应用程序的运行状况。 MyBatis的项目文档和信息完整,包含了...

    Mybaits 文档

    ### MyBatis技术文档知识点概览 #### 一、MyBatis简介 ##### 1.1 MyBatis是什么? **MyBatis**是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和手动设置参数...

    mybatis用户指南

    Statement Builders部分涉及到了MyBatis提供的各种Builder接口和类,它们用于构建各种SQL语句对象。例如,SqlSourceBuilder用于根据动态SQL创建SqlSource对象,而XMLStatementBuilder用于解析映射器中的XML语句并...

    前端-后端java的Util类的工具类

    卷 文档 的文件夹 PATH 列表 卷序列号为 000C-BB91 E:. │ config.properties │ Dao.java │ GeneratorDemo.java │ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java │ ...

Global site tag (gtag.js) - Google Analytics