2012-11-20 31 views
3

我在我的項目中使用MyBatis與MySql。MyBatis Java布爾到Sql枚舉

我:

MyField的ENUM( '是', '否')

,我想在映射到Java布爾值:

我知道我可以修改所有的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> 

但我可以用更方便的方法嗎?

回答

10

這似乎解決了,這是實現我自己的布爾類型處理器的最好方法:

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>