Example usage for org.apache.ibatis.mapping BoundSql getParameterObject

List of usage examples for org.apache.ibatis.mapping BoundSql getParameterObject

Introduction

In this page you can find the example usage for org.apache.ibatis.mapping BoundSql getParameterObject.

Prototype

public Object getParameterObject() 

Source Link

Usage

From source file:com.wbsf.core.mybatis.mook.locker.interceptor.OptimisticLocker.java

License:Open Source License

@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object intercept(Invocation invocation) throws Exception {

    String versionColumn;/*from w  ww .  j  av  a2  s .  c  o m*/
    if (null == props || props.isEmpty()) {
        versionColumn = "version";
    } else {
        versionColumn = props.getProperty("versionColumn", "version");
    }

    String interceptMethod = invocation.getMethod().getName();
    if ("prepare".equals(interceptMethod)) {

        StatementHandler routingHandler = (StatementHandler) PluginUtil.processTarget(invocation.getTarget());
        MetaObject routingMeta = SystemMetaObject.forObject(routingHandler);
        MetaObject hm = routingMeta.metaObjectForProperty("delegate");

        VersionLocker vl = VersionLockerResolver.resolve(hm);
        if (null != vl && !vl.value()) {
            return invocation.proceed();
        }

        String originalSql = (String) hm.getValue("boundSql.sql");
        StringBuilder builder = new StringBuilder(originalSql);
        builder.append(" AND ");
        builder.append(versionColumn);
        builder.append(" = ?");
        hm.setValue("boundSql.sql", builder.toString());

    } else if ("setParameters".equals(interceptMethod)) {

        ParameterHandler handler = (ParameterHandler) PluginUtil.processTarget(invocation.getTarget());
        MetaObject hm = SystemMetaObject.forObject(handler);

        VersionLocker vl = VersionLockerResolver.resolve(hm);
        if (null != vl && !vl.value()) {
            return invocation.proceed();
        }

        BoundSql boundSql = (BoundSql) hm.getValue("boundSql");
        Object parameterObject = boundSql.getParameterObject();
        if (parameterObject instanceof MapperMethod.ParamMap<?>) {
            MapperMethod.ParamMap<?> paramMap = (MapperMethod.ParamMap<?>) parameterObject;
            if (!paramMap.containsKey(versionColumn)) {
                throw new TypeException(
                        "All the primitive type parameters must add MyBatis's @Param Annotaion");
            }
        }

        Configuration configuration = ((MappedStatement) hm.getValue("mappedStatement")).getConfiguration();
        MetaObject pm = configuration.newMetaObject(parameterObject);
        Object value = pm.getValue(versionColumn);
        ParameterMapping versionMapping = new ParameterMapping.Builder(configuration, versionColumn,
                Object.class).build();
        TypeHandler typeHandler = versionMapping.getTypeHandler();
        JdbcType jdbcType = versionMapping.getJdbcType();

        if (value == null && jdbcType == null) {
            jdbcType = configuration.getJdbcTypeForNull();
        }

        int versionLocation = boundSql.getParameterMappings().size() + 1;
        try {
            PreparedStatement ps = (PreparedStatement) invocation.getArgs()[0];
            typeHandler.setParameter(ps, versionLocation, value, jdbcType);
        } catch (TypeException | SQLException e) {
            throw new TypeException("set parameter 'version' faild, Cause: " + e, e);
        }

        if (value.getClass() != Long.class && value.getClass() != long.class) {
            if (log.isDebugEnabled()) {
                log.error(Constent.LogPrefix
                        + "property type error, the type of version property must be Long or long.");
            }
        }

        // increase version
        pm.setValue(versionColumn, (long) value + 1);
    }
    return invocation.proceed();
}

From source file:com.wbsf.core.mybatis.mook.locker.interceptor.VersionLockerResolver.java

License:Open Source License

static VersionLocker resolve(MetaObject mo) {

    // if the method is not a 'update', return false
    MappedStatement ms = (MappedStatement) mo.getValue("mappedStatement");
    if (ms.getSqlCommandType() != SqlCommandType.UPDATE)
        return falseLocker;

    BoundSql boundSql = (BoundSql) mo.getValue("boundSql");
    Object paramObj = boundSql.getParameterObject();
    Class<?>[] paramCls = null;

    /******************Process param must order by below ***********************/
    // 1?Process @Param param
    if (paramObj instanceof MapperMethod.ParamMap<?>) {
        MapperMethod.ParamMap<?> mmp = (MapperMethod.ParamMap<?>) paramObj;
        if (null != mmp && !mmp.isEmpty()) {
            paramCls = new Class<?>[mmp.size() >> 1];
            int mmpLen = mmp.size() >> 1;
            for (int i = 0; i < mmpLen; i++) {
                Object index = mmp.get("param" + (i + 1));
                paramCls[i] = index.getClass();
            }/*  w w  w  .  ja v a  2  s .com*/
        }

        // 2?Process Map param
    } else if (paramObj instanceof Map) {
        paramCls = new Class<?>[] { Map.class };

        // 3?Process POJO entity param
    } else {
        paramCls = new Class<?>[] { paramObj.getClass() };
    }

    String id = ms.getId();
    Cache.MethodSignature vm = new Cache.MethodSignature(id, paramCls);
    VersionLocker versionLocker = versionLockerCache.getVersionLocker(vm);
    if (null != versionLocker)
        return versionLocker;

    if (null == mapperMap || mapperMap.isEmpty()) {
        Collection<Class<?>> mappers = ms.getConfiguration().getMapperRegistry().getMappers();
        if (null != mappers && !mappers.isEmpty()) {
            for (Class<?> me : mappers) {
                mapperMap.put(me.getName(), me);
            }
        }
    }

    int pos = id.lastIndexOf(".");
    String nameSpace = id.substring(0, pos);
    if (!mapperMap.containsKey(nameSpace)) {
        if (log.isDebugEnabled()) {
            log.debug(Constent.LogPrefix + "Config info error, maybe you have not config the Mapper interface");
            throw new RuntimeException("Config info error, maybe you have not config the Mapper interface");
        }
    }
    Class<?> mapper = mapperMap.get(nameSpace);
    Method m;
    try {
        m = mapper.getMethod(id.substring(pos + 1), paramCls);
    } catch (NoSuchMethodException | SecurityException e) {
        throw new RuntimeException("The Map type param error." + e, e);
    }
    versionLocker = m.getAnnotation(VersionLocker.class);
    if (null == versionLocker) { //????
        versionLocker = falseLocker;
    }
    if (!versionLockerCache.containMethodSignature(vm)) {
        versionLockerCache.cacheMethod(vm, versionLocker);
    }
    return versionLocker;
}

From source file:com.wsun.seap.dao.interceptor.PaginationInterceptor.java

License:Open Source License

@Override
public Object intercept(Invocation invocation) throws Throwable {
    // ??/*from   w ww . ja  v a 2 s .co  m*/
    final MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[MAPPED_STATEMENT_INDEX];
    // ?SQL
    // ??
    Object parameterObj = invocation.getArgs()[PARAMETER_INDEX];
    // ??QueryParam
    Object parameter;
    if (parameterObj instanceof QueryParam) {
        // ?QueryParam,??Map
        parameter = ((QueryParam) parameterObj).getAllParam();
        invocation.getArgs()[PARAMETER_INDEX] = parameter;
    } else {
        parameter = parameterObj;
    }

    BoundSql boundSql = mappedStatement.getBoundSql(parameter);
    if (StringUtils.isBlank(boundSql.getSql())) {
        return null;
    }
    // ??RowBounds
    RowBounds rowBounds = (RowBounds) invocation.getArgs()[ROWBOUNDS_INDEX];
    // 
    if (rowBounds != null && rowBounds != RowBounds.DEFAULT) {
        String originalSql = boundSql.getSql().trim();
        // ??sql
        String pageSql = dialect.getLimitString(originalSql, rowBounds.getOffset(), rowBounds.getLimit());
        invocation.getArgs()[ROWBOUNDS_INDEX] = new RowBounds(RowBounds.NO_ROW_OFFSET, RowBounds.NO_ROW_LIMIT);
        BoundSql newBoundSql = new BoundSql(mappedStatement.getConfiguration(), pageSql,
                boundSql.getParameterMappings(), boundSql.getParameterObject());
        MappedStatement newMs = copyFromMappedStatement(mappedStatement, new BoundSqlSqlSource(newBoundSql));
        invocation.getArgs()[MAPPED_STATEMENT_INDEX] = newMs;
    }
    return invocation.proceed();
}

From source file:com.wsun.seap.dao.persistence.interceptor.PreparePaginationInterceptor.java

License:Open Source License

@Override
public Object intercept(Invocation ivk) throws Throwable {
    if (ivk.getTarget().getClass().isAssignableFrom(RoutingStatementHandler.class)) {
        final RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk.getTarget();
        final BaseStatementHandler delegate = (BaseStatementHandler) ReflectionsUtil
                .getFieldValue(statementHandler, DELEGATE);
        final MappedStatement mappedStatement = (MappedStatement) ReflectionsUtil.getFieldValue(delegate,
                MAPPED_STATEMENT);//from  ww  w.  j ava 2s.  c om

        BoundSql boundSql = delegate.getBoundSql();
        //SQL<select>parameterType??Mapper??,??
        Object parameterObject = boundSql.getParameterObject();
        if (parameterObject == null) {
            log.error("?");
            throw new NullPointerException("parameterObject?");
        } else {
            final Connection connection = (Connection) ivk.getArgs()[MAPPED_STATEMENT_INDEX];
            final String sql = boundSql.getSql();
            //
        }

        if (boundSql.getSql() == null || "".equals(boundSql.getSql())) {
            return null;
        }
    }
    return ivk.proceed();
}

From source file:com.zrx.authority.dao.plugin.PagePlugin.java

public Object intercept(Invocation ivk) throws Throwable {
    // TODO Auto-generated method stub
    if (ivk.getTarget() instanceof RoutingStatementHandler) {
        RoutingStatementHandler statementHandler = (RoutingStatementHandler) ivk.getTarget();
        BaseStatementHandler delegate = (BaseStatementHandler) ReflectHelper
                .getValueByFieldName(statementHandler, "delegate");
        MappedStatement mappedStatement = (MappedStatement) ReflectHelper.getValueByFieldName(delegate,
                "mappedStatement");

        if (mappedStatement.getId().matches(pageSqlId)) { //?SQL
            BoundSql boundSql = delegate.getBoundSql();
            Object parameterObject = boundSql.getParameterObject();//SQL<select>parameterType??Mapper??,??
            if (parameterObject == null) {
                throw new NullPointerException("parameterObject?");
            } else {
                Connection connection = (Connection) ivk.getArgs()[0];
                String sql = boundSql.getSql();
                //String countSql = "select count(0) from (" + sql+ ") as tmp_count"; //
                String countSql = "select count(0) from (" + sql + ")  tmp_count"; // == oracle  as (SQL command not properly ended)
                PreparedStatement countStmt = connection.prepareStatement(countSql);
                BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(), countSql,
                        boundSql.getParameterMappings(), parameterObject);
                setParameters(countStmt, mappedStatement, countBS, parameterObject);
                ResultSet rs = countStmt.executeQuery();
                int count = 0;
                if (rs.next()) {
                    count = rs.getInt(1);
                }/*w  ww.j  av a  2  s.  c o m*/
                rs.close();
                countStmt.close();
                //System.out.println(count);
                Page page = null;
                if (parameterObject instanceof Page) { //?Page
                    page = (Page) parameterObject;
                    page.setEntityOrField(true); //?com.jalan.entity.Page.entityOrField 
                    page.setTotalResult(count);
                } else { //??Page
                    Field pageField = ReflectHelper.getFieldByFieldName(parameterObject, "page");
                    if (pageField != null) {
                        page = (Page) ReflectHelper.getValueByFieldName(parameterObject, "page");
                        if (page == null)
                            page = new Page();
                        page.setEntityOrField(false); //?com.jalan.entity.Page.entityOrField 
                        page.setTotalResult(count);
                        ReflectHelper.setValueByFieldName(parameterObject, "page", page); //??
                    } else {
                        throw new NoSuchFieldException(
                                parameterObject.getClass().getName() + "? page ?");
                    }
                }
                String pageSql = generatePageSql(sql, page);
                ReflectHelper.setValueByFieldName(boundSql, "sql", pageSql); //sql???BoundSql.
            }
        }
    }
    return ivk.proceed();
}

From source file:core.plugin.mybatis.ExecuteSqlLogInterceptor.java

License:Apache License

private static String getRuntimeExeSql(Configuration configuration, BoundSql boundSql) {
    Object parameterObject = boundSql.getParameterObject();
    List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
    String sql = boundSql.getSql().replaceAll("[\\s]+", " ");
    if (parameterMappings.size() > 0 && parameterObject != null) {
        TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
        if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
            sql = sql.replaceFirst("\\?", getParameterValue(parameterObject));
        } else {//from  www .ja v a 2  s.  c o  m
            MetaObject metaObject = configuration.newMetaObject(parameterObject);
            for (ParameterMapping parameterMapping : parameterMappings) {
                String propertyName = parameterMapping.getProperty();
                if (metaObject.hasGetter(propertyName)) {
                    Object obj = metaObject.getValue(propertyName);
                    sql = sql.replaceFirst("\\?", getParameterValue(obj));
                } else if (boundSql.hasAdditionalParameter(propertyName)) {
                    Object obj = boundSql.getAdditionalParameter(propertyName);
                    sql = sql.replaceFirst("\\?", getParameterValue(obj));
                }
            }
        }
    }
    return sql;
}

From source file:org.apache.playframework.mybatisplus.plugins.PaginationInterceptor.java

License:Apache License

/**
 * ?//  w w w .  jav a 2s. c  o m
 *
 * @param sql
 * @param connection
 * @param mappedStatement
 * @param boundSql
 * @param page
 */
public Pagination count(String sql, Connection connection, MappedStatement mappedStatement, BoundSql boundSql,
        Pagination page) {
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    try {
        pstmt = connection.prepareStatement(sql);
        DefaultParameterHandler parameterHandler = new MybatisDefaultParameterHandler(mappedStatement,
                boundSql.getParameterObject(), boundSql);
        parameterHandler.setParameters(pstmt);
        rs = pstmt.executeQuery();
        int total = 0;
        if (rs.next()) {
            total = rs.getInt(1);
        }
        page.setTotal(total);
        /*
         * 
         */
        if (overflowCurrent && (page.getCurrent() > page.getPages())) {
            page = new Pagination(1, page.getSize());
            page.setTotal(total);
        }
    } catch (Exception e) {
        // ignored
    } finally {
        IOUtils.closeQuietly(pstmt, rs);
    }
    return page;
}

From source file:org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfigurationTest.java

License:Apache License

@Test
void testCustomThymeleafConfig() {
    this.context.register(ThymeleafCustomLanguageDriverConfig.class,
            MybatisLanguageDriverAutoConfiguration.class);
    this.context.refresh();
    ThymeleafLanguageDriver driver = this.context.getBean(ThymeleafLanguageDriver.class);
    SqlSource sqlSource = driver.createSqlSource(new Configuration(),
            "SELECT * FROM users WHERE id = /*[# m:p='id']*/ 1 /*[/]*/", Integer.class);
    BoundSql boundSql = sqlSource.getBoundSql(10);
    assertThat(boundSql.getSql()).isEqualTo("SELECT * FROM users WHERE id = ?");
    assertThat(boundSql.getParameterObject()).isEqualTo(10);
    assertThat(boundSql.getParameterMappings().get(0).getProperty()).isEqualTo("id");
    assertThat(boundSql.getParameterMappings().get(0).getJavaType()).isEqualTo(Integer.class);
    ThymeleafLanguageDriverConfig config = this.context.getBean(ThymeleafLanguageDriverConfig.class);
    assertThat(config.isUse2way()).isEqualTo(true);
    assertThat(config.getDialect().getPrefix()).isEqualTo("m");
    assertThat(config.getDialect().getLikeAdditionalEscapeTargetChars()).isNull();
    assertThat(config.getDialect().getLikeEscapeChar()).isEqualTo('\\');
    assertThat(config.getDialect().getLikeEscapeClauseFormat()).isEqualTo("ESCAPE '%s'");
    assertThat(config.getTemplateFile().getBaseDir()).isEqualTo("");
    assertThat(config.getTemplateFile().getCacheTtl()).isNull();
    assertThat(config.getTemplateFile().getEncoding()).isEqualTo(StandardCharsets.UTF_8);
    assertThat(config.getTemplateFile().getPatterns()).hasSize(1).contains("*.sql");
    assertThat(config.getCustomizer()).isNull();
}

From source file:org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfigurationTest.java

License:Apache License

@Test
void testCustomThymeleafConfigUsingConfigurationProperty() {
    TestPropertyValues.of("mybatis.scripting-language-driver.thymeleaf.use2way=false",
            "mybatis.scripting-language-driver.thymeleaf.dialect.like-additional-escape-target-chars=*,?",
            "mybatis.scripting-language-driver.thymeleaf.dialect.like-escape-char=~",
            "mybatis.scripting-language-driver.thymeleaf.dialect.like-escape-clause-format=escape '%s'",
            "mybatis.scripting-language-driver.thymeleaf.dialect.prefix=mybatis",
            "mybatis.scripting-language-driver.thymeleaf.template-file.base-dir=sqls",
            "mybatis.scripting-language-driver.thymeleaf.template-file.cache-enabled=false",
            "mybatis.scripting-language-driver.thymeleaf.template-file.cache-ttl=1234",
            "mybatis.scripting-language-driver.thymeleaf.template-file.encoding=Windows-31J",
            "mybatis.scripting-language-driver.thymeleaf.template-file.patterns=*.sql,*.sqlf",
            "mybatis.scripting-language-driver.thymeleaf.customizer=org.mybatis.spring.boot.autoconfigure.MybatisLanguageDriverAutoConfigurationTest$MyTemplateEngineCustomizer")
            .applyTo(this.context);
    this.context.register(MyAutoConfiguration.class, MybatisLanguageDriverAutoConfiguration.class);
    this.context.refresh();
    ThymeleafLanguageDriver driver = this.context.getBean(ThymeleafLanguageDriver.class);
    SqlSource sqlSource = driver.createSqlSource(new Configuration(),
            "SELECT * FROM users WHERE id = [# mybatis:p='id' /]", Integer.class);
    BoundSql boundSql = sqlSource.getBoundSql(10);
    assertThat(boundSql.getSql()).isEqualTo("SELECT * FROM users WHERE id = ?");
    assertThat(boundSql.getParameterObject()).isEqualTo(10);
    assertThat(boundSql.getParameterMappings().get(0).getProperty()).isEqualTo("id");
    assertThat(boundSql.getParameterMappings().get(0).getJavaType()).isEqualTo(Integer.class);
    ThymeleafLanguageDriverConfig config = this.context.getBean(ThymeleafLanguageDriverConfig.class);
    assertThat(config.isUse2way()).isEqualTo(false);
    assertThat(config.getDialect().getPrefix()).isEqualTo("mybatis");
    assertThat(config.getDialect().getLikeAdditionalEscapeTargetChars()).hasSize(2).contains('*', '?');
    assertThat(config.getDialect().getLikeEscapeChar()).isEqualTo('~');
    assertThat(config.getDialect().getLikeEscapeClauseFormat()).isEqualTo("escape '%s'");
    assertThat(config.getTemplateFile().getBaseDir()).isEqualTo("sqls");
    assertThat(config.getTemplateFile().getCacheTtl()).isEqualTo(1234);
    assertThat(config.getTemplateFile().getEncoding()).isEqualTo(Charset.forName("Windows-31J"));
    assertThat(config.getTemplateFile().getPatterns()).hasSize(2).contains("*.sql", "*.sqlf");
    assertThat(config.getCustomizer()).isEqualTo(MyTemplateEngineCustomizer.class);
}

From source file:org.njqspringboot.support.mybatis.locker.interceptor.OptimisticLocker.java

License:Open Source License

@Override
@SuppressWarnings({ "unchecked", "rawtypes" })
public Object intercept(Invocation invocation) throws Exception {

    String versionColumn;//  w  w  w. j ava 2s  .c  o m
    if (null == props || props.isEmpty()) {
        versionColumn = "version";
    } else {
        versionColumn = props.getProperty("versionColumn", "version");
    }

    String interceptMethod = invocation.getMethod().getName();
    if ("prepare".equals(interceptMethod)) {

        StatementHandler handler = (StatementHandler) PluginUtil.processTarget(invocation.getTarget());
        MetaObject hm = SystemMetaObject.forObject(handler);

        MappedStatement ms = (MappedStatement) hm.getValue("delegate.mappedStatement");
        SqlCommandType sqlCmdType = ms.getSqlCommandType();
        if (sqlCmdType != SqlCommandType.UPDATE) {
            return invocation.proceed();
        }

        BoundSql boundSql = (BoundSql) hm.getValue("delegate.boundSql");

        VersionLocker vl = getVersionLocker(ms, boundSql);
        if (null != vl && !vl.value()) {
            return invocation.proceed();
        }

        Object originalVersion = hm.getValue("delegate.boundSql.parameterObject." + versionColumn);
        Object versionIncr = castTypeAndOptValue(originalVersion,
                hm.getValue("delegate.boundSql.parameterObject"), ValueType.INCREASE);
        hm.setValue("delegate.boundSql.parameterObject." + versionColumn, versionIncr);

        String originalSql = (String) hm.getValue("delegate.boundSql.sql");
        StringBuilder builder = new StringBuilder(originalSql);
        builder.append(" and ");
        builder.append(versionColumn);
        builder.append(" = ?");
        hm.setValue("delegate.boundSql.sql", builder.toString());

        if (log.isDebugEnabled()) {
            log.debug("==> originalSql: " + originalSql);
        }

        return invocation.proceed();

    } else if ("setParameters".equals(interceptMethod)) {

        ParameterHandler handler = (ParameterHandler) PluginUtil.processTarget(invocation.getTarget());
        MetaObject hm = SystemMetaObject.forObject(handler);

        MappedStatement ms = (MappedStatement) hm.getValue("mappedStatement");
        SqlCommandType sqlCmdType = ms.getSqlCommandType();
        if (sqlCmdType != SqlCommandType.UPDATE) {
            return invocation.proceed();
        }

        Configuration configuration = ms.getConfiguration();
        BoundSql boundSql = (BoundSql) hm.getValue("boundSql");

        VersionLocker vl = getVersionLocker(ms, boundSql);
        if (null != vl && !vl.value()) {
            return invocation.proceed();
        }

        Object result = invocation.proceed();

        ParameterMapping versionMapping = new ParameterMapping.Builder(configuration, versionColumn,
                Object.class).build();

        Object parameterObject = boundSql.getParameterObject();

        MetaObject pm = configuration.newMetaObject(parameterObject);
        if (parameterObject instanceof MapperMethod.ParamMap<?>) {
            MapperMethod.ParamMap<?> paramMap = (MapperMethod.ParamMap<?>) parameterObject;
            if (!paramMap.containsKey(versionColumn)) {
                throw new TypeException("All the base type parameters must add MyBatis's @Param Annotaion");
            }
        }
        Object value = pm.getValue(versionColumn);
        TypeHandler typeHandler = versionMapping.getTypeHandler();
        JdbcType jdbcType = versionMapping.getJdbcType();

        if (value == null && jdbcType == null) {
            jdbcType = configuration.getJdbcTypeForNull();
        }
        List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
        try {
            PreparedStatement ps = (PreparedStatement) invocation.getArgs()[0];
            Object val = castTypeAndOptValue(value, parameterObject, ValueType.DECREASE);
            typeHandler.setParameter(ps, parameterMappings.size() + 1, val, jdbcType);
        } catch (TypeException e) {
            throw new TypeException(
                    "Could not set parameters for mapping: " + parameterMappings + ". Cause: " + e, e);
        } catch (SQLException e) {
            throw new TypeException(
                    "Could not set parameters for mapping: " + parameterMappings + ". Cause: " + e, e);
        }
        return result;
    }
    return invocation.proceed();
}