

mybatis系列-sql 类的简要分析
source link: https://nicksxs.me/2023/03/19/mybatis%E7%B3%BB%E5%88%97-sql-%E7%B1%BB%E7%9A%84%E7%AE%80%E8%A6%81%E5%88%86%E6%9E%90/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

mybatis系列-sql 类的简要分析
上次就比较简单的讲了使用,这块也比较简单,因为封装得不是很复杂,首先我们从 select 作为入口来看看,这个具体的实现,
String selectSql = new SQL() {{
SELECT("id", "name");
FROM("student");
WHERE("id = #{id}");
}}.toString();
SELECT
方法的实现,
public T SELECT(String... columns) {
sql().statementType = SQLStatement.StatementType.SELECT;
sql().select.addAll(Arrays.asList(columns));
return getSelf();
}
statementType是个枚举
public enum StatementType {
DELETE, INSERT, SELECT, UPDATE
}
那这个就是个 select 语句,然后会把参数转成 list 添加到 select
变量里,
然后是 from 语句,这个大概也能猜到就是设置下表名,
public T FROM(String table) {
sql().tables.add(table);
return getSelf();
}
往 tables 里添加了 table,这个 tables 是什么呢
这里也可以看下所有的变量,
StatementType statementType;
List<String> sets = new ArrayList<>();
List<String> select = new ArrayList<>();
List<String> tables = new ArrayList<>();
List<String> join = new ArrayList<>();
List<String> innerJoin = new ArrayList<>();
List<String> outerJoin = new ArrayList<>();
List<String> leftOuterJoin = new ArrayList<>();
List<String> rightOuterJoin = new ArrayList<>();
List<String> where = new ArrayList<>();
List<String> having = new ArrayList<>();
List<String> groupBy = new ArrayList<>();
List<String> orderBy = new ArrayList<>();
List<String> lastList = new ArrayList<>();
List<String> columns = new ArrayList<>();
List<List<String>> valuesList = new ArrayList<>();
可以看到是一堆 List 先暂存这些sql 片段,然后再拼装成 sql 语句,
因为它重写了 toString 方法
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sql().sql(sb);
return sb.toString();
}
调用的 sql 方法是
public String sql(Appendable a) {
SafeAppendable builder = new SafeAppendable(a);
if (statementType == null) {
return null;
}
String answer;
switch (statementType) {
case DELETE:
answer = deleteSQL(builder);
break;
case INSERT:
answer = insertSQL(builder);
break;
case SELECT:
answer = selectSQL(builder);
break;
case UPDATE:
answer = updateSQL(builder);
break;
default:
answer = null;
}
return answer;
}
根据上面的 statementType判断是个什么 sql,我们这个是 selectSQL 就走的 SELECT 这个分支
private String selectSQL(SafeAppendable builder) {
if (distinct) {
sqlClause(builder, "SELECT DISTINCT", select, "", "", ", ");
} else {
sqlClause(builder, "SELECT", select, "", "", ", ");
}
sqlClause(builder, "FROM", tables, "", "", ", ");
joins(builder);
sqlClause(builder, "WHERE", where, "(", ")", " AND ");
sqlClause(builder, "GROUP BY", groupBy, "", "", ", ");
sqlClause(builder, "HAVING", having, "(", ")", " AND ");
sqlClause(builder, "ORDER BY", orderBy, "", "", ", ");
limitingRowsStrategy.appendClause(builder, offset, limit);
return builder.toString();
}
上面的可以看出来就是按我们常规的 sql 理解顺序来处理
就是select ... from ... where ...
这样子
再看下 sqlClause 的代码
private void sqlClause(SafeAppendable builder, String keyword, List<String> parts, String open, String close,
String conjunction) {
if (!parts.isEmpty()) {
if (!builder.isEmpty()) {
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);
}
}
这里的拼接方式还需要判断 AND 和 OR 的判断逻辑,其他就没什么特别的了,只是where 语句中的 lastList 不知道是干嘛的,好像只有添加跟赋值的操作,有知道的大神也可以评论指导下
Recommend
-
8
简要分析Hacking Team 远程控制系统 绿盟科技
-
54
Toast的源码分析 本篇文章简要分析下Toast的源码。 Toast.makeText(this,"toast",Toast.LENGTH_LONG).show(); makeText() 该方法主要是 new 一个 Toast 对象,包含 Toast 的布局、mNextView、...
-
29
在《用金钱换时间,简要分析拼多多的优惠体系》中,作者简要讲述了拼多多的优惠逻辑。并在文中给种树养猪消星星挖了个坑留待以后再讲,今天将书接上文来补全上一篇文章没有涉及到的这三个点,即:多多果园、金猪赚大钱以及多多爱消除。 1. 引言 在上一篇文章《用金...
-
58
问题概要 有问题的版本如下 phpStudy20180211版本 php5.4.45与php5.2.17 ext扩展文件夹下的php_xmlrpc.dll phpStudy20161103版本 php5.4.45与php5.2.17 ext扩展文件夹下的php_xmlrpc.dll 注:这两...
-
11
Android内存泄露分析简要思路 工作中遇到挺多需要分析内存泄露问...
-
15
0x00 前言 11月9日维基解密公布一个代号为Vault8的文档,包含服务器远程控制工具Hive的源代码和开发文档。本文仅站在技术角度,介绍测试方法,简要分析工具特点。 维基解密地址: https://wikileaks.org/vault8/ 0x01...
-
4
mybatis系列-第一条sql的细节 2022-12-11 Java , Mybatis 2 5
-
6
mybatis系列-第一条sql的更多细节 2022-12-18 Java , Mybatis 6 79...
-
2
mybatis系列-sql 类的简单使用mybatis 还有个比较有趣的功能,就是使用 SQL 类升成 sql,有点类似于 hibernate 或者像 php 的 laravel 框架等的,就是把sql 这种放在 xml 里或者代码里直接写 sql 用对象的形式sel...
-
10
Mybatis-SQL分析组件 大促备战,最大的隐患项之...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK