Mybatis-Flex核心功能之@Table
1、能干啥?
@Table 主要是用于给 Entity 实体类添加标识,用于描述 实体类 和 数据库表 的关系,以及对实体类进行的一些 功能辅助。
例如:
数据库有一张tb_member的会员表

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

2、怎么玩?
先看看@Table注解内部结构

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
(2) schema
数据库的 schema(模式)
比如说在某些情况下,我们需要将数据隔离;
(3) camelToUnderline
是否开启驼峰属性转为下划线字段, 默认为 true (开启)
例如:
数据库有一个nick_name的字段
实体类有一个nickName的属性
关闭驼峰转下划线

@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, "数据不存在");
}

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

(4) dataSource
默认使用哪个数据源,若系统找不到该指定的数据源时,默认使用第一个数据源;这个后面整理到多数据源再说
(5) onInsert
监听 entity 的 insert 行为

例如:我们可以在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

(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);
}

(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
暂时还没用过
Mybatis-Flex核心功能之@Table的更多相关文章
- Shiro 核心功能案例讲解 基于SpringBoot 有源码
Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...
- MyBatis的核心配置、动态sql、关联映射(快速总结)
MyBatis的核心对象和配置 #1. SqlSessionFactory对象: 单个数据库映射关系经过编译的内存镜像: 作用:创建SQLSession对象. //读取配置文件 InputSteam ...
- Mybatis的核心配置
之前了解了Mybatis的基本用法,现在学习一下Mybatis框架中的核心对象以及映射文件和配置文件,来深入的了解这个框架. 1.Mybatis的核心对象 使用MyBatis框架时,主要涉及两个核心对 ...
- 掌握Mybatis的核心配置文件
一.配置文件结构 MyBatis的核心配置文件配置了MyBatis的一些全局信息,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和影响MyBatis行为的一些属性. 该配置文件的元素 ...
- Spring 核心功能演示
Spring 核心功能演示 Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot, ...
- 源码分析 | 手写mybait-spring核心功能(干货好文一次学会工厂bean、类代理、bean注册的使用)
作者:小傅哥 博客:https://bugstack.cn - 汇总系列原创专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言介绍 一个知识点的学习过程基本分为:运行helloworld ...
- 【java框架】MyBatis-Plus(1)--MyBatis-Plus快速上手开发及核心功能体验
1.MyBatis-Plus入门开发及配置 1.1.MyBatis-Plus简介 MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变, ...
- 带连接池的netty客户端核心功能实现剖解
带连接池的netty客户端核心功能实现剖析 带连接池的netty的客户端核心功能实现剖析 本文为原创,转载请注明出处 源码地址: https://github.com/zhangxianwu/ligh ...
- Chrome扩展开发之四——核心功能的实现思路
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- ES6,ES2105核心功能一览,js新特性详解
ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...
随机推荐
- [错误] SQL logic error near "date": syntax error
问题的来源 今天把一个项目的数据库从MySQL改到Sqlite 调试时发生了这个错误. 百度又看不懂英文(很多是国外发的), 就折腾了一下 原因 C# Sqlite 不能使用参数前缀"?&q ...
- Vue源码学习(三):<templete>渲染第二步,创建ast语法树
好家伙,书接上回 在上一篇Vue源码学习(二):<templete>渲染第一步,模板解析中,我们完成了模板解析 现在我们继续,将模板解析的转换为ast语法树 1.前情提要 代码已开 ...
- Solution -「洛谷 P4007」小 Y 和恐怖的奴隶主
Description Link. 这道题 的加强版. Solution 题解里面大多数都是概率 DP,或者是期望 DP 然后是逆推.甚至不给 DP 的转移式.机房 yyds Reanap 发了一篇逆 ...
- 解决SpringBoot3.X中starter配置自动注入失效问题
在自定义 starter 项目时,如果组件无法被 @ComponentScan 扫描并且想自动注册到 IOC 中,在springboot2.7之前 我们会采用 spring,factories 方式, ...
- CMP临时文件清理
■■ CMP临时文件 CMP - 指 Compression Advisor ,是 Oracle 数据库的压缩建议特性,在生成建议时产生的中间过程表,一般会自行删除.这个特性自 11.2.0.4 引入 ...
- ChatGPT 是如何产生心智的?
一.前言 - ChatGPT真的产生心智了吗? 来自斯坦福大学的最新研究结论,一经发出就造成了学术圈的轰动,"原本认为是人类独有的心智理论(Theory of Mind,ToM),已经出现在 ...
- buu pwn wp(持续更新)
1.warmup_csaw_2016 main函数如下 __int64 __fastcall main(int a1, char **a2, char **a3) { char s[64]; // [ ...
- Mac OS安装Python的pip
最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。) 原因为他的python没有numpy这个库(这个故事很典).然鹅雪上加霜的是,他的电脑是Mac,没有Windows ...
- Windows 95 的辉煌诞生历史
1992 年 2 月,Windows 3.1 的研发即将结束,而 Windows 团队正忙得不亦乐乎地计划他们的下一盘大棋.到了 3 月 5 日,他们终于悠哉悠哉地敲定了战略大计:横扫桌面.笔记本.移 ...
- IEDA-Maven项目开发步骤
1. 打开IDEA 界面,选择"New Project" 2. 输入项目名称和基本信息 输入项目名称.选择存放路径.JDK版本.以及GroupId.ArtifactId. Grou ...
