MyBatis Interceptor Add Dynami c Значение столбца для оператора вставки - PullRequest
0 голосов
/ 07 апреля 2020

У меня следующая структура таблицы: id, name, email, date, env

и user-mapper.xml выглядит следующим образом:

<mapper namespace="com.example.demo.service.UserService">
    <resultMap id="UserMap" type="UserDBO">
        <result property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
        <result property="date" column="date"/>
        <result property="env" column="env"/>
    </resultMap>


    <insert id="insert" parameterType="UserDBO">
        insert into user (
        `name`,
        `email`,
        `date`
        ) values (
        #{name},
        #{email},
        #{date}
        )
    </insert>
</mapper>

UserDTO:

import lombok.Data;

@Data
public class UserDBO implements EnvField {

    private int id;
    private String name;
    private String email;
    private String date;
    private String env;
}

Теперь, если вы видите user-mapper.xml, я не передал параметр & значение env в методе вставки

Я пытаюсь передать столбец env и его значение от перехватчика и всякий раз, когда любой из моих DBO использует интерфейс EnvField.

Я успешно реализовал перехватчик, когда выполняю запрос вставки пользователя:

@Override
    public Object intercept(Invocation invocation) throws Throwable {
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();

        Field field = ReflectionUtils.findField(statementHandler.getClass(), "delegate");
        if(field == null) {
            invocation.proceed();
        }

        ReflectionUtils.makeAccessible(field);
        Object delegate = ReflectionUtils.getField(field, statementHandler);

        Field mappedStatementField = ReflectionUtils.findField(delegate.getClass(), "mappedStatement");
        ReflectionUtils.makeAccessible(mappedStatementField);
        MappedStatement mappedStatement = (MappedStatement)ReflectionUtils.getField(mappedStatementField, delegate);

        if(mappedStatement == null) {
            return invocation.proceed();
        }

            ParameterHandler parameterHandler = statementHandler.getParameterHandler();
            Object DTOObject = parameterHandler.getParameterObject();


        if(mappedStatement.getSqlCommandType() == SqlCommandType.INSERT && DTOObject instanceof EnvField) {

            Field boundSqlField = ReflectionUtils.findField(delegate.getClass(), "boundSql");
            ReflectionUtils.makeAccessible(boundSqlField);
            BoundSql boundSql = (BoundSql) ReflectionUtils.getField(boundSqlField, delegate);
            String sql = boundSql.getSql();
            // the var sql returns the following string INSERT into user (name, email, date) values (?, ?, ?)

        }


        return invocation.proceed();
    }

Теперь вы можете видеть, что я получил SQL строка из связанного Sql объекта Мне нужно изменить его, я знаю, что это строка, которую я могу сделать регулярным выражением для временного назначения, но проблема в том, что я не могу установить свой новый объект Bound SQL, потому что в Обработчик операторов для установки объекта Bound SQL.

Любая помощь приветствуется.

...