MyBatis 使用annonation定義類型映射

摘要

介紹如何使用annonation的方式定義數據庫字段到Java成員變量直接的映射關係,以及定義數據庫表中的類型到Java類型的自定義轉換。關於如何配置MyBatis進行Java對象和Mysql表之間的映射能夠參照 MyBatis 基本用法java

簡易用法

下面是一個最基礎的映射關係配置:mysql

public interface SimpleMapper {
    @Select("select url from testdb.MY_BATIS_TEST;")
    Set<Record> selectRecords();
}

在默認的配置中,mysql表的字段會映射到同名字的java成員變量,下面咱們看如何設置映射到其餘的變量,以及如何進行類型轉換sql

自定義映射關係

若是咱們的DB中的一列名稱是support_os_version類型是VARCHAR,可是在Java代碼中對應的變量是 String supportOSLevel,能夠進行以下定義:數據庫

public interface SimpleMapper {
    @Select("select url from testdb.MY_BATIS_TEST;")
    @Results(value = {
            @Result(property = "support_os_version", column = "supportOSLevel"),
    })
    Set<Record> selectRecords();
}

定義類型映射

若是咱們的support_os_version列是一個使用逗號分割的版本號裏表,
在Java中咱們想映射到 String[] supportOSLevel, 能夠經過定義 typeHandler 的方式進行映射。segmentfault

首先定義一個從String到String[]的轉換類:app

public class StringSplitHandler extends BaseTypeHandler<String[]> {

    private static final Joiner joiner = Joiner.on(",");

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, String[] strings, JdbcType jdbcType) throws SQLException {
        preparedStatement.setString(i, joiner.join(strings));
    }

    @Override
    public String[] getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
        String data = resultSet.getString(columnName);
        if(StringUtils.isEmpty(data)) {
            return new String[0];
        } else {
            return data.split(",");
        }
    }

    @Override
    public String[] getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
        String data = resultSet.getString(columnIndex);
        if(StringUtils.isEmpty(data)) {
            return new String[0];
        } else {
            return data.split(",");
        }
    }

    @Override
    public String[] getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
        String data = callableStatement.getString(columnIndex);
        if(StringUtils.isEmpty(data)) {
            return new String[0];
        } else {
            return data.split(",");
        }
    }
}

而後在映射關係的定義中指定這個類做爲typeHandleride

public interface SimpleMapper {
    @Select("select url from testdb.MY_BATIS_TEST;")
    @Results(value = {
            @Result(property = "support_os_version", column = "supportOSLevel", typeHandler = StringSplitHandler.class),
    })
    Set<Record> selectRecords();
}
相關文章
相關標籤/搜索