#3.3.0版本新增内容使用文档

##增加对动态表名的支持

###新增`IDynamicTableName`接口：

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

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

###一个动态表名的例子

####首先继承`IDynamicTableName`接口：
```java
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;
    }
}
```

####测试代码：

```java
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个方法

```java
/**
 * 手写条件
 *
 * @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`新方法用法举例
```java
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
```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`除了[集成文档](http://git.oschina.net/free/Mapper/blob/master/wiki/mapper3/3.Use.md#2-<code>-generatedvalue-strategy-=-generationtype-identity-<-code>)中的这些选项外，还可以是任意可以执行的SQL，例如MySql的`select uuid()`,SqlServer的`select newid()`等等，这种情况下需要保证主键的类型和SQL的返回值一致。

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