解决思路:
在插入时使用序列作为主键:
代码实现:
/**
* 解决DB2不能给自增长主键插入null值问题
*
* @author gzy
* @date 2016年6月27日 下午6:50:09
* @param <T>
*/
@RegisterMapper
public interface Db2InsertMapper<T> {
/**
* 插入数据,用序列作为主键
* @param record
* @return
*/
@Options(useGeneratedKeys = true, keyProperty = "iSeq")
@InsertProvider(type = Db2Provider.class, method = "dynamicSQL")
int insertOfSpecialKey (T record);
}
实现类:
/**
* 用于DB2的SQL - Insert
*
* @author gzy
* @date 2016年6月27日 下午6:51:00
*/
public class Db2Provider extends MapperTemplate {
public Db2Provider(Class<?> mapperClass, MapperHelper mapperHelper) {
super(mapperClass, mapperHelper);
}
/**
* 使用序列作为主键
* @param ms
* @return
*/
public String insertOfSpecialKey(MappedStatement ms){
Class<?> entityClass = this.getEntityClass(ms);
StringBuilder sql = new StringBuilder();
Set<EntityColumn> columnList = EntityHelper.getColumns(entityClass);
sql.append(SqlHelper.insertIntoTable(entityClass, this.tableName(entityClass)));
sql.append("<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">");
Iterator var5 = columnList.iterator();
EntityColumn column;
while(var5.hasNext()) {
column = (EntityColumn)var5.next();
if (column.isInsertable()) {
if (column.isId()) {
sql.append(column.getColumn() + ",");
} else {
sql.append(SqlHelper.getIfNotNull(column, column.getColumn() + ",", this.isNotEmpty()));
}
}
}
sql.append("</trim>");
sql.append("<trim prefix=\"VALUES(\" suffix=\")\" suffixOverrides=\",\">");
//使用自增序列作为主键
sql.append("NEXTVAL FOR TEIS_SEQID,");
var5 = columnList.iterator();
while(var5.hasNext()) {
column = (EntityColumn)var5.next();
if (column.isInsertable()) {
if (column.isIdentity()) {
sql.append(SqlHelper.getIfCacheNotNull(column, column.getColumnHolder((String)null, "_cache", ",")));
} else {
sql.append(SqlHelper.getIfNotNull(column, column.getColumnHolder((String)null, (String)null, ","), this.isNotEmpty()));
}
if (column.isIdentity()) {
sql.append(SqlHelper.getIfCacheIsNull(column, column.getColumnHolder() + ","));
}
}
}
sql.append("</trim>");
return sql.toString();
}
}