mybatis自带的解析已经蛮强大,至少我们能够用mybatis简单的语法来表达我们sql拼接时候的语义,比如$、#等诸如此类的符号意思,但是其实你并不喜欢再重新去理解一套它的语法,比如贵公司有自定义的一套组件,也许*代表的意思就是占位符,如果是这样的话,mybatis提供一套语法语义的解析的接口,只需要你注册进去,那么就按照你的想法进行解析。
首先我们查看UML图,来查阅下现阶段的mybatis是解析工作
上述几个类大致是用来解析的关键类,除了EwellPlugin的插件类是自定义以外,就能完成你自定义的解析组件开发,代码其实蛮简单的,这里是关于velocity的模板引擎的自定义组件放入mybatis的解析池中。其实对于mybatis访问DB最为重要的解析语句和绑定参数都在BoundSql类中,其实任何ORM framework最终的访问DB其实就是JDBC一样的,因为这些已经成为标准化,反过来数据库的驱动其实还是挺不一样的。
public class EwellDriver implements LanguageDriver { @Override public ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) { return new DefaultParameterHandler(mappedStatement, parameterObject, boundSql); } @Override public SqlSource createSqlSource(Configuration configuration, XNode script, Class<?> parameterTypeClass) { if (parameterTypeClass == null) { parameterTypeClass = Object.class; } return new SQLScriptSource(configuration, script.getNode().getTextContent(), parameterTypeClass); } @Override public SqlSource createSqlSource(Configuration configuration, String script, Class<?> parameterTypeClass) { if (parameterTypeClass == null) { parameterTypeClass = Object.class; } return new SQLScriptSource(configuration, script, parameterTypeClass); } }
public class SQLScriptSource implements SqlSource { protected static final String PARAMETER_OBJECT_KEY = "_parameter"; protected static final String DATABASE_ID_KEY = "_databaseId"; protected static final String MAPPING_COLLECTOR_KEY = "_pmc"; protected static final String VARIABLES_KEY = "_vars"; private static int templateIndex = 0; private final ParameterMapping[] parameterMappingSources; private final Object compiledScript; private final Configuration configuration; public SQLScriptSource(Configuration configuration, String script, Class<?> parameterTypeClass) { this.configuration = configuration; ParameterMappingSourceParser mappingParser = new ParameterMappingSourceParser(configuration, script, parameterTypeClass); parameterMappingSources = mappingParser.getParameterMappingSources(); script = mappingParser.getSql(); compiledScript = VelocityFacade.compile(script, "velocity-template-" + (++templateIndex)); } @Override public BoundSql getBoundSql(Object parameterObject) { final Map<String, Object> context = new HashMap<String, Object>(); final ParameterMappingCollector pmc = new ParameterMappingCollector(parameterMappingSources, context, configuration); context.put(DATABASE_ID_KEY, configuration.getDatabaseId()); context.put(PARAMETER_OBJECT_KEY, parameterObject); context.put(MAPPING_COLLECTOR_KEY, pmc); context.put(VARIABLES_KEY, configuration.getVariables()); final String sql = VelocityFacade.apply(compiledScript, context); BoundSql boundSql = new BoundSql(configuration, sql, pmc.getParameterMappings(), parameterObject); for (Map.Entry<String, Object> entry : context.entrySet()) { boundSql.setAdditionalParameter(entry.getKey(), entry.getValue()); } return boundSql; } }
相关推荐
在MyBatis框架中,自定义分页插件是一种常见的需求,特别是在处理大数据量时,为了提高用户体验和系统性能,我们需要对数据进行分页显示。本压缩包“mybatis 自定义分页插件.rar”提供了关于如何利用MyBatis的拦截器...
Mybatis 提供了一种插件机制,允许我们在特定的拦截点(如:执行 SQL 前后)插入自定义的行为。这些插件是基于 Java 的动态代理实现的,通过实现 `Interceptor` 接口并重写 `intercept` 方法,我们可以对 Mybatis 的...
在Mybatis框架中,如果想要开发自定义插件,则需要实现`org.apache.ibatis.plugin.Interceptor`接口。该接口提供了三个方法: 1. **`intercept(Invocation invocation)`**:这是插件的核心方法,当特定的调用发生时...
XMLConfigBuilder.parseConfiguration 方法是 MyBatis 中的核心方法之一,该方法负责解析 MyBatis 的配置文件,包括属性解析、加载 settings 节点、加载自定义 VFS、解析类型别名、加载插件、加载对象工厂、创建对象...
Mybatis的插件机制基于拦截器(Interceptor)设计模式,允许在执行SQL之前或之后插入自定义逻辑。分库分表插件主要工作在SQL路由阶段,根据特定的规则(如哈希、范围等)对原始SQL进行修改,添加分片信息,确保数据...
6. **自定义插件(Custom Plugins)**:如果你需要对生成的代码进行特殊处理,可以编写自定义插件,MBG支持插件机制,允许用户扩展其功能。例如,generatorSqlmapCustom可能就是一个自定义的插件或者特定的配置文件...
这个教程可能深入解析了Mybatis插件的原理、安装、配置以及如何利用它们优化数据库操作。 【描述】"Mybatis系列教程Mybatis插件共8页.pdf.zip" 描述了教程的形式和大致内容。它是以PDF文档的形式存在,且压缩包内...
### Mybatis分页插件详解 #### 一、概述 在使用Mybatis处理大量数据时,分页查询是一项常见的需求。传统的做法是在SQL语句中手动加入`LIMIT`和`OFFSET`来实现分页功能,这种方法不仅繁琐而且容易出错。针对这一...
MyBatis插件系统允许开发者自定义拦截器,对MyBatis的执行流程进行拦截,实现如日志记录、性能分析、动态SQL等功能。在描述中提到的插件,可能是用于增强MyBatis开发体验的工具,例如代码生成器、SQL调试助手等。将...
分析源码可以帮助我们理解分页插件的内部实现机制,包括如何解析SQL、如何插入分页条件、如何处理不同数据库的差异等。这有助于我们在遇到问题时能更准确地定位和解决。 总之,MyBatis分页插件是提升开发效率、...
以下是关于Mybatis自定义持久层的关键知识点: 1. **配置文件自定义**:Mybatis的配置文件(mybatis-config.xml)允许开发者定义数据源、事务管理器、环境以及Mappers等,这些都是自定义持久层的基础。理解并熟练...
- **插件扩展**:MBG提供插件机制,可以通过编写自定义插件实现一些特殊功能,如添加额外的注释、进行代码格式化等。 6. **最佳实践**: - 在项目初期使用MBG,可以快速构建数据访问层的基础代码。 - 对于经常...
MyBatis允许开发者创建自定义插件,这些插件可以在执行特定的SQL操作之前或之后进行拦截,例如:插入、更新、删除和查询等。通过实现Interceptor接口并重写intercept方法,我们可以在其中添加分页逻辑。 在"mybatis...
为了实现这个功能,开发者可能需要创建一个 MyBatis 插件,该插件解析 MyBatis 的 XML 映射文件,提取出 SQL 语句和参数,然后将这些信息传递给 IDE,使其能够进行智能分析和提示。 对于标签中的 "mybatis 插件",...
《MyBatis分页插件mybatis-pagination深度解析》 在大数据量的Web应用中,分页查询是不可或缺的一部分,它能有效提高系统的性能并优化用户体验。MyBatis作为一款强大的持久层框架,虽然提供了基本的SQL映射功能,但...
《Mybatis PageHelper 分页插件 v5.2.0 源码解析》 Mybatis PageHelper 是一款广泛应用于Java开发中的Mybatis框架的分页插件,它提供了强大的分页功能,使得在大数据量的查询场景下,能够有效地控制内存消耗,提升...
1. **MyBatis框架**:MyBatis是一个轻量级的持久层框架,它允许开发者编写自定义的SQL,存储过程,以及高级映射。它消除了几乎所有的JDBC代码和参数的手动设置,以及结果集的解析。 2. **IntelliJ IDEA**:是一款...
- 分页参数自定义:可以通过实现PageParam接口来自定义分页参数的解析方式。 - 分页结果包装:Page对象提供了丰富的属性,如总记录数、总页数、当前页数据等,方便进行前端展示。 - 分页插件配置:可以根据项目...