Mybatis-plus2.0支持oracle序列
配置部分
第一步,設置主鍵生成策略keyGenerator爲OracleKeyGenerator
局部
<property name="keyGenerator">
<bean class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator"/>
</property>
全局
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath*:mappers/**/*.xml" />
<property name="typeAliasesPackage" value="x.**.x" />
<property name="globalConfig">
<bean class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<property name="dbColumnUnderline" value="true" />
<!-- 支持oracle序列 -->
<property name="keyGenerator">
<bean class="com.baomidou.mybatisplus.incrementer.OracleKeyGenerator"/>
</property>
</bean>
</property>
</bean>
第二步,設置序列(@KeySequence)和主鍵類型(IdType)
clazz 指定主鍵的類型,IdType必須設置,且不能是AUTO,後面附有源碼
@TableName("VZ_FAIL_ORDER_MESSAGE")
@KeySequence(value = "SEQ_VZ_FAIL_ORDER_MESSAGE", clazz = String.class)
public class FailOrderMessage extends BaseModel<FailOrderMessage> {
private static final long serialVersionUID = -8043398680425490355L;
@TableId(value = "ID_", type = IdType.INPUT)
private String id;
@TableField("PRO_ID")
private String proId;
...
完成以上兩個步驟,就大功告成了,insert操作不需要設置主鍵,自動從指定的序列獲取。不設置序列,則自定義主鍵值。
源碼部分
實體必須設置主鍵,主鍵類型不是AUTO纔會使用指定的主鍵生成策略,建議設置爲INPUT,不設置序列則需要用戶手動傳入主鍵值
/**
* <p>
* 注入插入 SQL 語句
* </p>
*
* @param selective 是否選擇插入
* @param mapperClass
* @param modelClass
* @param table
*/
protected void injectInsertOneSql(boolean selective, Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
/*
* INSERT INTO table <trim prefix="(" suffix=")" suffixOverrides=",">
* <if test="xx != null">xx,</if> </trim> <trim prefix="values ("
* suffix=")" suffixOverrides=","> <if test="xx != null">#{xx},</if>
* </trim>
*/
KeyGenerator keyGenerator = new NoKeyGenerator();
StringBuilder fieldBuilder = new StringBuilder();
StringBuilder placeholderBuilder = new StringBuilder();
SqlMethod sqlMethod = selective ? SqlMethod.INSERT_ONE : SqlMethod.INSERT_ONE_ALL_COLUMN;
fieldBuilder.append("\n<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n");
placeholderBuilder.append("\n<trim prefix=\"(\" suffix=\")\" suffixOverrides=\",\">\n");
String keyProperty = null;
String keyColumn = null;
// 表包含主鍵處理邏輯,如果不包含主鍵當普通字段處理
if (StringUtils.isNotEmpty(table.getKeyProperty())) {
if (table.getIdType() == IdType.AUTO) {
/* 自增主鍵 */
keyGenerator = new Jdbc3KeyGenerator();
keyProperty = table.getKeyProperty();
keyColumn = table.getKeyColumn();
} else {
if (null != table.getKeySequence()) {
keyGenerator = TableInfoHelper.genKeyGenerator(table, builderAssistant, sqlMethod.getMethod(), languageDriver);
keyProperty = table.getKeyProperty();
keyColumn = table.getKeyColumn();
fieldBuilder.append(table.getKeyColumn()).append(",");
placeholderBuilder.append("#{").append(table.getKeyProperty()).append("},");
} else {
/* 用戶輸入自定義ID */
fieldBuilder.append(table.getKeyColumn()).append(",");
// 正常自定義主鍵策略
placeholderBuilder.append("#{").append(table.getKeyProperty()).append("},");
}
}
}
// 是否 IF 標籤判斷
boolean ifTag;
List<TableFieldInfo> fieldList = table.getFieldList();
for (TableFieldInfo fieldInfo : fieldList) {
// 在FieldIgnore,INSERT_UPDATE,INSERT 時設置爲false
ifTag = !(FieldFill.INSERT == fieldInfo.getFieldFill()
|| FieldFill.INSERT_UPDATE == fieldInfo.getFieldFill());
if (selective && ifTag) {
fieldBuilder.append(convertIfTagIgnored(fieldInfo, false));
fieldBuilder.append(fieldInfo.getColumn()).append(",");
fieldBuilder.append(convertIfTagIgnored(fieldInfo, true));
placeholderBuilder.append(convertIfTagIgnored(fieldInfo, false));
placeholderBuilder.append("#{").append(fieldInfo.getEl()).append("},");
placeholderBuilder.append(convertIfTagIgnored(fieldInfo, true));
} else {
fieldBuilder.append(fieldInfo.getColumn()).append(",");
placeholderBuilder.append("#{").append(fieldInfo.getEl()).append("},");
}
}
fieldBuilder.append("\n</trim>");
placeholderBuilder.append("\n</trim>");
String sql = String.format(sqlMethod.getSql(), table.getTableName(), fieldBuilder.toString(),
placeholderBuilder.toString());
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
this.addInsertMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource, keyGenerator, keyProperty,
keyColumn);
}
oracle以序列生成主鍵
/**
* <p>
* Oracle Key Sequence 生成器
* </p>
*
* @author hubin
* @Date 2017-05-08
*/
public class OracleKeyGenerator implements IKeyGenerator {
@Override
public String executeSql(String incrementerName) {
StringBuilder sql = new StringBuilder();
sql.append("SELECT ").append(incrementerName);
sql.append(".NEXTVAL FROM DUAL");
return sql.toString();
}
}
創建序列
CREATE SEQUENCE SEQ_VZ_FAIL_ORDER_MESSAGE 1 MAXVALUE 9999999999999999999999999999 START WITH 1 INCREMENT BY 1 CACHE 100;