`
cywhoyi
  • 浏览: 420163 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

mybatis自定义解析插件

阅读更多

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;

  }

}

 

  • 大小: 21.7 KB
  • 大小: 24.2 KB
3
0
分享到:
评论
4 楼 zhangwei_david 2015-01-18  
     路过
3 楼 cywhoyi 2014-04-22  
cywhoyi 写道
dsjt 写道
有没有方法自定义结果集解析插件??

用拦截器是在太麻烦,缺少各种借口对象。

有的,mybatis提供ResultHandler接口,
public interface ResultHandler {

  void handleResult(ResultContext context);

}

类似hibernate那种RowMap方式
  public void queryWithRowHandler(final String id, final Object parameterObject, final RowHandler rowHandler) throws SQLException {
    transactionManager.doInTransaction(new TransactionScope() {
      public Object execute(Transaction transaction) throws SQLException {
        MappedStatement ms = configuration.getMappedStatement(id);
        Executor executor = transaction.getExecutor();
        return executor.query(ms, wrapCollection(parameterObject), RowBounds.DEFAULT, new ResultHandler() {
          public void handleResult(ResultContext context) {
            rowHandler.handleRow(context.getResultObject());
          }
        });
      }
    });
  }
2 楼 cywhoyi 2014-04-22  
dsjt 写道
有没有方法自定义结果集解析插件??

用拦截器是在太麻烦,缺少各种借口对象。

有的,mybatis提供ResultHandler接口,
public interface ResultHandler {

  void handleResult(ResultContext context);

}
1 楼 dsjt 2014-04-22  
有没有方法自定义结果集解析插件??

用拦截器是在太麻烦,缺少各种借口对象。

相关推荐

    mybatis 自定义分页插件.rar

    在MyBatis框架中,自定义分页插件是一种常见的需求,特别是在处理大数据量时,为了提高用户体验和系统性能,我们需要对数据进行分页显示。本压缩包“mybatis 自定义分页插件.rar”提供了关于如何利用MyBatis的拦截器...

    手写Mybatis自动填充插件

    Mybatis 提供了一种插件机制,允许我们在特定的拦截点(如:执行 SQL 前后)插入自定义的行为。这些插件是基于 Java 的动态代理实现的,通过实现 `Interceptor` 接口并重写 `intercept` 方法,我们可以对 Mybatis 的...

    编写一个Mybatis插件 Mybatis脱敏插件.docx

    在Mybatis框架中,如果想要开发自定义插件,则需要实现`org.apache.ibatis.plugin.Interceptor`接口。该接口提供了三个方法: 1. **`intercept(Invocation invocation)`**:这是插件的核心方法,当特定的调用发生时...

    mybatis3.x源码深度解析与最佳实践.pdf

    XMLConfigBuilder.parseConfiguration 方法是 MyBatis 中的核心方法之一,该方法负责解析 MyBatis 的配置文件,包括属性解析、加载 settings 节点、加载自定义 VFS、解析类型别名、加载插件、加载对象工厂、创建对象...

    Mybatis分库分表扩展插件

    Mybatis的插件机制基于拦截器(Interceptor)设计模式,允许在执行SQL之前或之后插入自定义逻辑。分库分表插件主要工作在SQL路由阶段,根据特定的规则(如哈希、范围等)对原始SQL进行修改,添加分片信息,确保数据...

    mybatis逆向工程

    6. **自定义插件(Custom Plugins)**:如果你需要对生成的代码进行特殊处理,可以编写自定义插件,MBG支持插件机制,允许用户扩展其功能。例如,generatorSqlmapCustom可能就是一个自定义的插件或者特定的配置文件...

    Mybatis系列教程Mybatis插件共8页.pdf.z

    这个教程可能深入解析了Mybatis插件的原理、安装、配置以及如何利用它们优化数据库操作。 【描述】"Mybatis系列教程Mybatis插件共8页.pdf.zip" 描述了教程的形式和大致内容。它是以PDF文档的形式存在,且压缩包内...

    mybatis分页插件的使用

    ### Mybatis分页插件详解 #### 一、概述 在使用Mybatis处理大量数据时,分页查询是一项常见的需求。传统的做法是在SQL语句中手动加入`LIMIT`和`OFFSET`来实现分页功能,这种方法不仅繁琐而且容易出错。针对这一...

    springMVC,spring,mybatis所有插件

    MyBatis插件系统允许开发者自定义拦截器,对MyBatis的执行流程进行拦截,实现如日志记录、性能分析、动态SQL等功能。在描述中提到的插件,可能是用于增强MyBatis开发体验的工具,例如代码生成器、SQL调试助手等。将...

    mybatis分页插件源码

    分析源码可以帮助我们理解分页插件的内部实现机制,包括如何解析SQL、如何插入分页条件、如何处理不同数据库的差异等。这有助于我们在遇到问题时能更准确地定位和解决。 总之,MyBatis分页插件是提升开发效率、...

    Mybatis系列教程自定义持久层框架共15页.pdf.z

    以下是关于Mybatis自定义持久层的关键知识点: 1. **配置文件自定义**:Mybatis的配置文件(mybatis-config.xml)允许开发者定义数据源、事务管理器、环境以及Mappers等,这些都是自定义持久层的基础。理解并熟练...

    mybatis-generator插件 自动生成代码和注解

    - **插件扩展**:MBG提供插件机制,可以通过编写自定义插件实现一些特殊功能,如添加额外的注释、进行代码格式化等。 6. **最佳实践**: - 在项目初期使用MBG,可以快速构建数据访问层的基础代码。 - 对于经常...

    mybatis插件分页测试

    MyBatis允许开发者创建自定义插件,这些插件可以在执行特定的SQL操作之前或之后进行拦截,例如:插入、更新、删除和查询等。通过实现Interceptor接口并重写intercept方法,我们可以在其中添加分页逻辑。 在"mybatis...

    MyBatis 插件.zip

    为了实现这个功能,开发者可能需要创建一个 MyBatis 插件,该插件解析 MyBatis 的 XML 映射文件,提取出 SQL 语句和参数,然后将这些信息传递给 IDE,使其能够进行智能分析和提示。 对于标签中的 "mybatis 插件",...

    mybatis-pagination-master

    《MyBatis分页插件mybatis-pagination深度解析》 在大数据量的Web应用中,分页查询是不可或缺的一部分,它能有效提高系统的性能并优化用户体验。MyBatis作为一款强大的持久层框架,虽然提供了基本的SQL映射功能,但...

    Mybatis PageHelper分页插件 v5.2.0-源码.zip

    《Mybatis PageHelper 分页插件 v5.2.0 源码解析》 Mybatis PageHelper 是一款广泛应用于Java开发中的Mybatis框架的分页插件,它提供了强大的分页功能,使得在大数据量的查询场景下,能够有效地控制内存消耗,提升...

    idea-mybatis插件包

    1. **MyBatis框架**:MyBatis是一个轻量级的持久层框架,它允许开发者编写自定义的SQL,存储过程,以及高级映射。它消除了几乎所有的JDBC代码和参数的手动设置,以及结果集的解析。 2. **IntelliJ IDEA**:是一款...

    mybatis分页插件

    - 分页参数自定义:可以通过实现PageParam接口来自定义分页参数的解析方式。 - 分页结果包装:Page对象提供了丰富的属性,如总记录数、总页数、当前页数据等,方便进行前端展示。 - 分页插件配置:可以根据项目...

Global site tag (gtag.js) - Google Analytics