У меня следующая структура таблицы: 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.
Любая помощь приветствуется.