0
点赞
收藏
分享

微信扫一扫

七:MyBatis-Plus 其它


自定义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()

七:MyBatis-Plus 其它_SQL


举报

相关推荐

0 条评论