首页 > 其他分享 >Mybatis-Flex核心功能之@Table

Mybatis-Flex核心功能之@Table

时间:2023-09-28 15:11:48浏览次数:36  
标签:Flex return String 数据源 entity member Mybatis Table public

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

暂时还没用过

标签:Flex,return,String,数据源,entity,member,Mybatis,Table,public
From: https://www.cnblogs.com/ybbit/p/17726125.html

相关文章

  • Go每日一库之70:termtables
    简介今天学个简单点的,termtables处理表格形式数据的输出。适用于随时随地的输出一些状态或统计数据,便于观察和调试。是一个很小巧的工具库。我在学习dateparse库时偶尔见遇到了这个库。快速使用本文代码使用GoModules。创建目录并初始化:$mkdirtermtables&&cdtermtable......
  • 最近正在集成SpringBoot与MyBatis-plus,体验感很好啊
    sqlCREATETABLE`class`(`id`int(11)NOTNULLAUTO_INCREMENTCOMMENT'编号',`name`varchar(30)DEFAULTNULLCOMMENT'班级名',`floor`int(3)DEFAULTNULLCOMMENT'楼层',`teacher_id`int(11)DEFAULTNULLCOMMENT'老师......
  • 实战指南,SpringBoot + Mybatis 如何对接多数据源
    本文分享自华为云社区 《实战指南,SpringBoot+Mybatis如何对接多数据源》,作者:战斧。在我们开发一些具有综合功能的项目时,往往会碰到一种情况,需要同时连接多个数据库,这个时候就需要用到多数据源的设计。而Spring与Myabtis其实做了多数据源的适配,只需少许改动即可对接多数据源。......
  • Mybatis中的设计模式
    最近在看《通用源码阅读指导书:Mybatis源码详解》,这本书一一介绍了Mybatis中的各个包的功能,同时也涉及讲了一些阅读源码的技巧,还讲了一些源码中涉及的设计模式,这是本篇文章介绍的内容在多说一点这本书,Mybatis是大部分Java开发者都熟悉的一个框架,通过这本书去学习如何阅读源码非常......
  • pro table 中搜索select联动另一个select的问题
     问题一、一个select能联动另一个select//部门project列表,从服务端获取const[deptProjListFromServer,setDeptProjListFromServer]=useState<{[key:string]:any}>([]);//当前projectconst[currDepartmentId,setDepartmentId]=useState('1');/......
  • Flex布局【实战】
    实战:使用Flex布局构建如下界面分析:竖向:使用flex布局将页面分为三部分,即头部、主体和底部。其中头部和底部需要固定高度,其余的高度分配给主体部分(使用flex-direction=column;和flex-grow:1;)主体部分:使用flex布局排列多个卡片,这里可以使用uniapp提供的scroll-view......
  • 【详解】Spring Boot + Mybatis-Plus实现CRUD,轻松玩转接口操作!
    ......
  • vue3项目table表格动态表头生成+行数据合并
    这两处地方是动态的,由后端数据返回思路流程  1,后端返回数据二次处理  2,根据后端数据生成动态表头  3,利用antd的customRender与rowSpan设置行合并 完整代码<template><Table:data-source="dataSource":columns="columns":pagination="......
  • 记录一次使用MP的TableNameHandler实现简单的分表需求
    1.使用场景MybatisPlus3.4.0及以上版本有简单的分表需求,项目不允许嵌入其他分库分表框架2.具体使用2.1TableNameHandler介绍TableNameHandler是MP提供的一个动态表名处理接口,其原理是通过MP拓展的拦截器(DynamicTableNameInnerInterceptor)中动态修改解析完成后的sql中的......
  • flex 布局之左右边距对齐,换行左对齐2
    <!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> </head> <styletype="text/css"> li{ list-style:none; } .List{ width:100%; box-sizing:borde......