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
暂时还没用过
标签:Flex,return,String,数据源,entity,member,Mybatis,Table,public From: https://www.cnblogs.com/ybbit/p/17726125.html