2017-08-31 108 views
0

看來我需要明確告訴MyBatis什麼樣的數據庫類型用於java.util.Date IN參數,如果我想能夠傳遞空值。但我找不到這樣做的方法。如何指定IN參數類型與註釋配置MyBatis

我試過,沒有運氣以下的不同變化:

@Select("<script>SELECT ... WHERE ... " + 
    "<if test='#{dateFrom,jdbcType=TIMESTAMP} != null'>" + 
    " AND date &gt; #{dateFrom,jdbcType=TIMESTAMP}" + 
    "</if></script>") 
List<MyType> getRecords(@Param("dateFrom") dateFrom) 

使用註釋時,一個人如何指定的參數類型?

回答

1

其他開發者已經評論過這類問題。

我從GitHub評論引述:

@nglsatheesh的MyBatis無法施展/除非你告訴它如何轉換的類型。 您只需要一個簡單的自定義類型處理程序。

public class StrToIntTypeHandler implements TypeHandler<String> { 
    @Override 
    public void setParameter(PreparedStatement ps, int i, 
     String parameter, JdbcType jdbcType) throws SQLException { 
    ps.setInt(i, Integer.parseInt(parameter)); 
    } 
    // other methods are for binding query results. 
} 

SELECT * FROM表名其中id =#{值,類型控制器= StrToIntTypeHandler}

所以,現在,如果你將創建一個這樣的自定義類型處理器:

public class Null2DateTypeHandler implements TypeHandler<Date> { 

    @Override 
    public void setParameter(PreparedStatement ps, int i, java.util.Date parameter, JdbcType jdbcType) throws SQLException { 
     System.err.println(String.format("ps: %s, i: %d, param: %s, type: %s", ps.toString(), i, parameter, jdbcType.toString())); 

     if (parameter == null) { 
      ps.setDate(i, null); // ??? I'm not sure. But it works. 
     } else { 
      ps.setDate(i, new java.sql.Date(parameter.getTime())); 
     } 
    } 
} 

而且,映射器方:

@Select({ 
    "<script>" 
    , "SELECT * FROM `employees` WHERE `hire_date` " 
    , " BETWEEN 
    , " #{dateFrom,typeHandler=*.*.*.Null2DateTypeHandler}" 
    , " AND" 
    , " #{dateTo,typeHandler=*.*.*.Null2DateTypeHandler}"  
    ,"</script>" 
}) 
@Results({ 
     @Result(property = "empNo", column = "emp_no"), 
     @Result(property = "birthDate", column = "birth_date"), 
     @Result(property = "firstName", column = "first_name"), 
     @Result(property = "lastName", column = "last_name"), 
     @Result(property = "gender", column = "gender"), 
     @Result(property = "hireDate", column = "hire_date")   
}) 
List<Employees> selectBetweenTypeHandler(@Param("dateFrom") Date dateFrom, @Param("dateTo") Date dateTo); 

我的日誌記錄,它看起來工作正常。

DEBUG [main] - ==> Preparing: SELECT * FROM `employees` WHERE `hire_date` BETWEEN ? AND ? 
ps: [email protected], i: 1, param: null, type: OTHER 
DEBUG [main] - ==> Parameters: null, null 
ps: [email protected], i: 2, param: null, type: OTHER 
DEBUG [main] - <==  Total: 0 
相關問題