Возврат константы в таблицу результатов iBatis - PullRequest
1 голос
/ 21 июля 2011

У меня есть resultMap с несколькими элементами результата.Я хотел бы иметь возможность установить константу в качестве одного из результатов.Поэтому вместо

<result property="name" column="Name"/>

я бы хотел убедиться, что это имя вернется в виде строки «Joe».В идеальном мире я бы изменил запрос, чтобы вернуть эту константу, но, к сожалению, это не вариант для меня.Я сканировал iBatis dtd и не смог найти подходящий атрибут.Я знаю, что мог бы просто перебрать список, возвращенный из iBatis, но я бы предпочел сделать это на карте iBatis.Спасибо

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

YesNoTypeHandler.java совместим с Mybatis 3:

ABC-sqlmaps.xml

<resultMap id="resultMapABC" class="com.abc.dto.ABC">
        ...
        <result property="isA" column="is_a" typeHandler="YesNoTypeHandler"/>
        ...
</resultMap>

ibatis.xml

<sqlMapConfig>
    ...
    <typeAlias alias="YesNoTypeHandler" type="com.abc.dao.sqlmap.YesNoTypeHandler"/>
    <typeHandler javaType="boolean" jdbcType="BOOLCHAR" callback="YesNoTypeHandler"/>
    ...
</sqlMapConfig>




import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;

public class YesNoTypeHandler implements TypeHandler {

    @Override
    public void setParameter(PreparedStatement paramPreparedStatement, int paramInt, Object paramObject, JdbcType paramJdbcType) throws SQLException {
        if (paramObject == null) {
            paramPreparedStatement.setString(paramInt, "N");
        }
        else {
            Boolean value = (Boolean) paramObject;

            paramPreparedStatement.setString(paramInt, value ? "Y" : "N");
        }
    }


    @Override
    public Object getResult(ResultSet getter, String columnLabel) throws SQLException {
        String value = getter.getString(columnLabel);
        if (getter.wasNull()) { return false; }
        return "Y".equalsIgnoreCase(value);

    }

    @Override
    public Object getResult(CallableStatement cs, int columnNb) throws SQLException {
        String value = cs.getString(columnNb);
        if (cs.wasNull()) { return false; }
        Boolean BoolValue = "Y".equalsIgnoreCase(value);
        return BoolValue;
    }
}
0 голосов
/ 21 июля 2011

В нашем проекте мы используем приведенное ниже решение для значений БД процесса, например, Булевы значения.

ABC-sqlmaps.xml

<resultMap id="resultMapABC" class="com.abc.dto.ABC">
        ...
        <result property="isA" column="is_a" typeHandler="YesNoTypeHandler"/>
        ...
</resultMap>

ibatis.xml

<sqlMapConfig>
    ...
    <typeAlias alias="YesNoTypeHandler" type="com.abc.dao.sqlmap.YesNoTypeHandler"/>
    <typeHandler javaType="boolean" jdbcType="BOOLCHAR" callback="YesNoTypeHandler"/>
    ...
</sqlMapConfig>

YesNoTypeHandler.java

package com.abc.dao.sqlmap;

import com.ibatis.sqlmap.client.extensions.ParameterSetter;
import com.ibatis.sqlmap.client.extensions.ResultGetter;
import com.ibatis.sqlmap.client.extensions.TypeHandlerCallback;

import java.sql.SQLException;

public class YesNoTypeHandler implements TypeHandlerCallback {
    /**
     * Sets a boolean parameter as a corresponding string value ("Y" or "N").
     *
     * @param setter The <code>ParameterSetter</code> for an object being setted
     * @param parameter An object to set
     * @throws SQLException is expected exception.
     */
    public void setParameter(ParameterSetter setter, Object parameter)
            throws SQLException {
        Boolean value = (Boolean) parameter;

        if (value == null) {
            value = Boolean.FALSE;
        }

        setter.setString(value ? "Y" : "N");
    }

    /**
     * Performs the string "Y"/"N" to the boolean type and gets the result as a boolean object.
     *
     * @param getter The <code>ResultGetter</code>
     * @return object.
     * @throws SQLException is expected exception.
     */
    public Object getResult(ResultGetter getter) throws SQLException {
        String value = getter.getString();

        return "Y".equalsIgnoreCase(value);
    }

    /**
     * Returns the value of a string as an <code>Object</code>.
     *
     * @param s string.
     * @return YesNoTypeHandler.
     */
    public Object valueOf(String s) {
        return s;
    }
}

Возможно, используется та же конфигурация, что и для определения констант.

0 голосов
/ 21 июля 2011

Если изменение sql невозможно, попробуйте изменить метод Setter для сопоставленного объекта.

public void setName(String name) {
    this.name = "Joe";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...