目的:使用Oracle的sequence+MybatisPlus的“TableId”枚举,自动填充id字段。
以下代码中包含:
1)父类,包含基础字段、TableId、KeySequence的配置以及一些公共方法
2)父类上配置的KeySequence的sql语句
3)业务子类
4)MybatisPlusConfig 的bean配置(该配置的作用是使TableId生效)
- 父类
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.Date;
import java.util.Random;
import static ms.infrastructure.constant.BaseConstant.SYSTEM_NAME;
/**
* @date 2019/3/14 11:04
*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@KeySequence(value ="GLOBAL_SEQ" )
public class AbstractModel implements Serializable {
private static final long serialVersionUID = 3623141357792435967L;
@TableId(value = "ID", type = IdType.INPUT)
private Long id;
/**
* 备注
*/
@TableField("REMARK")
private String remark;
/**
* 创建人
*/
@TableField("CREATOR")
private String creator;
/**
* 创建时间
*/
@TableField("CREATED_TIME")
private Date createdTime;
/**
* 最后修改者
*/
@TableField("MODIFIER")
private String modifier;
/**
* 修改时间
*/
@TableField("MODIFIED_TIME")
private Date modifiedTime;
/**
* 版本信息
*/
@TableField("VERSION")
private Integer version;
/**
* 有效状态
*/
@TableField("YN")
private Boolean yn;
public static void touchForCreate(Object target) {
if (target instanceof AbstractModel) {
AbstractModel model = (AbstractModel) target;
Date now = new Date();
if (model.getCreatedTime() == null) {
model.setCreatedTime(now);
}
model.setModifiedTime(now);
model.setVersion(0);
if (StringUtils.isEmpty(model.getCreator())) {
model.setCreator(SYSTEM_NAME);
model.setModifier(SYSTEM_NAME);
}
model.setYn(true);
}
}
public static void touchForUpdate(Object target, String modifier) {
if (target instanceof AbstractModel) {
AbstractModel model = (AbstractModel) target;
model.setModifiedTime(new Date());
model.setModifier(modifier);
//请注意,更新数据时,若希望使用乐观锁,需要自己写sql来处理version,也就不要调到该方法
model.setVersion(model.getVersion() + 1);
}
}
protected String generateId() {
String millis = System.currentTimeMillis() + "";
return millis.substring(4) + new Random().nextInt(1000);
}
public void doModify(String m, int newVersion) {
modifier = m;
modifiedTime = new Date();
version = newVersion;
}
}
- sequence语句
--DROP SEQUENCE GLOBAL_SEQ;
CREATE SEQUENCE GLOBAL_SEQ
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999
CYCLE
CACHE 100;
- 业务子类
import ms.manager.base.model.AbstractModel;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@TableName(value = "user_info", autoResultMap = true)
public class UserInfo extends AbstractModel {
/**
* uid
*/
@TableField("userid")
private String userid;
/**
* 用户名
*/
@TableField("name")
private String name;
/**
* mobile
*/
@TableField("mobile")
private String mobile;
/**
* 密码的64位MD5
*/
@TableField("passWd")
private String passWd;
/**
* 角色
*/
@TableField("role")
private String role;
/**
* 用户头像,非微信头像
*/
@TableField("headimgurl")
private String headimgurl;
public void generateUid() {
userid = "U_" + super.generateId();
}
- bean配置
import com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
@Bean
public OracleKeyGenerator oracleKeyGenerator() {
return new OracleKeyGenerator();
}
}
测试插入后的效果