MyBATIS пользовательский тип обработчик без аннотаций - PullRequest
0 голосов
/ 04 мая 2018

Я новичок в mybatis. Я пытаюсь сопоставить целое число JDBC с пользовательским классом. Все примеры, которые я видел на этом, использовали аннотации, возможно ли не использовать аннотации и делать это? Любой пример будет принят с благодарностью.

Срикант

1 Ответ

0 голосов
/ 09 мая 2018

Это определенно возможно и описано в общих чертах в Конфигурация и в Mapper разделах документации.

Сначала определите обработчик:

@MappedJdbcTypes(JdbcType.INTEGER)
public class MyClassHandler extends BaseTypeHandler<MyClass> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i,
            MyClass parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter.asInt());
    }

    @Override
    public MyClass getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        int val = rs.getInt(columnName);
        if (rs.wasNull())
            return null;
        else
            return MyClass.valueOf(val);
    }

    @Override
    public MyClass getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        int val = rs.getInt(columnIndex);
        if (rs.wasNull())
            return null;
        else
            return MyClass.valueOf(val);
    }

    @Override
    public MyClass getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        int val = cs.getInt(columnIndex);
        if (cs.wasNull())
            return null;
        else
            return MyClass.valueOf(val);
    }
}

Затем настройте его в mybatis-config.xml:

<typeHandlers>
    <typeHandler handler="my.company.app.MyClassHandler"/>
</typeHandlers>

Теперь вы можете использовать его в xml mappers. Если у вас есть класс

class SomeTypeEntity {
    private MyClass myClassField;
};

Для запроса обработчика конфигурации поля в resultMap, например:

<resultMap id="someMap" type="SomeTypeEntity">
    <result property="myClassField" column="my_class_column" typeHandler="my.company.app.MyClassHandler"/>
</resultMap>

Для insert / update используйте это так:

<update id="updateSomeTypeWithMyClassField">
   update some_type
   set
    my_class_column = @{someTypeEntity.myClassField, typeHandler=my.company.app.MyClassHandler},
</update>

для картографического метода:

void updateSomeTypeWithMyClassField(@Param("someTypeEntity") SomeTypeEntity entity);
...