Giải pháp xử lý vấn đề phân biệt chữ hoa chữ thường trong truy vấn SQL với MySQL8

SpringBoot + Mybatis + Activiti6 + MySQL8

Trong môi trường Linux, phiên bản MySQL8 không cho phép điều chỉnh cấu hình my.ini (không phân biệt chữ hoa chữ thường) sau khi đã được tạo thành công.

Cài đặt lower_case_table_names = 1 và khởi động lại MySQL sẽ gây ra lỗi.

Tuy nhiên, Activiti mặc định sử dụng tên bảng viết hoa trong khi các bảng trong cơ sở dữ liệu lại được viết thường, dẫn đến lỗi khởi động SpringBoot với thông báo "bảng không tồn tại".

Giải pháp như sau:

Tham khảo:

https://blog.csdn.net/image_2012/article/details/108387022

  1. Tạo bộ lọc xử lý SQL
package com.example.filter;

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.plugin.*;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.Properties;

@Intercepts({
    @Signature(
        type = StatementHandler.class, 
        method = "prepare", 
        args = {Connection.class, Integer.class}
    )
})
@Component
public class SqlCaseInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        BoundSql boundSql = statementHandler.getBoundSql();
        // Lấy câu SQL gốc
        String originalSql = boundSql.getSql();
        String processedSql = normalizeTableNameCase(originalSql);
        
        Field sqlField = boundSql.getClass().getDeclaredField("sql");
        sqlField.setAccessible(true);
        sqlField.set(boundSql, processedSql);
        
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    /**
     * Chuyển đổi tên bảng trong SQL về dạng chữ thường
     * @param sql Câu SQL cần xử lý
     * @return SQL đã được chuẩn hóa tên bảng
     */
    private String normalizeTableNameCase(String sql) {
        // Xử lý SQL để chuyển đổi tên bảng về chữ thường
        return sql.toLowerCase();
    }

    @Override
    public void setProperties(Properties properties) {
        // Cấu bổ sung nếu cần
    }
}
  1. Tạo cấu hình tùy chỉnh cho Activiti để thêm bộ lọc
package com.example.activiti.config;

import com.example.filter.SqlCaseInterceptor;
import org.activiti.engine.cfg.AbstractProcessEngineConfigurator;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.apache.ibatis.session.SqlSessionFactory;

public class CustomProcessEngineConfigurator extends AbstractProcessEngineConfigurator {

    @Override
    public void configure(ProcessEngineConfigurationImpl processEngineConfiguration) {
        SqlSessionFactory sqlSessionFactory = processEngineConfiguration.getSqlSessionFactory();
        // Thêm bộ lọc SQL tùy chỉnh đã định nghĩa ở trên
        sqlSessionFactory.getConfiguration().addInterceptor(new SqlCaseInterceptor());
    }
}
  1. Cấu hình bộ xử lý động cho Activiti
package com.example.activiti.config;

import org.activiti.engine.cfg.ProcessEngineConfigurator;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class ActivitiCustomConfiguration implements ProcessEngineConfigurationConfigurer {

    @Autowired
    private CustomProcessDiagramGenerator processDiagramGenerator;

    /**
     * Cấu hình giải quyết vấn đề hiển thị tiếng Việt trong hình quy trình
     *
     * @param processEngineConfiguration Cấu hình của Activiti
     */
    @Override
    public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
        // Cấu hình font chữ để hiển thị tiếng Việt đúng
        processEngineConfiguration.setActivityFontName("Arial Unicode MS");
        processEngineConfiguration.setAnnotationFontName("Arial Unicode MS");
        processEngineConfiguration.setLabelFontName("Arial Unicode MS");
        processEngineConfiguration.setProcessDiagramGenerator(processDiagramGenerator);

        // Thêm cấu hình tùy chỉnh để xử lý vấn đề phân biệt chữ hoa chữ thường
        List<ProcessEngineConfigurator> configurators = new ArrayList<>();
        configurators.add(new CustomProcessEngineConfigurator());
        processEngineConfiguration.setConfigurators(configurators);
    }
}

Thẻ: MySQL8 SpringBoot Activiti mybatis sql

Đăng vào ngày 15 tháng 6 lúc 22:00