博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fescar - RM DeleteExecutor介绍
阅读量:6350 次
发布时间:2019-06-22

本文共 3528 字,大约阅读时间需要 11 分钟。

开篇

 这篇文章的目的是讲解RM Executor模块当中一些通用的方法,这些方法在各个Executor的父类当中实现的,各个子类Executor模块都会复用,因此抽取出来统一的进行讲解。

 个人是认为抽取通用的内容放在一篇文章讲解完后可以针对每类Executor讲解特有的功能,这样能够有更好的理解。这篇文章讲解Executor的实现类DeleteExecutor。

类依赖图

说明:

  • 着重讲解DeleteExecutor实现类。

DeleteExecutor方法介绍

public class DeleteExecutor
extends AbstractDMLBaseExecutor
{ public DeleteExecutor(StatementProxy statementProxy, StatementCallback statementCallback, SQLRecognizer sqlRecognizer) { super(statementProxy, statementCallback, sqlRecognizer); } @Override protected TableRecords beforeImage() throws SQLException { SQLDeleteRecognizer visitor = (SQLDeleteRecognizer) sqlRecognizer; // 获取表的所有的列 TableMeta tmeta = getTableMeta(visitor.getTableName()); List
columns = new ArrayList<>(); for (String column : tmeta.getAllColumns().keySet()) { columns.add(column); } // 拼接SELECT的SQL语句 StringBuffer selectSQLAppender = new StringBuffer("SELECT "); for (int i = 0; i < columns.size(); i++) { selectSQLAppender.append(getColumnNameInSQL(columns.get(i))); if (i < (columns.size() - 1)) { selectSQLAppender.append(", "); } } String whereCondition = null; // 解析并获取where条件 ArrayList
paramAppender = new ArrayList<>(); if (statementProxy instanceof ParametersHolder) { whereCondition = visitor.getWhereCondition((ParametersHolder) statementProxy, paramAppender); } else { whereCondition = visitor.getWhereCondition(); } // 拼接SQL的where条件 selectSQLAppender.append(" FROM " + getFromTableInSQL() + " WHERE " + whereCondition + " FOR UPDATE"); String selectSQL = selectSQLAppender.toString(); // 根据拼接的SQL查询数据表获取删除前的数据 TableRecords beforeImage = null; PreparedStatement ps = null; Statement st = null; ResultSet rs = null; try { if (paramAppender.isEmpty()) { st = statementProxy.getConnection().createStatement(); rs = st.executeQuery(selectSQL); } else { ps = statementProxy.getConnection().prepareStatement(selectSQL); for (int i = 0; i< paramAppender.size(); i++) { ps.setObject(i + 1, paramAppender.get(i)); } rs = ps.executeQuery(); } beforeImage = TableRecords.buildRecords(tmeta, rs); } finally { if (rs != null) { rs.close(); } if (st != null) { st.close(); } if (ps != null) { ps.close(); } } return beforeImage; }}

说明:

  • DeleteExecutor需要保存SQL执行前的镜像。
  • 执行前镜像的准备整体思路是按照按照删除条件逆向拼接正向查询SQL。
  • 查询的SQL的select的字段直接从查询表的元数据的列值。
  • 查询的SQL的条件通过解析delete的条件生成。
  • 执行根据delete操作生成的正向select语句查询删除前的数据。
  • 根据TableRecords.buildRecords生成执行前镜像。

public class DeleteExecutor
extends AbstractDMLBaseExecutor
{ public DeleteExecutor(StatementProxy statementProxy, StatementCallback statementCallback, SQLRecognizer sqlRecognizer) { super(statementProxy, statementCallback, sqlRecognizer); } @Override protected TableRecords afterImage(TableRecords beforeImage) throws SQLException { return TableRecords.empty(getTableMeta()); }}

说明:

  • DeleteExecutor保存的执行后的镜像就是生产空白进行而已。
  • TableRecords.empty()方法返回空白镜像。

期待

 DeleteExecutor生成执行前后镜像的过程分析完后,会接着分析UpdateExecutor。

转载地址:http://gutla.baihongyu.com/

你可能感兴趣的文章
php 基础知识
查看>>
MySQL数据库引擎
查看>>
OneZero第四周第五次站立会议(2016.4.15)
查看>>
MYSQL的存储函数
查看>>
lnks
查看>>
Problem J
查看>>
Ellipse
查看>>
ViewPager与PagerAdapter
查看>>
【CSS系列】对表单和数据表格应用样式
查看>>
如何成为Java架构师
查看>>
19.04.18--推箱子(graphics图形库)(内置可视化地图编辑器//还未加入读取写入文件)...
查看>>
Sleuth+Zipkin+Log
查看>>
vs2017 在win10下安装后开始运行asp.net core 项目时出错
查看>>
《七周七语言:理解多种编程范型》书评整理
查看>>
poj 1014多重背包
查看>>
Web应用程序系统的多用户权限控制设计及实现-权限模块【6】
查看>>
[老齐的求职攻略] 第三章 笔试技巧
查看>>
Android中使用ShareSDK集成分享功能
查看>>
odp.net 使用
查看>>
【leetcode】Reorganize String
查看>>