7. 3.3.0 版本新增内容使用文档

增加对动态表名的支持

新增IDynamicTableName接口:

/**
 * 实现动态表名时,实体类实现该接口
 *
 * @author liuzh
 * @since 2015-10-28 22:20
 */
public interface IDynamicTableName {

    /**
     * 获取动态表名 - 这个方法是关键,只要有返回值,不是null和'',就会用返回值作为表名
     *
     * @return
     */
    String getDynamicTableName();
}

一个动态表名的例子

首先继承 IDynamicTableName 接口:
public class Country implements IDynamicTableName {

    @Id
    @OrderBy("desc")
    private Integer id;

    @Column
    private String countryname;
    private String countrycode;

    @Transient//非表字段,字段名称无所谓
    private String dynamicTableName123;

    //省略getter和setter

    @Override//当该方法返回值不为空时,就会使用返回值作为表名
    public String getDynamicTableName() {
        return dynamicTableName123;
    }

    public void setDynamicTableName(String dynamicTableName) {
        this.dynamicTableName123 = dynamicTableName;
    }
}
测试代码:
CountryMapper mapper = sqlSession.getMapper(CountryMapper.class);
Country country = new Country();
country.setDynamicTableName("country_123");
List<country> countryList = mapper.select(country);
输出SQL:

SELECT id,countryname,countrycode FROM country_123 ORDER BY id

Example增加了4个方法

/**
 * 手写条件
 *
 * @param condition 例如 "length(countryname)<5"
 * @return
 */
public Criteria andCondition(String condition) {
    addCriterion(condition);
    return (Criteria) this;
}

/**
 * 手写左边条件,右边用value值
 *
 * @param condition 例如 "length(countryname)="
 * @param value 例如 5
 * @return
 */
public Criteria andCondition(String condition, Object value) {
    criteria.add(new Criterion(condition, value));
    return (Criteria) this;
}

/**
 * 手写左边条件,右边用value值
 *
 * @param condition 例如 "length(countryname)="
 * @param value 例如 5
 * @param typeHandler 类型处理
 * @return
 */
public Criteria andCondition(String condition, Object value, String typeHandler) {
    criteria.add(new Criterion(condition, value, typeHandler));
    return (Criteria) this;
}

/**
 * 手写左边条件,右边用value值
 *
 * @param condition 例如 "length(countryname)="
 * @param value 例如 5
 * @param typeHandler 类型处理
 * @return
 */
public Criteria andCondition(String condition, Object value, Class<? extends TypeHandler> typeHandler) {
    criteria.add(new Criterion(condition, value, typeHandler.getCanonicalName()));
    return (Criteria) this;
}

Example新方法用法举例

Example example = new Example(Country.class);
example.createCriteria()
        .andCondition("countryname like 'C%' and id < 100")
        .andCondition("length(countryname) = ", 5)
        .andCondition("countrycode =", "CN", StringTypeHandler.class);
List<Country> countries = mapper.selectByExample(example);

输出SQL

SELECT id,countryname,countrycode
FROM Country
WHERE (
countryname like 'C%'
and id < 100
and length(countryname) = ?
and countrycode = ?
)
ORDER BY id desc

@GeneratedValue(strategy = GenerationType.IDENTITY)的一种重要用法说明:

IDENTITY除了集成文档中的这些选项外,还可以是任意可以执行的SQL,例如MySql的select uuid(),SqlServer的select newid()等等,这种情况下需要保证主键的类型和SQL的返回值一致。

利用这一个特点,我们就可以使用可以回写的UUID值,如果想获得更特殊的主键值,可以自己写函数调用。