七:MyBatis-Plus 其它

    科技2025-01-14  17

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

    Processed: 0.010, SQL: 8