当前位置: 首页 > 知识库问答 >
问题:

MyBatis Java Boolean到Sql枚举

蒋嘉实
2023-03-14

我在我的项目中使用MyBatis和MySql。

我知道我可以修改所有mybatis模板,例如:

<update id="update">
UPDATE
myTable
   <set>
        ...
       <if test="myField != null">myField = <choose>
           <when test="myField == true">'yes'</when>
           <otherwise>'no'</otherwise>
           </choose>,
        </if>
        ...
    </set>
 WHERE
    ...
 </update>

但我能用更方便的方式做到这一点吗?

共有1个答案

沈嘉瑞
2023-03-14

解决这个问题的最佳方法似乎是实现我自己的布尔类型处理程序:

public class YesNoBooleanTypeHandler extends BaseTypeHandler<Boolean> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Boolean parameter,      JdbcType jdbcType)
            throws SQLException {
        ps.setString(i, convert(parameter));
    }

    @Override
    public Boolean getNullableResult(ResultSet rs, String columnName)
            throws SQLException {
        return convert(rs.getString(columnName));
    }

    @Override
    public Boolean getNullableResult(ResultSet rs, int columnIndex)
            throws SQLException {
        return convert(rs.getString(columnIndex));
    }

    @Override
    public Boolean getNullableResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        return convert(cs.getString(columnIndex));
    }

    private String convert(Boolean b) {
        return b ? "yes" : "no";
    }

    private Boolean convert(String s) {
        return s.equals("yes");
    }

}

然后在映射器模板中使用它:

<update id="update">
UPDATE
myTable
   <set>
        ...
       <if test="myField != null">myField = #{myField ,typeHandler=YesNoBooleanTypeHandler}</if>
        ...
    </set>
 WHERE
    ...
 </update>
 类似资料:
  • 问题内容: 我有一个FlagsAttribute按位枚举,像这样- 现在,在C#中,我将此值存储在一个名为MyProperty的属性中,并保存后将此属性写入我的SQL数据库的整数列中。假设如果我从代码中选择,那么它将在数据库中另存为。 我知道我可以从数据库获取值,只需要将int值类型转换为MyEnum,它将为我提供这些值。但是,我希望对某些存储过程中的SQL数据执行一些操作,在这些存储过程中,显然

  • 作为学习r2DBC的一部分,我遇到了Enum转换面临的问题。我在这里使用PostgreSQL。当读取评级为PG-13和NC-17(任何带破折号的东西)的电影数据时,我面临问题。 下面是我的表模式 mpaa_rating定义为 这是我的代码,它在我的配置中注册转换器 我的检索代码很简单 添加引发的异常https://gist.github.com/harryalto/bd51bbcdd081868c

  • 问题内容: 除了简单地为每个枚举创建查找表(以Id,代码和名称作为列)之外,是否有更好或更简便的方法将枚举(在C#等编程语言中可用的枚举)存储在SQL Server数据库中,而不是为每个枚举创建查找表(尤其是在存在枚举时)每个表中只有很少的几行)?我发现有一篇文章建议只为所有枚举创建一个查找表,并且有人批评这种方法违反了引用数据的完整性,因此有人批评该方法。如果枚举仅由一个表使用,那么使用一些预定

  • 问题内容: 我想知道是否有可能枚举返回的行。不根据任何列的内容,而只是产生一个连续的整数索引。例如 将返回一些内容: 它用于https://data.stackexchange.com/ 问题答案: 尝试:

  • 问题内容: 假设我有这个枚举: 通过以下映射: 枚举被发送到数据库,,。我希望这些值改为存储为,或存储在varchar列中。 如何将枚举映射到varchar列? 问题答案: 将其添加为EnumType的参数: 这是因为等效于java.sql.Types.VARCHAR

  • 问题内容: 假设我有一个返回sth的查询。像这样: 是否可以添加另一列来枚举每个组中的行(即,枚举具有其他角色的经理,工人和人员,而不考虑其他角色)?像这样: 使用Oracle扩展很好。 问题答案: 使用窗口功能: