2

我正在使用 MyBatis 将类实例写入 MySQL 数据库

// I have no control over how this java class is laid out -.-
class Hello {
    boolean isFriendly
}

我的 MyBatis Mapper 看起来像这样

<insert id="doHello" parameterType="Hello">
    insert into hello_table (
        is_friendly   --this is a varchar(1) btw
    )
    values (
      #{isFriendly}
    )
 </insert>

问题是它将值作为 0 或 1 插入到数据库中,但我需要将其设置为“N”或“Y”,而且我没有选择修改 java

我试图使我的代码尽可能少,理想情况下希望将东西添加到 Mybatis Mapper

我尝试过类似的事情

 #{isFriendly,jdbcType=Boolean}

但它没有用

4

3 回答 3

4

MyBatis typeHandler 是一种正确的方法。

您可以实现一个类型处理程序,然后在任何 sql 语句中使用它:

#{isFriendly, typeHandler=YesNoBooleanTypeHandler}

有关详细信息,请参阅MyBatis Java Boolean to Sql enum

于 2013-10-07T11:00:30.090 回答
2

修改您的插入语句

insert into hello_table (
        is_friendly
    )values (${isFriendly=="0"?"'N'":"'Y'"})
于 2013-09-29T01:01:11.080 回答
0

create handler 并添加到 Mybatis 配置 create handler 中:

    导入 org.apache.ibatis.type.BaseTypeHandler;
    导入 org.apache.ibatis.type.JdbcType;
    导入 org.apache.ibatis.type.MappedJdbcTypes;
    导入 org.apache.ibatis.type.MappedTypes;

    导入 java.sql.CallableStatement;
    导入 java.sql.PreparedStatement;
    导入java.sql.ResultSet;
    导入java.sql.SQLException;

    @MappedTypes(Boolean.class)
    @MappedJdbcTypes(JdbcType.CHAR)
    公共类 BooleanStringTypeHandler 扩展 BaseTypeHandler {

        @覆盖
        public void setNonNullParameter(PreparedStatement PreparedStatement, int i, Boolean aBoolean, JdbcType jdbcType) 抛出 SQLException {
            PreparedStatement.setString(i, aBoolean ? "Y" : "N");
        }
        @覆盖
        public Boolean getNullableResult(ResultSet resultSet, String s) 抛出 SQLException {
            返回 getBoolean(resultSet.getString(s));
        }
        @覆盖
        公共布尔 getNullableResult(ResultSet resultSet, int i) 抛出 SQLException {
            返回 getBoolean(resultSet.getString(i));
        }
        @覆盖
        public Boolean getNullableResult(CallableStatement callableStatement, int i) 抛出 SQLException {
            返回 getBoolean(callableStatement.getString(i));
        }
        私人布尔 getBoolean(String s) {
            返回 "Y".equalsIgnoreCase(s);
        }
    }

在你的 Mybatis 配置中添加:

<typeHandlers>
    <typeHandler jdbcType="CHAR" javaType="java.lang.Boolean" handler="crm.data.trade.utils.BooleanStringTypeHandler"/>
</typeHandlers>
于 2017-12-07T06:57:16.097 回答