`

MyBatis接口SelectBuilder

阅读更多

SelectBuilder

一个Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。通常这么做是因为SQL要动态的生成-否则你可以将它们放到外部的文件或存储过程中。正如你已经看到的,MyBatis在它的XML映射特性中有处理生成动态SQL的很强大的方案。然而,有时必须在Java代码中创建SQL语句的字符串。这种情况下,MyBatis有另外一种特性来帮助你,在减少典型的加号,引号,新行,格式化问题和嵌入条件来处理多余的逗号或AND连接词之前,事实上,在Java代码中动态生成SQL就是一个噩梦。

MyBatis 3引入了一些不同的理念来处理这个问题,我们可以创建一个类的实例来调用其中的方法来一次构建SQL语句。但是我们的SQL结尾时看起来很像Java代码而不是SQL语句。相反,我们尝试了一些不同的做法。最终的结果是关于特定领域语言的结束,Java也不断实现它目前的形式…

SelectBuilder的秘密

SelectBuilder类并不神奇,如果你不了解它的工作机制也不会有什么好的作用。别犹豫,让我们来看看它是怎么工作的。SelectBuilder使用了静态引入和TreadLocal变量的组合来开启简洁的语法可以很容易地用条件进行隔行扫描,而且为你保护所有SQL的格式。它允许你创建这样的方法:

public String selectBlogsSql() {

BEGIN(); // Clears ThreadLocal variable

SELECT("*");

FROM("BLOG");

return SQL();

}

这是一个非常简单的示例,你也许会选择静态地来构建。所以这里给出一个复杂一点的

 

示例:

private String selectPersonSql() {

BEGIN(); // Clears ThreadLocal variable

SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");

SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");

FROM("PERSON P");

FROM("ACCOUNT A");

INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");

INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");

WHERE("P.ID = A.ID");

WHERE("P.FIRST_NAME like ?");

OR();

WHERE("P.LAST_NAME like ?");

GROUP_BY("P.ID");

HAVING("P.LAST_NAME like ?");

OR();

HAVING("P.FIRST_NAME like ?");

ORDER_BY("P.ID");

ORDER_BY("P.FULL_NAME");

return SQL();

}

用字符串连接的方式来构建上面的SQL就会有一些繁琐了。比如:

"SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, "

"P.LAST_NAME,P.CREATED_ON, P.UPDATED_ON " +

"FROM PERSON P, ACCOUNT A " +

"INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID " +

"INNER JOIN COMPANY C on D.COMPANY_ID = C.ID " +

"WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) " +

"OR (P.LAST_NAME like ?) " +

"GROUP BY P.ID " +

"HAVING (P.LAST_NAME like ?) " +

"OR (P.FIRST_NAME like ?) " +

"ORDER BY P.ID, P.FULL_NAME";

如果你喜欢那样的语法,那么你就可以使用它。它很容易出错,要小心那些每行结尾增加的空间。现在,即使你喜欢这样的语法,下面的示例比Java中的字符串连接要简单也是没有疑问的:

private String selectPersonLike(Person p){

BEGIN(); // Clears ThreadLocal variable

SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME,

P.LAST_NAME");

FROM("PERSON P");

if (p.id != null) {

WHERE("P.ID like #{id}");

}

 

if (p.firstName != null) {

WHERE("P.FIRST_NAME like #{firstName}");

}

if (p.lastName != null) {

WHERE("P.LAST_NAME like #{lastName}");

}

ORDER_BY("P.LAST_NAME");

return SQL();

}

这个例子有什么特殊之处?如果你看得仔细,那就不同担心偶然会重复的“AND”关键字,或在“WHERE”和“AND”或两者都没有中选择!上面的语句将会由例子对所有PERSON记录生成一个查询,有像参数一样的ID或firstName或lastName-或这三者的任意组合。SelectBuilder对理解哪里放置“WHERE”,哪里应该使用“AND”还有所有的字符串连接都是很小心的。最好的情况,无论你以何种顺序调用这些方法(只有一种例外使用OR()方法)。

有两个方法会吸引你的眼球:BEGIN()和SQL()。总之,每个SelectBuilder方法应该以调用BEGIN()开始,以调用SQL()结束。当然你可以在中途提取方法来打断你执行的逻辑,但是SQL生成的范围应该以BEGIN()方法开始而且以SQL()方法结束。BEGIN()方法清理ThreadLocal变量,来确保你不会不小心执行了前面的状态,而且SQL()方法会基于这些调用,从最后一次调用BEGIN()开始组装你的SQL语句。注意BEGIN()有一个称为RESET()的代替方法,它们所做的工作相同,只是RESET()会在特定上下文中读取的更好。

要按照上面示例的方式使用SelectBuilder,你应该静态引入如下内容:

import static org.mybatis.jdbc.SelectBuilder.*;

只要这个被引入了,那么你使用的类就会拥有SelectBuilder的所有可用的方法

 

 

SqlBuilder

和SelectBuilder相似,MyBatis也包含一个一般性的SqlBuilder。它包含SelectBuilder的所有方法,还有构建insert,update和delete的方法。在DeleteProvider,InsertProvider或UpdateProvider中(还有SelectProvider)构建SQL字符串时这个类就很有用。

在上述示例中要使用SqlBuilder,你只需简单静态引入如下内容:

import static org.mybatis.jdbc.SqlBuilder.*;

 

 

分享到:
评论

相关推荐

    MyBatis3 API 中文文档

    MyBatis还提供了许多Java API,如SelectBuilder和SqlBuilder,它们提供了构建SQL语句的接口。 9. 应用目录结构 MyBatis的应用程序结构通常将SQL映射文件放置在resources目录下。MyBatis会自动扫描这些文件,并根据...

    MyBatis3.2.2中文官方文档

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

    mybatis入门学习资料

    MyBatis通过一系列Java API来操作数据库,包括SqlSession、SqlSessionFactoryBuilder、SqlSessionFactory、SelectBuilder、SqlBuilder等。这些API是操作数据库的关键。 7. 应用目录结构 为了使MyBatis能够正确工作...

    MyBatis3 中文版用户指南手册

    MyBatis 使用简单的 XML 或注解来进行配置和原始映射,并能够将接口和 Java 的 POJOs 映射为数据库中的记录。 #### 入门 每个 MyBatis 应用的核心都是 `SqlSessionFactory` 对象。该对象可以通过 `...

    MyBatis官方中文参考手册

    MyBatis通过简单的XML或注解配置,允许开发者编写SQL语句,将其映射到接口和POJOs(普通Java对象),从而避免了大量繁琐的JDBC代码和手动设置参数以及检索结果集的麻烦。 MyBatis使用SqlSessionFactory作为应用程序...

    MyBatis3_用户指南(附JavaDB实例)

    Java API部分,文档描述了SqlSessions、SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、SelectBuilder、SqlBuilder等核心API的使用方法和用途,帮助开发者理解如何在Java代码中操作MyBatis。 最后,...

    MyBatis-3-User-Guide.pdf

    MyBatis 可以使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJOs(普通的 Java 对象)映射成数据库中的记录。 文档开始就警告了读者在复制代码时需要注意的问题,现代文字处理器可能会在复制时插入...

    MyBatis-3.0.3-User-Guide.pdf

    - **SelectBuilder/SqlBuilder:** 动态SQL构建器。 通过上述内容,我们可以了解到MyBatis 3.0.3版本的主要功能和使用方法,包括如何构建配置文件、执行SQL语句、处理结果映射等。这对于初学者来说是非常宝贵的资料...

    MyBatis3_用户指南(附JavaDB实例).

    - **SelectBuilder**:用于构建查询语句。 - **SqlBuilder**:用于构建SQL语句。 #### 十四、附录 - **对象模型**:描述MyBatis内部对象之间的关系。 - **创建数据库**:提供创建数据库的示例。 - **MyBatis实例**...

    MyBatis3_用户指南

    在Java API中,MyBatis提供了目录结构的约定,SqlSessionFactoryBuilder用于构建SqlSessionFactory实例,SqlSession用于执行定义的SQL语句,SelectBuilder和SqlBuilder用于构建Select查询语句。 附录部分则提供了更...

    MyBatis3 用户指南 附JavaDB实例 pdf

    - **SelectBuilder**:动态SQL的构建器。 - **SqlBuilder**:用于构建SQL语句。 #### 八、附录内容 - **附录1:对象模型**:描述MyBatis中的核心对象及其关系。 - **附录2:创建数据库**:提供示例数据库脚本。 - ...

    mybatis3中文教程

    MyBatis提供了使用XML或注解的方式来自定义SQL语句的配置和映射,将接口和Java的POJOs映射成数据库中的记录。 MyBatis的核心组件是SqlSessionFactory,它是创建SqlSession的工厂。在MyBatis应用程序中,每一个应用...

    MyBatis中文教程

    通过简单的XML或注解配置,可以将接口与Java POJOs映射到数据库中的记录。 - **特点**:几乎消除了所有JDBC代码的手动设置和结果集的检索工作,简化了开发流程。 - **适用场景**:适用于需要高度定制SQL语句的项目,...

    MyBatis开发手册

    - **POJO映射**:能够将接口和Java POJOs映射到数据库记录。 #### 二、入门指南 - **核心对象**:每个MyBatis应用程序的核心是一个`SqlSessionFactory`实例,该实例可通过`SqlSessionFactoryBuilder`对象获得。 -...

    MyBatis3--开发指南(附JavaDB实例)

    ### MyBatis3 开发指南知识点详解 #### MyBatis3 概述 - **定义**:MyBatis是一款优秀的支持自定义SQL、存储过程以及高级映射的持久层框架。它极大地简化了JDBC代码的编写,几乎消除了所有JDBC相关的编码工作,如...

    MyBatis3用户指南中文版

    MyBatis是一个持久层框架,支持自定义SQL、存储过程和高级映射,它将大部分的JDBC代码、手动设置参数和结果集处理抽象化,使用简单的XML和注解方式来配置和映射基本数据类型、Map接口以及POJO到数据库记录。...

Global site tag (gtag.js) - Google Analytics