前几天把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,转载请注明出处:
相关推荐
Statement Builders是MyBatis内部用于构建SQL语句的组件,它根据传入的参数和配置信息生成最终的SQL语句。这部分通常对用户来说是透明的,但在理解MyBatis的工作原理时非常重要。 ### Logging #### 8.1 日志记录 ...
- **Statement Builders**:这一章节讲解了如何利用 MyBatis 的 Statement Builder 来构建 SQL 语句,特别是对于复杂的 SQL 逻辑处理非常有帮助。 - **Logging**:最后,文档还讨论了如何配置日志系统以记录 MyBatis...
在MyBatis中,Statement Builders包括SelectBuilder、SqlBuilder等。 #### 日志记录 MyBatis提供了与第三方日志框架集成的能力,比如Log4j、SLF4J等。在配置文件中可以指定使用哪种日志实现来记录日志信息。 ### ...
以上知识点覆盖了 MyBatis 的基础概念、快速上手指南、配置文件使用方法、Mapper XML 文件定义、动态 SQL 支持、Java API 使用、Statement Builders 和日志配置等方面。这些内容有助于开发者快速了解 MyBatis 的工作...
根据给定的文件信息,以下是对MyBatis 3.1.1官方PDF文档的关键知识点的详细解析: ### MyBatis概述 MyBatis是一款顶级的持久层框架,支持自定义SQL、存储过程以及高级映射功能。它极大地简化了JDBC代码编写,避免...
Statement Builders是MyBatis内部使用的一系列组件,负责构建最终的SQL语句。它们根据Mapper XML文件中的定义和传入的参数生成有效的SQL语句,确保了SQL语句的正确性和安全性。 ### 八、日志(Logging) MyBatis...
5. **statement-builders.html**:MyBatis提供了动态SQL的能力,允许在XML或注解中编写条件语句。Statement Builders,如`<if>`, `<choose>`, `<when>`, `<otherwise>`, `<where>`, `<set>` 和 `<foreach>`,使得SQL...
### Statement Builders MyBatis使用Statement Builder组件来构建最终的SQL语句。这有助于处理SQL参数化和SQL语句的构造过程。 ### Logging MyBatis支持日志记录功能,可以配置不同的日志实现,如Log4j、SLF4J等...
mybatis参考文档.CHM Core Introduction 入门 XML 映射配置文件 Mapper XML 文件 动态 SQL Java API Statement Builders
根据给定的文件信息,以下是对MyBatis帮助文档PDF中的关键知识点的详细解析: ### 1. MyBatis简介 #### 1.1 MyBatis是什么? MyBatis是一款一流的持久层框架,支持自定义SQL、存储过程及高级映射功能。它几乎消除...
MyBatis提供了两种类型的Statement Builders:XMLStatementBuilder和AnnotationStatementBuilder。 - **XMLStatementBuilder**:用于处理XML映射文件中的SQL语句。 - **AnnotationStatementBuilder**:用于处理注解...
- **Statement Builders**:这部分主要讲解了如何构建SQL语句,包括预编译语句(PreparedStatement)和原生语句(Statement)。 - **Logging**:MyBatis支持多种日志记录方式,如Log4j、Logback等,便于调试和监控...
Statement Builders StatementBuilders模块负责构建最终执行的SQL语句,这一过程涉及到参数的解析和转换。 #### 9. Logging MyBatis支持日志记录功能,可以集成各种日志框架(如Log4j、SLF4J等),用于记录执行...
Statement Builders是MyBatis中用于构建SQL语句的组件,它们与Mapper XML文件中的动态SQL一起使用,使SQL的构建更加灵活和动态。 日志模块是MyBatis中用于输出运行时信息的模块,它支持多种日志框架,比如Log4j、...
MyBatis提供了Java API和Statement Builders,通过这些可以自定义操作数据库的逻辑。同时,MyBatis还包含了日志功能,以帮助开发者了解其执行的SQL语句和应用程序的运行状况。 MyBatis的项目文档和信息完整,包含了...
### MyBatis技术文档知识点概览 #### 一、MyBatis简介 ##### 1.1 MyBatis是什么? **MyBatis**是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis消除了几乎所有的JDBC代码和手动设置参数...
Statement Builders部分涉及到了MyBatis提供的各种Builder接口和类,它们用于构建各种SQL语句对象。例如,SqlSourceBuilder用于根据动态SQL创建SqlSource对象,而XMLStatementBuilder用于解析映射器中的XML语句并...
卷 文档 的文件夹 PATH 列表 卷序列号为 000C-BB91 E:. │ config.properties │ Dao.java │ GeneratorDemo.java │ hibernate.cfg.xml │ HibernateDaoImpl.java │ HibernateSessionFactory.java │ ...