`
y806839048
  • 浏览: 1126051 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

通用mapper生成sql及mybatis使用过程

阅读更多

 

sql装配,自己实现一个,通用mapper和mybatis-generator是两个东西各自功能不同,结合使用而已

通用mapper:

1,省略单表操作的xml

2,不必写实现类(用通用mapper的单表操作方法不用,用xml中sql(mybatis)也不用)

   mybaits      VS         hibernate

mybatis-generator对应hibernate反向工程

通用mapper对应spring-data-jpa

 

 

(一)、通用mapper生成sql过程:

 

生成具体生成sql的地方在相应的操作方法接口中

 

public interface SelectOneMapper<T> {

 

    /**

     * 鏍规嵁瀹炰綋涓殑灞炴�杩涜鏌ヨ锛屽彧鑳芥湁涓�釜杩斿洖鍊硷紝鏈夊涓粨鏋滄槸鎶涘嚭寮傚父锛屾煡璇㈡潯浠朵娇鐢ㄧ瓑鍙�

     *

     * @param record

     * @return

     */

    @SelectProvider(type = BaseSelectProvider.class, method = "dynamicSQL")

    T selectOne(T record);

 

}

 

public class BaseSelectProvider extends MapperTemplate 

 

“V”型调试

 

MapperTemplate中setSqlSource:

 

SqlNode sqlNode = (SqlNode) method.invoke(this, ms);BaseSelectProvider--》dynamicSQL///调用对应操作接口的方法获取对应单表语句

DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(ms.getConfiguration(), sqlNode);

setSqlSource(ms, dynamicSqlSource);////自动生成mybatis能用的写在xml中的节点格式语句

 

 

MappedStatement ms这个含有mybatis的1,通用配置,2,基于哪个是实体的单表操作,3,参数,4,哪种操作,5,用什么打印日志

 

sqlNode包含三个段1,select from端,2,表名端,3,where端(由ms得来)

 

 

 

 

 

/**

     * 重新设置SqlSource

     *

     * @param ms

     * @throws java.lang.reflect.InvocationTargetException

     * @throws IllegalAccessException

     */

    public void setSqlSource(MappedStatement ms) throws Exception {

        if (this.mapperClass == getMapperClass(ms.getId())) {

            throw new RuntimeException("请不要配置或扫描通用Mapper接口类:" + this.mapperClass);

        }

        Method method = methodMap.get(getMethodName(ms));

        try {

            //第一种,直接操作ms,不需要返回值

            if (method.getReturnType() == Void.TYPE) {

                method.invoke(this, ms);

            }

            //第二种,返回SqlNode

            else if (SqlNode.class.isAssignableFrom(method.getReturnType())) {

                SqlNode sqlNode = (SqlNode) method.invoke(this, ms);

                DynamicSqlSource dynamicSqlSource = new DynamicSqlSource(ms.getConfiguration(), sqlNode);

                setSqlSource(ms, dynamicSqlSource);

            }

            //第三种,返回xml形式的sql字符串

            else if (String.class.equals(method.getReturnType())) {

                String xmlSql = (String) method.invoke(this, ms);

                SqlSource sqlSource = createSqlSource(ms, xmlSql);

                //替换原有的SqlSource

                setSqlSource(ms, sqlSource);

            } else {

                throw new RuntimeException("自定义Mapper方法返回类型错误,可选的返回类型为void,SqlNode,String三种!");

            }

            //cache

            checkCache(ms);

        } catch (IllegalAccessException e) {

            throw new RuntimeException(e);

        } catch (InvocationTargetException e) {

            throw new RuntimeException(e.getTargetException() != null ? e.getTargetException() : e);

        }

    }

 

    protected void setSqlSource(MappedStatement ms, SqlSource sqlSource)

  {

    MetaObject msObject = SystemMetaObject.forObject(ms);/////////////////////////可知MetaObject其实就是ms

    msObject.setValue("sqlSource", sqlSource);

    

    KeyGenerator keyGenerator = ms.getKeyGenerator();

    if ((keyGenerator instanceof Jdbc3KeyGenerator)) {

      msObject.setValue("keyGenerator", new MultipleJdbc3KeyGenerator());

    }

  }

  

MetaObject:mybatis的类

    public void setValue(String name, Object value)

  {

    PropertyTokenizer prop = new PropertyTokenizer(name);

    if (prop.hasNext())

    {

      MetaObject metaValue = metaObjectForProperty(prop.getIndexedName());

      if (metaValue == SystemMetaObject.NULL_META_OBJECT)

      {

        if ((value == null) && (prop.getChildren() != null)) {

          return;

        }

        metaValue = this.objectWrapper.instantiatePropertyValue(name, prop, this.objectFactory);

      }

      metaValue.setValue(prop.getChildren(), value);

    }

    else

    {

      this.objectWrapper.set(prop, value);

    }

  }

  

查看这几个类:

SqlSourceBuilder

UnpooledDataSourceFactory

Jdbc3KeyGenerator

可知:在检查注入主键的的时候就用MetaObject设置了一次默认的sqlsource(MetaObject是单例)

在具体时候某个通用mapper的单表方法时重置下MetaObject的sqlsource,之后执行sql的时候取到的MetaObject的sqlsource就是覆盖后的()

这个sqlsource的格式就是传统的mybaits.xml手动写的sql节点的格式,之后就交给mybatis去解析这种格式(mybatis使用节点语句都是放到MetaObject中后使用)

 

 

(二)、mybatis中使用ms大致过程:

 

SelectKeyGenerator///使用的地方调用Executor对象

CachingExecutor////////////////这里直接用ms去执行sql

BaseExecutor

MappedStatement

DynamicSqlSource

SqlSourceBuilder

StaticSqlSource

BoundSql

 

 

SelectKeyGenerator:

 

  private void processGeneratedKeys(Executor executor, MappedStatement ms, Object parameter)

  {

    try

    {

      if ((parameter != null) && (this.keyStatement != null) && (this.keyStatement.getKeyProperties() != null))

      {

        String[] keyProperties = this.keyStatement.getKeyProperties();

        Configuration configuration = ms.getConfiguration();

        MetaObject metaParam = configuration.newMetaObject(parameter);

        if (keyProperties != null)

        {

          Executor keyExecutor = configuration.newExecutor(executor.getTransaction(), ExecutorType.SIMPLE);

          List<Object> values = keyExecutor.query(this.keyStatement, parameter, RowBounds.DEFAULT, Executor.NO_RESULT_HANDLER);

        ...

}

}}}

CachingExecutor:

 @Override

  public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {

    BoundSql boundSql = ms.getBoundSql(parameterObject);

    CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);

    return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);

  }

 

DynamicSqlSource:

  public BoundSql getBoundSql(Object parameterObject) {

    DynamicContext context = new DynamicContext(configuration, parameterObject);

    rootSqlNode.apply(context);

    SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);

    Class<?> parameterType = parameterObject == null ? Object.class : parameterObject.getClass();

    SqlSource sqlSource = sqlSourceParser.parse(context.getSql(), parameterType, context.getBindings());

    BoundSql boundSql = sqlSource.getBoundSql(parameterObject);

    for (Map.Entry<String, Object> entry : context.getBindings().entrySet()) {

      boundSql.setAdditionalParameter(entry.getKey(), entry.getValue());

    }

    return boundSql;

  }

 

StaticSqlSource:

 public StaticSqlSource(Configuration configuration, String sql, List<ParameterMapping> parameterMappings) {

    this.sql = sql;

    this.parameterMappings = parameterMappings;

    this.configuration = configuration;

  }

 

  @Override

  public BoundSql getBoundSql(Object parameterObject) {

    return new BoundSql(configuration, sql, parameterMappings, parameterObject);

  }

 

 

 

 

参考:

http://blog.csdn.net/isea533/article/details/41892319

 

 

 

 

 

分享到:
评论

相关推荐

    浅谈MyBatis通用Mapper实现原理

    其次,通用Mapper使用了MyBatis框架的特点,例如通过ProviderSqlSource来生成MappedStatement实例,MappedStatement实例包含了方法id、结果映射、缓存配置、SqlSource等信息。SqlSource是MyBatis框架中最核心的组件...

    TkMybatis通用Mapper逆向工程代码生成工具

    TkMybatis通用Mapper逆向工程代码生成工具是Java开发中的一个高效实用的工具,它基于Maven项目构建,主要用于简化数据库表与Java实体类、Mapper接口及XML映射文件之间的同步工作。通过此工具,开发者可以自动生成...

    通用Mapper映射视频

    通过尚硅谷提供的通用Mapper视频教程,我们可以系统地学习和掌握映射文件的使用方法,以及如何利用通用Mapper插件来简化日常开发工作。这对于提高开发效率、优化代码结构都有着重要的意义。无论是对于初学者还是有...

    尚硅谷-通用Mapper视频

    通用Mapper是一款非常好用的MyBatis插件,它能够帮助我们自动生成常用增删改查操作的SQL语句,克服MyBatis开发过程中需要大量编写SQL语句的弊端。由于通用Mapper是根据实体类的属性自动生成对应的SQL语句,所以可以...

    通用Mapper逆向工程代码-自动生成代码,支持mysql和oracle

    通用Mapper逆向工程代码是基于MyBatis框架的一个强大工具,它可以帮助开发者自动根据数据库表结构生成对应的Mapper接口、XML配置文件以及实体类,极大地提高了开发效率,减轻了手动编写这些重复性工作的负担。...

    mybatis通用mapper

    MyBatis通用Mapper是一款在MyBatis框架基础上封装的工具,旨在简化开发过程中对数据库 CRUD(创建、读取、更新、删除)操作的繁琐过程。它通过提供预定义的SQL映射方法,使得开发者可以无需编写大量的XML配置文件,...

    尚硅谷-通用Mapper视频(最新)

    通用Mapper是一款非常好用的MyBatis插件,它能够帮助我们自动生成常用增删改查操作的SQL语句,克服MyBatis开发过程中需要大量编写SQL语句的弊端。由于通用Mapper是根据实体类的属性自动生成对应的SQL语句,所以可以...

    mybatis-通用Mapper-逆向工程-代码生成工具

    MyBatis-通用Mapper通过逆向工程(Reverse Engineering)和代码生成工具,能够自动生成与数据库表相关的Java实体类、Mapper接口和Mapper XML配置文件,极大地提高了开发效率。下面我们将深入探讨这个工具的使用和...

    基于Java的Mybatis通用Mapper插件.zip

    基于Java的Mybatis通用Mapper插件 项目概述 Mybatis通用Mapper插件是一个基于Mybatis的增强工具,旨在简化数据库操作,提高开发效率。它通过提供通用的CRUD操作接口,减少了手动编写SQL语句的工作量,同时保留了...

    maven+mybatis+通用mapper生成java实体类,映射接口与映射文件

    总之,结合Maven、MyBatis和通用Mapper,开发者能够快速、准确地生成Java实体类、Mapper接口和映射文件,从而专注于业务逻辑的实现,而不是重复的代码编写工作。这在大型项目中尤为重要,能够有效地提升团队的开发...

    mybatis 通用mapper

    - **减少代码量**:通过使用通用Mapper,开发人员可以直接获得一系列常用的数据库操作方法,而无需手动编写XML映射文件及相应的接口方法。 - **易于维护**:当数据库表结构发生变化时,仅需调整实体类的定义即可,...

    springboot+mybatis逆向生成controller+service+mapper+entity

    通用Mapper是一种便捷的MyBatis扩展,它可以自动处理基本的增删查改操作,使得开发者不必为每个方法编写繁琐的SQL语句。 具体来说,这个工具可能的工作流程如下: 1. 连接数据库,读取表结构。 2. 根据表信息生成...

    Mybatis Mapper的使用

    7. **插件支持**:Mybatis还允许我们编写自定义插件,对Mapper接口的执行过程进行拦截,例如实现通用的分页、日志记录等功能。 总结来说,Mybatis Mapper通过提供一种接口式的编程模型,降低了数据访问层的复杂度,...

    MyBatis插件 - 通用mapper.doc

    通用mapper的作用主要在于自动生成SQL语句。在MyBatis中,逆向工程可以根据实体类生成对应的XML映射文件,但当实体类的属性与数据库字段不完全对应时,逆向工程生成的配置可能不适用。通用mapper则解决了这个问题,...

    (代码)SpringCloud第03讲:整合MyBatis通用Mapper

    在本课程中,我们将深入探讨如何在Spring Cloud项目中整合MyBatis通用Mapper,以便实现高效、便捷的数据访问。Spring Cloud作为一个微服务架构的集合,提供了丰富的工具和服务,帮助开发者构建分布式系统。而MyBatis...

    通用Mapper、RESTful Web Service SSM mybatis 笔记

    通用Mapper通过动态生成SQL语句,减少了开发工作量,提高了开发效率。 【分页助手】 在MyBatis中,分页助手如Mybatis-Paginator插件可以帮助开发者实现高效的分页查询。它通过拦截器的方式,自动为SQL语句添加...

    尚硅谷-通用Mapper视频教程

    2. **灵活的SQL语句生成**:通用Mapper支持动态SQL语句生成,可以根据不同的条件组合生成复杂的SQL语句。 3. **丰富的扩展功能**:除了基本的CRUD操作外,还提供了分页查询、批量插入、更新等高级功能。 4. **易于...

    集成Mybatis分页插件和通用Mapper的示例项目

    通过以上步骤,你就可以在项目中有效地使用Mybatis分页插件和通用Mapper了。这个示例项目应该包含了上述所有步骤的详细代码,你可以参考并学习如何在实际项目中进行集成。记得在实践中不断探索,以更好地理解和掌握...

    springboot + mybatis(通用mapper) + HikariCP(比durid更快)多数据源

    在项目中引入 `通用Mapper`,这是一个基于 `MyBatis` 的插件,可以自动生成 CRUD 操作,大大减少了为每个表编写 XML 映射文件和对应的 Service 层代码的工作。通用Mapper提供了丰富的API,使得开发人员能够快速实现...

Global site tag (gtag.js) - Google Analytics