public static Builder builder() { return new Builder(); }
public void appendPreprocessor(SqlProvider provider) { preprocessors.add(provider); if (provider instanceof ConfigurationAware) { ((ConfigurationAware) provider).setConfiguration(configuration); } }
@Override public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) { providers.forEach(p -> p.replace(connection, metaObject, mappedStatement, boundSql)); } }
@Bean @ConditionalOnMissingBean public cn.mybatisboost.core.Configuration configuration() throws IllegalAccessException, InstantiationException { cn.mybatisboost.core.Configuration.Builder builder = cn.mybatisboost.core.Configuration.builder() .setMultipleDatasource(properties.isMultipleDatasource()) .setIterateSelectiveInBatch(properties.isIterateSelectiveInBatch()) .setShowQuery(properties.isShowQuery()) .setShowQueryWithParameters(properties.isShowQueryWithParameters()) .setSlowQueryThresholdInMillis(properties.getSlowQueryThresholdInMillis()); if (properties.getNameAdaptor() != null) { builder.setNameAdaptor(properties.getNameAdaptor().newInstance()); } else { builder.setNameAdaptor(new NoopNameAdaptor()); } if (properties.getSlowQueryHandler() != null) { builder.setSlowQueryHandler(properties.getSlowQueryHandler().newInstance()); } return builder.build(); }
@Bean @ConditionalOnMissingBean public DispatcherInterceptor mybatisBoostInterceptor(cn.mybatisboost.core.Configuration configuration) { DispatcherInterceptor dispatcherInterceptor = new DispatcherInterceptor(configuration); dispatcherInterceptor.appendPreprocessor(new MybatisCacheRemovingPreprocessor()); dispatcherInterceptor.appendPreprocessor(new ParameterNormalizationPreprocessor()); dispatcherInterceptor.appendPreprocessor(new AutoParameterMappingPreprocessor()); dispatcherInterceptor.appendProvider(new GeneratingSqlProvider()); if (isMapperEnabled) { dispatcherInterceptor.appendProvider(new MapperSqlProvider(configuration)); } if (isLangEnabled) { dispatcherInterceptor.appendProvider(new LanguageSqlProvider(configuration)); } if (isLimiterEnabled) { dispatcherInterceptor.appendProvider(new LimiterSqlProvider(configuration)); } return dispatcherInterceptor; }
if (configuration.isShowQueryWithParameters()) { List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); Object parameterObject = boundSql.getParameterObject(); Object proceed = invocation.proceed(); long time = stopWatch.getTime(); if (time > configuration.getSlowQueryThresholdInMillis()) { if (parameters.isEmpty()) { logger.error(String.format("[SLOW Query took %s ms] %s", time, sql)); logger.error(String.format("[SLOW Query took %s ms, Parameters: %s] %s ", time, parameters, sql)); BiConsumer<String, Long> slowSqlHandler = configuration.getSlowQueryHandler(); if (slowSqlHandler != null) { slowSqlHandler.accept(sql, time); } else if (configuration.isShowQuery()) { if (parameters.isEmpty()) { logger.info(String.format("[Query took %s ms] %s", time, sql));
private String buildSQL(String sql, Class<?> entityType, List<String> columns, String[] split) { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("UPDATE ") .append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor())).append(" SET "); columns.forEach(c -> sqlBuilder.append(c).append(" = ?, ")); sqlBuilder.setLength(sqlBuilder.length() - 2); if (split.length == 2) { sqlBuilder.append(sql.contains(" WHERE ") ? " WHERE " : " where ").append(split[1]); } return sqlBuilder.toString(); }
@Override public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) { SqlProvider provider = this.provider; if (provider == null || configuration.isMultipleDatasource()) { try { String databaseName = connection.getMetaData().getDatabaseProductName(); this.provider = provider = providerMap.get(databaseName); } catch (SQLException e) { throw new RuntimeException(e); } } if (provider != null) { provider.replace(connection, metaObject, mappedStatement, boundSql); } } }
@Override public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) { if (Objects.equals(boundSql.getSql(), SqlProvider.MYBATIS_BOOST)) { Class<?> providerType = (Class<?>) SystemMetaObject.forObject(mappedStatement.getSqlSource()).getValue("providerType"); SqlProvider provider = providerMap.get(providerType); if (provider == null) { synchronized (providerType) { provider = providerMap.computeIfAbsent(providerType, UncheckedFunction.of(k -> { SqlProvider p = (SqlProvider) providerType.newInstance(); if (p instanceof ConfigurationAware) { ((ConfigurationAware) p).setConfiguration(configuration); } return p; })); } } if (provider != null) { provider.replace(connection, metaObject, mappedStatement, boundSql); } } } }
private String buildSql(Class<?> entityType, List<String> columns, int batchSize, String additionalStatement) { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("INSERT INTO ") .append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor())); sqlBuilder.append(" ("); columns.forEach(c -> sqlBuilder.append(c).append(", ")); sqlBuilder.setLength(sqlBuilder.length() - 2); sqlBuilder.append(") VALUES "); for (int i = 0; i < batchSize; i++) { sqlBuilder.append("("); columns.forEach(c -> sqlBuilder.append("?, ")); sqlBuilder.setLength(sqlBuilder.length() - 2); sqlBuilder.append("), "); } sqlBuilder.setLength(sqlBuilder.length() - 2); sqlBuilder.append(additionalStatement); return sqlBuilder.toString(); } }
protected void initProviders() { Arrays.asList(new MySQL(), new PostgreSQL()).forEach(p -> providerMap.put(p.toString(), p)); for (SqlProvider provider : providerMap.values()) { if (provider instanceof ConfigurationAware) { ((ConfigurationAware) provider).setConfiguration(configuration); } } }
@Override public Object intercept(Invocation invocation) throws Throwable { Connection connection = (Connection) invocation.getArgs()[0]; MetaObject metaObject = MyBatisUtils.getRealMetaObject(invocation.getTarget()); MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement"); BoundSql boundSql = (BoundSql) metaObject.getValue("delegate.boundSql"); preprocessors.forEach(p -> p.replace(connection, metaObject, mappedStatement, boundSql)); providers.forEach(p -> p.replace(connection, metaObject, mappedStatement, boundSql)); return invocation.proceed(); }
@Override public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) { String tableName = EntityUtils.getTableName(MapperUtils.getEntityTypeFromMapper (mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.'))), configuration.getNameAdaptor()); metaObject.setValue("delegate.boundSql.sql", (mappedStatement.getId().endsWith("countAll") ? "SELECT COUNT(*) FROM " : "SELECT * FROM ") + tableName); }
protected void initProviders() { providers = Collections.unmodifiableList(Arrays.asList(new InsertEnhancement(), new UpdateEnhancement(), new TableEnhancement(), new NullEnhancement(), new ListParameterEnhancement())); for (SqlProvider p : providers) { if (p instanceof ConfigurationAware) { ((ConfigurationAware) p).setConfiguration(configuration); } } }
@Override public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) { String sql = boundSql.getSql(); if (sql.contains("#t")) { Class<?> entityType = MapperUtils.getEntityTypeFromMapper (mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.'))); metaObject.setValue("delegate.boundSql.sql", sql.replace("#t", EntityUtils.getTableName(entityType, configuration.getNameAdaptor()))); } }
@Override @SuppressWarnings("unchecked") public void replace(Connection connection, MetaObject metaObject, MappedStatement mappedStatement, BoundSql boundSql) { Class<?> entityType = MapperUtils.getEntityTypeFromMapper (mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.'))); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("DELETE FROM ").append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor())); Map<String, Object> parameterMap = (Map<String, Object>) boundSql.getParameterObject(); Object[] ids = (Object[]) parameterMap.get("param1"); parameterMap.clear(); if (ids.length > 0) { String idProperty = EntityUtils.getIdProperty(entityType); String idColumn = SqlUtils.normalizeColumn(idProperty, (boolean) metaObject.getValue("delegate.configuration.mapUnderscoreToCamelCase")); sqlBuilder.append(" WHERE ").append(idColumn).append(" IN ("); Arrays.stream(ids).forEach(c -> sqlBuilder.append("?, ")); sqlBuilder.setLength(sqlBuilder.length() - 2); sqlBuilder.append(')'); org.apache.ibatis.session.Configuration configuration = (org.apache.ibatis.session.Configuration) metaObject.getValue("delegate.configuration"); List<ParameterMapping> parameterMappings = new ArrayList<>(ids.length); for (int i = 0; i < ids.length; i++) { parameterMap.put(idProperty + i, ids[i]); parameterMappings.add(new ParameterMapping.Builder(configuration, idProperty + i, Object.class).build()); } metaObject.setValue("delegate.boundSql.parameterMappings", parameterMappings); metaObject.setValue("delegate.boundSql.sql", sqlBuilder.toString()); } }
(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.'))); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("DELETE FROM ").append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor()));
(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.'))); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("UPDATE ").append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor()));
StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append(mappedStatement.getId().endsWith("count") ? "SELECT COUNT(*) FROM " : "SELECT * FROM ") .append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor()));
(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf('.'))); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("SELECT * FROM ").append(EntityUtils.getTableName(entityType, configuration.getNameAdaptor()));