Mybatis-Flex核心功能之@Table

发布时间 2023-09-28 15:08:11作者: 我也有梦想呀

1、能干啥?

@Table 主要是用于给 Entity 实体类添加标识,用于描述 实体类 和 数据库表 的关系,以及对实体类进行的一些 功能辅助。

例如:
数据库有一张tb_member的会员表
image

这时候我们就可以使用@Table去绑定对应的实体和表的对应关系
image

2、怎么玩?

先看看@Table注解内部结构
image

public @interface Table {

    /**
     * 显式指定表名称
     */
    String value();

    /**
     * 数据库的 schema(模式)
     */
    String schema() default "";

    /**
     * 默认为 驼峰属性 转换为 下划线字段
     */
    boolean camelToUnderline() default true;

    /**
     * 默认使用哪个数据源,若系统找不到该指定的数据源时,默认使用第一个数据源
     */
    String dataSource() default "";

    /**
     * 监听 entity 的 insert 行为
     */
    Class<? extends InsertListener> onInsert() default NoneListener.class;

    /**
     * 监听 entity 的 update 行为
     */
    Class<? extends UpdateListener> onUpdate() default NoneListener.class;

    /**
     * 监听 entity 的查询数据的 set 行为,用户主动 set 不会触发
     */
    Class<? extends SetListener> onSet() default NoneListener.class;

    /**
     * 在某些场景下,我们需要手动编写 Mapper,可以通过这个注解来关闭 APT 的 Mapper 生成
     */
    boolean mapperGenerateEnable() default true;
}

(1) value

显式指定表名称,不写默认就是value
image

(2) schema

数据库的 schema(模式)

比如说在某些情况下,我们需要将数据隔离;

(3) camelToUnderline

是否开启驼峰属性转为下划线字段, 默认为 true (开启)

例如:
数据库有一个nick_name的字段
实体类有一个nickName的属性

关闭驼峰转下划线
image

@Test
    public void testCamelToUnderline() {
        QueryWrapper wrapper = QueryWrapper.create()
                .select(MEMBER.ALL_COLUMNS)
                .from(MEMBER)
                .where(MEMBER.ID.eq(10));
        Member member = memberMapper.selectOneByQuery(wrapper);
        log.info("member:{}", member);
        Assertions.assertNotNull(member, "数据不存在");
    }

image

可以返现字段值映射不上,开启试试

image

(4) dataSource

默认使用哪个数据源,若系统找不到该指定的数据源时,默认使用第一个数据源;这个后面整理到多数据源再说

(5) onInsert

监听 entity 的 insert 行为

image

例如:我们可以在insert时候对我们的create_time、、update_time进行赋值,等等...

// Listener
public class MemberInsertListener implements InsertListener {
    @Override
    public void onInsert(Object entity) {
        System.out.println("=========================" + entity.getClass() + "=========================");
        Member member = (Member) entity;
        member.setNickName("测试OnInsert");
    }
}

// test

image

(6) onUpdate

监听 entity 的 update 行为

和上面的OnInsert同理

// listener
public class MemberUpdateListener implements UpdateListener {

    @Override
    public void onUpdate(Object entity) {
        Member member = (Member) entity;
        // 不让用户修改openid
        member.setOpenid(null);
    }
}


// test
@Test
    public void testOnUpdate() {
        Member member = new Member();
        member.setName("ly");
        member.setOpenid("111222333");
        QueryWrapper wrapper = QueryWrapper.create()
                .where(MEMBER.ID.eq(50));
        int rows = memberMapper.updateByQuery(member, wrapper);
        Assertions.assertTrue(rows > 0);
    }

image

(7) onSet

监听 entity 的查询数据的 set 行为,用户主动 set 不会触发

package com.ly.listener;

import com.mybatisflex.annotation.SetListener;

/**
 * @author : ly
 */
public class MemberSetListener implements SetListener {
    @Override
    public Object onSet(Object entity, String property, Object value) {
        System.out.println("执行了MemberSetListener...");
        // 例如对字段值进行加密
        if (isName(property)) {
            if (value != null) {
                return ((String) value).codePoints()
                        .mapToObj(code -> "\\u" + code)
                        .reduce(String::concat)
                        .orElse("");
            }
            return null;
        }
        // 例如用户对某个字段没有权限查看,则设为null
        if (isOpenid(property)) {
            String currUser = "张三";
            boolean flag = hasPermission(currUser);
            if (flag) {
                return value;
            }
            return null;
        }
        return value;
    }

    private boolean hasPermission(String currUser) {
        return "李四".equals(currUser);
    }

    private boolean isOpenid(String property) {
        return "openid".equals(property);
    }

    private boolean isName(String property) {
        return "name".equals(property);
    }

    public static void main(String[] args) {
        String name = "张三";
        String res = name.codePoints().mapToObj(code -> "\\u" + code)
                .reduce(String::concat)
                .orElse("");
        System.out.println("res = " + res);
    }
}

(8) mapperGenerateEnable

暂时还没用过