`
gaojingsong
  • 浏览: 1201575 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Mybatis源码阅读之SqlBuilder

阅读更多

 



 

package org.apache.ibatis.jdbc;

 

import java.util.ArrayList;

import java.util.List;

 

public class SqlBuilder {

  private static final String AND = ") \nAND (";

  private static final String OR = ") \nOR (";

 

  private static final ThreadLocal<SQL> localSQL = new ThreadLocal<SQL>();

 

  public static void BEGIN() {

    RESET();

  }

 

  public static void RESET() {

    localSQL.set(new SQL());

  }

 

  public static void UPDATE(String table) {

    sql().statementType = SQL.StatementType.UPDATE;

    sql().tables.add(table);

  }

 

  public static void SET(String sets) {

    sql().sets.add(sets);

  }

 

  public static String SQL() {

    try {

      return sql().sql();

    } finally {

        RESET();

    }

  }

 

  public static void INSERT_INTO(String tableName) {

    sql().statementType = SQL.StatementType.INSERT;

    sql().tables.add(tableName);

  }

 

  public static void VALUES(String columns, String values) {

    sql().columns.add(columns);

    sql().values.add(values);

  }

 

  public static void SELECT(String columns) {

    sql().statementType = SQL.StatementType.SELECT;

    sql().select.add(columns);

  }

 

  public static void SELECT_DISTINCT(String columns) {

    sql().distinct = true;

    SELECT(columns);

  }

 

  public static void DELETE_FROM(String table) {

    sql().statementType = SQL.StatementType.DELETE;

    sql().tables.add(table);

  }

 

  public static void FROM(String table) {

    sql().tables.add(table);

  }

 

  public static void JOIN(String join) {

    sql().join.add(join);

  }

 

  public static void INNER_JOIN(String join) {

    sql().innerJoin.add(join);

  }

 

  public static void LEFT_OUTER_JOIN(String join) {

    sql().leftOuterJoin.add(join);

  }

 

  public static void RIGHT_OUTER_JOIN(String join) {

    sql().rightOuterJoin.add(join);

  }

 

  public static void OUTER_JOIN(String join) {

    sql().outerJoin.add(join);

  }

 

  public static void WHERE(String conditions) {

    sql().where.add(conditions);

    sql().lastList = sql().where;

  }

 

  public static void OR() {

    sql().lastList.add(OR);

  }

 

  public static void AND() {

    sql().lastList.add(AND);

  }

 

  public static void GROUP_BY(String columns) {

    sql().groupBy.add(columns);

  }

 

  public static void HAVING(String conditions) {

    sql().having.add(conditions);

    sql().lastList = sql().having;

  }

 

  public static void ORDER_BY(String columns) {

    sql().orderBy.add(columns);

  }

 

  private static SQL sql() {

    SQL sql = localSQL.get();

    if (sql == null) {

      RESET();

      sql = localSQL.get();

    }

    return sql;

  }

 

  private static class SQL {

    public enum StatementType {

        DELETE,

        INSERT,

        SELECT,

        UPDATE

    }

    

    StatementType statementType;

    List<String> sets = new ArrayList<String>();

    List<String> select = new ArrayList<String>();

    List<String> tables = new ArrayList<String>();

    List<String> join = new ArrayList<String>();

    List<String> innerJoin = new ArrayList<String>();

    List<String> outerJoin = new ArrayList<String>();

    List<String> leftOuterJoin = new ArrayList<String>();

    List<String> rightOuterJoin = new ArrayList<String>();

    List<String> where = new ArrayList<String>();

    List<String> having = new ArrayList<String>();

    List<String> groupBy = new ArrayList<String>();

    List<String> orderBy = new ArrayList<String>();

    List<String> lastList = new ArrayList<String>();

    List<String> columns = new ArrayList<String>();

    List<String> values = new ArrayList<String>();

    boolean distinct;

 

    private void sqlClause(StringBuilder builder, String keyword, List<String> parts, String open, String close, String conjunction) {

      if (!parts.isEmpty()) {

        if (builder.length() > 0) builder.append("\n");

        builder.append(keyword);

        builder.append(" ");

        builder.append(open);

        String last = "________";

        for (int i = 0, n = parts.size(); i < n; i++) {

          String part = parts.get(i);

          if (i > 0 && !part.equals(AND) && !part.equals(OR) && !last.equals(AND) && !last.equals(OR)) {

            builder.append(conjunction);

          }

          builder.append(part);

          last = part;

        }

        builder.append(close);

      }

    }

 

    private String selectSQL() {

      StringBuilder builder = new StringBuilder();

      if (distinct) {

        sqlClause(builder, "SELECT DISTINCT", select, "", "", ", ");

      } else {

        sqlClause(builder, "SELECT", select, "", "", ", ");

      }

 

      sqlClause(builder, "FROM", tables, "", "", ", ");

      sqlClause(builder, "JOIN", join, "", "", "JOIN");

      sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN ");

      sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN ");

      sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT OUTER JOIN ");

      sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT OUTER JOIN ");

      sqlClause(builder, "WHERE", where, "(", ")", " AND ");

      sqlClause(builder, "GROUP BY", groupBy, "", "", ", ");

      sqlClause(builder, "HAVING", having, "(", ")", " AND ");

      sqlClause(builder, "ORDER BY", orderBy, "", "", ", ");

      return builder.toString();

    }

 

    private String insertSQL() {

      StringBuilder builder = new StringBuilder();

 

      sqlClause(builder, "INSERT INTO", tables, "", "", "");

      sqlClause(builder, "", columns, "(", ")", ", ");

      sqlClause(builder, "VALUES", values, "(", ")", ", ");

      return builder.toString();

    }

 

    private String deleteSQL() {

      StringBuilder builder = new StringBuilder();

 

      sqlClause(builder, "DELETE FROM", tables, "", "", "");

      sqlClause(builder, "WHERE", where, "(", ")", " AND ");

      return builder.toString();

    }

 

    private String updateSQL() {

      StringBuilder builder = new StringBuilder();

 

      sqlClause(builder, "UPDATE", tables, "", "", "");

      sqlClause(builder, "SET", sets, "", "", ", ");

      sqlClause(builder, "WHERE", where, "(", ")", " AND ");

      return builder.toString();

    }

 

    public String sql() {

      if (statementType == null) {

        return null;

      }

      

      String answer;

      

      switch (statementType) {

      case DELETE:

        answer = deleteSQL();

        break;

          

      case INSERT:

        answer = insertSQL();

        break;

      

      case SELECT:

        answer = selectSQL();

        break;

          

      case UPDATE:

        answer = updateSQL();

        break;

          

      default:

        answer = null;

      }

 

      return answer;

    }

  }

}

 

  • 大小: 71.4 KB
0
4
分享到:
评论

相关推荐

    MyBatis通过 JDBC连接 SQL server 数据库 最小例子

    MyBatis是一个流行的Java持久层框架,它简化了与数据库之间的交互,允许开发者将SQL查询直接集成到Java代码中。本教程将引导你通过JDBC连接到SQL Server 2005数据库,创建一个最小的例子来展示MyBatis的基本用法。 ...

    mybatis自动sql生成插件源码

    本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器(Interceptor)在运行时自动生成SQL语句,适用于具有主键或唯一索引的单表操作。 首先,`AutoMapperInterceptor.java`是这个插件的...

    MyBatis连接 SQL server 数据库代码

    MyBatis是一款强大的Java持久层框架,它允许开发者将SQL语句直接写在XML映射文件或者注解中,提供了灵活的数据访问层解决方案。在Java应用程序中,通过MyBatis连接SQL Server数据库是一项常见的任务,这涉及到配置、...

    互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析

    《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个...

    Mybatis最新jar及源码

    `mybatis-3-mybatis-3.4.6`可能是一个包含Mybatis源码的另一个形式,方便开发者进行学习和调试。源码分析对于理解框架内部工作流程,以及自定义扩展非常有帮助。例如,你可以研究`org.apache.ibatis.builder.xml....

    mybatis3.4.1jar包和源码

    1. SQL Mapper:MyBatis的主要设计思想是SQL映射,它通过XML或注解方式定义SQL语句,将SQL与Java代码分离,使得SQL逻辑更加清晰,同时也降低了维护成本。 2. Configuration:MyBatis的配置文件包含了数据库连接信息...

    Mybatis源码分析

    Mybatis源码分析 Mybatis是一款流行的持久化框架,提供了强大的SQL映射和缓存机制。本文将对Mybatis的源码进行分析,探究其运行原理、缓存机制和设计模式。 Mybatis简介 Mybatis是一个第一类持久化框架,支持...

    Mybatis:Mybatis源码阅读

    通过对Mybatis源码的深入阅读,我们可以了解到其内部设计模式、执行流程和优化策略,这对于提升代码质量和解决实际问题非常有帮助。同时,源码阅读也有助于理解Java反射、AOP、设计模式等基础技术在实际项目中的应用...

    MyBatis3 API 中文文档

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

    Mybatis源码分析-上课笔记1

    在分析MyBatis源码时,可以采用宏观和微观两种视角。宏观上理解整个框架的架构和流程,微观上深入到具体的类和方法,通过阅读和调试代码来理解其实现细节。同时,绘制流程图或UML图能帮助更好地梳理组件间的交互。 ...

    mybatis-3-master ,mybatis 3的源码 3.2

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.2的源码之前,我们先了解一下MyBatis的基本概念和架构。 MyBatis的核心组件包括:SqlSessionFactoryBuilder、...

    mybatis-resource:mybatis源码阅读

    通过对MyBatis源码的阅读,我们可以更深入地理解其设计思想和工作流程,这对于优化SQL执行效率,解决实际问题,甚至参与MyBatis的二次开发都有着极大的帮助。在实际项目中,结合MyBatis的特性,可以编写出高效、可...

    springmybatis

    mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis ...

    MyBatis3.2.2中文官方文档

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

    asp.net搭建mybatis开发环境

    MyBatis是一个基于.NET的轻量级持久层框架,它主要解决了SQL与代码的分离问题,允许开发者编写动态SQL,使数据库操作更加灵活。IBatisNet是.NET平台上的MyBatis实现,它提供了一种简单的ORM(对象关系映射)解决方案...

    mybatis3.0.2入门实例

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在本入门实例中,我们将探讨如何使用MyBatis 3.0.2版本进行基本的数据库操作。这个实例适合初学者,将帮助你快速理解和掌握MyBatis的...

    互联网轻量级 ssm 框架解密 springspringmvcmybatis源码深度剖析

    《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个...

    根据MyBatis的ResultMap生成增删改sql

    在IT行业中,MyBatis是一个广泛使用的持久层框架,它允许开发者将SQL语句与Java代码紧密结合,提供了灵活且强大的数据操作能力。本主题聚焦于如何根据MyBatis的ResultMap来生成增删改(CRUD)SQL语句。ResultMap是...

    mybatis-3-mybatis-3.2.6.zip

    描述中提到"MyBatis Source code.jar 各个版本,免费下载",意味着提供的是MyBatis的源代码,开发者可以深入理解其内部工作原理,学习如何实现ORM(对象关系映射)机制,包括SQL动态生成、结果映射等核心功能。...

    MyBatis3 中文版用户指南手册

    除了基本的 CRUD 操作,MyBatis 还提供了 `SelectBuilder` 和 `SqlBuilder` 这样的高级特性,用于构建更为复杂的 SQL 语句。 总结来说,MyBatis 是一个功能强大且灵活的持久层框架,通过合理的配置和使用,可以大大...

Global site tag (gtag.js) - Google Analytics