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;
}
}
}
相关推荐
MyBatis是一个流行的Java持久层框架,它简化了与数据库之间的交互,允许开发者将SQL查询直接集成到Java代码中。本教程将引导你通过JDBC连接到SQL Server 2005数据库,创建一个最小的例子来展示MyBatis的基本用法。 ...
本项目提供的"mybatis自动sql生成插件源码"则进一步提升了开发效率,通过拦截器(Interceptor)在运行时自动生成SQL语句,适用于具有主键或唯一索引的单表操作。 首先,`AutoMapperInterceptor.java`是这个插件的...
MyBatis是一款强大的Java持久层框架,它允许开发者将SQL语句直接写在XML映射文件或者注解中,提供了灵活的数据访问层解决方案。在Java应用程序中,通过MyBatis连接SQL Server数据库是一项常见的任务,这涉及到配置、...
《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个...
`mybatis-3-mybatis-3.4.6`可能是一个包含Mybatis源码的另一个形式,方便开发者进行学习和调试。源码分析对于理解框架内部工作流程,以及自定义扩展非常有帮助。例如,你可以研究`org.apache.ibatis.builder.xml....
1. SQL Mapper:MyBatis的主要设计思想是SQL映射,它通过XML或注解方式定义SQL语句,将SQL与Java代码分离,使得SQL逻辑更加清晰,同时也降低了维护成本。 2. Configuration:MyBatis的配置文件包含了数据库连接信息...
Mybatis源码分析 Mybatis是一款流行的持久化框架,提供了强大的SQL映射和缓存机制。本文将对Mybatis的源码进行分析,探究其运行原理、缓存机制和设计模式。 Mybatis简介 Mybatis是一个第一类持久化框架,支持...
通过对Mybatis源码的深入阅读,我们可以了解到其内部设计模式、执行流程和优化策略,这对于提升代码质量和解决实际问题非常有帮助。同时,源码阅读也有助于理解Java反射、AOP、设计模式等基础技术在实际项目中的应用...
MyBatis还提供了许多Java API,如SelectBuilder和SqlBuilder,它们提供了构建SQL语句的接口。 9. 应用目录结构 MyBatis的应用程序结构通常将SQL映射文件放置在resources目录下。MyBatis会自动扫描这些文件,并根据...
在分析MyBatis源码时,可以采用宏观和微观两种视角。宏观上理解整个框架的架构和流程,微观上深入到具体的类和方法,通过阅读和调试代码来理解其实现细节。同时,绘制流程图或UML图能帮助更好地梳理组件间的交互。 ...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在深入探讨MyBatis 3.2的源码之前,我们先了解一下MyBatis的基本概念和架构。 MyBatis的核心组件包括:SqlSessionFactoryBuilder、...
通过对MyBatis源码的阅读,我们可以更深入地理解其设计思想和工作流程,这对于优化SQL执行效率,解决实际问题,甚至参与MyBatis的二次开发都有着极大的帮助。在实际项目中,结合MyBatis的特性,可以编写出高效、可...
mybatis实战教程mybatis in action之七实现mybatis分页源码下载 mybatis实战教程mybatis in action之八mybatis 动态sql语句 mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis ...
在MyBatis中,Statement Builders包括SelectBuilder、SqlBuilder等。 #### 日志记录 MyBatis提供了与第三方日志框架集成的能力,比如Log4j、SLF4J等。在配置文件中可以指定使用哪种日志实现来记录日志信息。 ### ...
MyBatis是一个基于.NET的轻量级持久层框架,它主要解决了SQL与代码的分离问题,允许开发者编写动态SQL,使数据库操作更加灵活。IBatisNet是.NET平台上的MyBatis实现,它提供了一种简单的ORM(对象关系映射)解决方案...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在本入门实例中,我们将探讨如何使用MyBatis 3.0.2版本进行基本的数据库操作。这个实例适合初学者,将帮助你快速理解和掌握MyBatis的...
《互联网轻量级SSM框架解密:Spring、Spring MVC、MyBatis源码深度剖析》以SSM 的核心代码剖析为基础,突破Java Web 研发瓶颈的束缚,选取Spring、SpringMVC 和MyBatis 框架中易于理解的版本,深入剖析了其中各个...
在IT行业中,MyBatis是一个广泛使用的持久层框架,它允许开发者将SQL语句与Java代码紧密结合,提供了灵活且强大的数据操作能力。本主题聚焦于如何根据MyBatis的ResultMap来生成增删改(CRUD)SQL语句。ResultMap是...
描述中提到"MyBatis Source code.jar 各个版本,免费下载",意味着提供的是MyBatis的源代码,开发者可以深入理解其内部工作原理,学习如何实现ORM(对象关系映射)机制,包括SQL动态生成、结果映射等核心功能。...
除了基本的 CRUD 操作,MyBatis 还提供了 `SelectBuilder` 和 `SqlBuilder` 这样的高级特性,用于构建更为复杂的 SQL 语句。 总结来说,MyBatis 是一个功能强大且灵活的持久层框架,通过合理的配置和使用,可以大大...