5. 高级用法

如果你在使用通用 Mapper 过程中已经得心应手,并且几乎没有遇到过任何问题。那么,你可以看该部分内容。

如果你对Mapper2已经很熟悉,想使用Mapper3新的方式,你也可以看该部分内容。

但是在Mapper3相关的文档中,更多是按照Mapper2的方式来讲的。

Mapper3变化中提到了许多新的变化。

如果使用这些新的特性,是这部分的主要内容。

在看下面内容前,请先阅读Mapper3变化

接口可以自定义搭配继承

如果你想按需选择接口,不想使用Mapper<T>包含的那么多的方法,你可以创建自己的MyMapper<T>,自己搭配想要的方法。

Mapper3提供的全部的方法,可以查看Mapper3通用接口大全

如何创建自己的MyMapper<T>呢?

这里只是简单的举例,仅供参考。

我需要那些方法?

  1. 假设我有一类表的操作仅设计到查询操作,不需要insert,update,delete等操作。

我可能会选择SelectMapper<T>,SelectOneMapper<T>SelectRowBoundsMapper<T>,SelectByExampleRowBoundsMapper<T>接口。

那么我的MyMapper<T>就是下面的样子:

public interface MyMapper<T> extends
    SelectMapper<T>,
    SelectOneMapper<T>,
    SelectRowBoundsMapper<T>,
    SelectByExampleRowBoundsMapper<T> {

}
  1. 假设我项目中需要用到批量插入和基本才CRUD操作,那么MyMapper<T>就是下面的样子:
public interface MyMapper<T> extends
    BaseMapper<T>,
    InsertListMapper<T> {

}
  1. 假如我想用Mapper<T>的所有方法和MySql<T>的方法,那么MyMapper<T>就是下面的样子:
public interface MyMapper<T> extends
   Mapper<T>,
   MySqlMapper<T> {

}

设计好自己的MyMapper<T>后,还需要进行配置。

配置MyMapper<T>

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.isea533.mybatis.mapper"/>
    <property name="properties">
        <value>
            mappers=com.xxx.xxx.MyMapper
        </value>
    </property>
</bean>

只需要按照上面的方式配置即可。

如果我自己定义了MyMapper,MyMapper2,MyMapper3,可以如下配置:

<bean class="tk.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.isea533.mybatis.mapper"/>
    <property name="properties">
        <value>
            mappers=com.xxx.xxx.MyMapper,com.xxx.xxx.MyMapper2,com.xxx.xxx.MyMapper3
        </value>
    </property>
</bean>

如果你觉得配置太长不方法,你可以这样:

public interface AllMapper<T> extends
    MyMapper<T>,
    MyMapper2<T>,
    MyMapper3<T> {

}

然后配置mappers=com.xxx.xxx.AllMapper即可。

高级重定义方法

这里举一个复杂的例子。在special特殊接口中有一个批量插入的方法。

public interface InsertListMapper<T> {

    /**
     * 批量插入,支持数据库自增字段,支持回写
     *
     * @param recordList
     * @return
     */
    @Options(useGeneratedKeys = true, keyProperty = "id")
    @InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
    int insertList(List<T> recordList);

    /**
     * ======如果主键不是id怎么用?==========
     * 假设主键的属性名是uid,那么新建一个Mapper接口如下
     * <pre>
        public interface InsertUidListMapper<T> {
            @Options(useGeneratedKeys = true, keyProperty = "uid")
            @InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
            int insertList(List<T> recordList);
        }
     * 只要修改keyProperty = "uid"就可以
     *
     * 然后让你自己的Mapper继承InsertUidListMapper<T>即可
     *
     * </pre>
     */
}

这里注释提到了一种情况,那就是如果主键不是id怎么用?

按照注释中所说的,你可以自己创建一个Mapper接口,然后修改keyProperty属性,如下:

public interface InsertUidListMapper<T> {
    @Options(useGeneratedKeys = true, keyProperty = "uid")
    @InsertProvider(type = SpecialProvider.class, method = "dynamicSQL")
    int insertList(List<T> recordList);
}

Mapper3通用接口大全

Mapper3提供的全部接口,一可以看源码,二可以看Mapper3通用接口大全

如何开发自己的通用接口

Mapper3提供了更简单容易理解的方式,你可以看快速开发自己的通用接口

除了新增的这种方式外,还有Mapper2支持的两种方式,你可以看如何开发自己的通用Mapper