MyBatis 强制长度检查约束的方法

Way to enforce length check constraint in MyBatis

我在数据库中为特定列定义了一些由 SYS 模式定义的检查约束。 现在,当通过 MyBatis 从 Java 代码调用它时,无论如何只能通过 MYBatis 配置强制执行相应的字段长度验证。

PS:我不想在 VO 级别强制执行约束(setter 单独)。或者使用 JSR 303

数据库:Oracle 11g 使用 MyBatis

如果您不想在 java bean 中进行验证(手动或使用 JSR 303),我认为您可以为这些字段编写自己的类型处理程序。

Typehandler 将处理字符串字段并进行验证。 参见 code example for String TypeHandler。 您可以在处理程序的 get/set 方法中强制执行您的验证逻辑(任何复杂性)。

如果要在保存到数据库时使用 TypeHandler trim 字符串到给定长度,请在 setNonNullParameter 方法中执行。

下面的示例代码

    @MappedJdbcTypes(JdbcType.VARCHAR)
   public class ExampleTypeHandler extends BaseTypeHandler<String> {
    @Override
      public void setNonNullParameter(PreparedStatement ps, int i, 
String parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, parameter.substring(0,DESIRED_MAX_LENGTH));
      }

您还可以 trim(或以其他方式修改)从数据库中读取的值 - 您需要修改 TypeHandler 实现中的 get* 方法才能做到这一点。

您必须告诉映射器使用您的处理程序。否则,将使用给定类型的默认处理程序。 XML 文件中的 SQL 必须使用语法

#{age,javaType=int,jdbcType=NUMERIC,typeHandler=MyTypeHandler}

查看 https://mybatis.github.io/mybatis-3/sqlmap-xml.html 了解详情。