Mybatis——MetaObject学习

简介:MetaObject是Mybatis提供的一个用于方便、优雅访问对象属性的对象,通过它可以简化代码、不需要try/catch各种reflect异常,同时它支持对JavaBean、Collection、Map三种类型对象的操作。

JavaBean:

//java bean
Object javaBean = new Example().setContent("hello");

MetaObject javaBeanMeta = MetaObject.forObject(javaBean,
                DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
System.out.println(javaBeanMeta.getValue("content"));
javaBeanMeta.setValue("content", "world");
System.out.println(javaBeanMeta.getValue("content"));
class Example {
    private String content;

    public String getContent() {
        return content;
    }

    public Example setContent(String content) {
        this.content = content;
        return this;
    }
}

运行结果:

hello
world

Collection:

//collection
List<String> collection = new ArrayList<String>();
MetaObject collectionMeta = MetaObject.forObject(collection,
                DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
collectionMeta.add("hello world");
System.out.println(collection.size());

运行结果:

1

Map:

//Map
Map<String,String> map = new HashMap<String, String>();
map.put("hello","hello world");

MetaObject mapMeta = MetaObject.forObject(map,
                DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY, DEFAULT_REFLECTOR_FACTORY);
System.out.println(mapMeta.getValue("hello"));

运行结果:

hello world

说明:

  • 获取MetaObject对象需要使用静态方法MetaObject.forObject,并且需要指定ObjectFactory , ObjectWrapperFactory , ReflectorFactory[3.3.0之前不需要],幸运的是Mybatis为我们提供了默认实现:
    /**
     * 默认ObjectFactory
     */
    private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
    /**
     * 默认ObjectWrapperFactory
     */
    private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
    /**
     * 默认ReflectorFactory
     */
    private static final ReflectorFactory DEFAULT_REFLECTOR_FACTORY = new DefaultReflectorFactory();
  • MetaObject对Collection、Map的支持并不完全,某些操作会直接抛出UnsupportedOperationException,需要注意

欢迎加群,一起学习进步

在这里插入图片描述

### MyBatis Plus 源码详解 #### 1. MyBatis Plus 的核心概念 MyBatis Plus 是基于 MyBatis 进行二次封装的一个简化操作数据库的增强工具[^2]。它不仅保留了 MyBatis 原有的灵活性,还提供了更多便捷的功能来提高开发效率。 #### 2. 主要功能模块解析 ##### 2.1 `SqlParser` 解析器 为了支持更多的 SQL 特性和优化查询性能,MyBatis Plus 提供了一个强大的 SQL 解析机制。通过自定义 SQL 注解和内置模板引擎的支持,开发者能够更加灵活地编写复杂的业务逻辑所需的 SQL 语句[^1]。 ##### 2.2 `MetaObject` 元对象处理 继承并扩展了 MyBatis 中用于管理实体类属性映射的核心组件——`MetaObject`,使得在不侵入原有代码结构的情况下实现了对 JavaBean 属性更细粒度的操作控制。 ```java // MetaObject 使用示例 public class User { private Long id; private String name; public static void main(String[] args) { User user = new User(); MetaObject metaObject = SystemMetaObject.forObject(user); metaObject.setValue("name", "test"); System.out.println(metaObject.getValue("name")); } } ``` ##### 2.3 表名与字段自动识别 借助于注解方式实现表名以及列名到实体类成员变量之间的双向绑定关系维护工作自动化。例如,在实体类上添加 `@TableName` 来指定对应的数据库表格名称[^3]: ```java @TableId(type = IdType.AUTO) private Integer id; // 自增主键 @ApiModelProperty(value = "批次详情ID") @Schema(description = "批次详情ID") @TableField(fill = FieldFill.INSERT_UPDATE) private Long batchDetailId; ``` #### 3. 插件体系架构设计 插件化的设计理念贯穿整个框架之中,允许第三方开发者轻松集成各种实用特性而无需修改内核代码。比如分页插件、乐观锁插件等都是利用这一特点构建而成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值