自定义ID生成器
@Slf4j
@Component
public class CustomIdGenerator implements IdentifierGenerator {
private final AtomicLong al = new AtomicLong(1);
@Override
public Long nextId(Object entity) {
//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
String bizKey = entity.getClass().getName();
log.info("bizKey:{}", bizKey);
MetaObject metaObject = SystemMetaObject.forObject(entity);
String name = (String) metaObject.getValue("name");
final long id = al.getAndAdd(1);
log.info("为{}生成主键值->:{}", name, id);
return id;
}
}
主键生成策略使用ASSIGN_ID
public class User implements Serializable {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
}
执行插入时,实体不需要设置id字段值,在插入时会执行CustomIdGenerator#nextId()方法来生成id值。
@Test
void testMyBatisPlus() {
User user = new User();
user.setAge(50);
user.setStatus(2);
userMapper.insert(user);
}
SQL注入原理
在MP中,ISqlInjector接口负责SQL的注入工作,AbstractSqlInjector是它的实现类,主要是由inspectInject()方法进行注入的,方法又调用injecttMappedStatement()方法,进而进入某个具体的方法类(如SelectById)来组装SQL
selectById(1L) ->
- com.baomidou.mybatisplus.core.injector.ISqlInjector
- com.baomidou.mybatisplus.core.injector.AbstractSqlInjector#inspectInject()
- com.baomidou.mybatisplus.core.injector.AbstractMethod#inject() 循环注入自定义方法,选中AbstractMethod,Ctrl+H 查看具体实现类。
- com.baomidou.mybatisplus.core.injector.AbstractMethod#injectMappedStatement()
- com.baomidou.mybatisplus.core.injector.methods.SelectById#injectMappedStatement()