精华内容
下载资源
问答
  • 自定义注解(利用反射执行需要设置参数的实体类方法)
    2021-07-28 09:31:34

    原文链接:https://blog.csdn.net/leyi520/article/details/118994416

    更多相关内容
  • 前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射实体类的基本...

    前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的设计,于是学习了基本的映射实体类的基本注解,此处做一点总结,后续文章将陆续更新使用注解的方式管理配置各种映射关联关系。本篇主要涉及以下内容:

    使用最基本的注解映射一个实体类

    使用注解映射属性

    使用注解映射主键

    其他特殊类型的属性映射

    一、使用最基本的注解映射一个实体类

    @Entity

    @Table(name = "userInfo")

    public class UserInfo {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    //省略getter和setter方法

    }

    //在hibernate.cfg.xml中添加实体类

    //这样hibernate就会根据配置文件去查找该实体类并做映射操作

    这就是映射一个最简单的实体类所用到的最基本的注解。其中,

    @Entity:指定当前被修饰的类是一个实体类,用于映射到数据库中的表。

    @Table(name = "userInfo"):详细指定了该类映射到数据库中的哪张表,这里映射到userInfo表。

    @Id:指定被修饰的属性将映射到数据表的主键列。

    @GeneratedValue(strategy = GenerationType.IDENTITY):该注解指定了主键的生成策略,一般不单独出现,这里指定了主键自增的策略。

    33afac1ecbfe

    这里写图片描述

    二、使用注解映射普通属性

    对于实体类中属性的映射,一般我们使用@Column进行修饰。该注解有很多属性:

    name:指定该属性映射到数据表中对应的名称

    nullable:指定该属性映射的数据表中列是否可以为null,默认为true

    unique:指定该属性映射到数据表中的列是否具有唯一约束

    length:指定该属性映射到数据表中的列所能保存数据的最大长度,默认是255

    默认情况下,我们不使用@Column修饰属性的时候,hibernate会自动以该属性的名称映射到数据表中的列。

    我们也可以使用注解@Transient修饰属性,它指明了该属性不会被映射到数据表中某一列,而只是作为一个属性被定义在实体类中。例如:

    @Entity

    @Table(name = "userInfo")

    public class UserInfo {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    @Transient

    private int age;

    //省略getter,setter方法

    }

    看看hibernate为我们生成的sql语句:

    33afac1ecbfe

    这里写图片描述

    显然,我们age属性并没有被映射到userinfo表中。

    对于枚举类型的属性,我们可以使用@Enumerated注解进行修饰。

    在某些特殊情况下,有时我们的实体类属性会被定义为枚举类型,那么对于这种数据库中并无法对应的Java类型,该如何映射呢?Hibernate中提供@Enumerated注解来用于我们映射枚举类型,该注解提供一个value属性,该属性可以取两个值:

    EnumType.STRING:该枚举类型的属性映射到数据表的字段的类型是字符串型

    EnumType.ORDINAL:该枚举类型的属性映射到数据表的字段的类型是整数类型

    例如:

    //定义一个枚举类型

    public enum Season {

    春季, 夏季, 秋季, 冬季

    }

    @Entity

    @Table(name = "userInfo")

    public class UserInfo {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    @Enumerated(EnumType.STRING)

    private Season season;

    //省略getter,setter方法

    }

    看看我们的userinfo表:

    33afac1ecbfe

    这里写图片描述

    而当我们@Enumerated(EnumType.ORDINAL)修饰属性的时候,那么Hibernate为我们生成的sql语句是:

    33afac1ecbfe

    这里写图片描述

    这两种情况下,数据表中的season字段一种保存的是枚举类型的具体值,一种保存的是枚举值对应的序号。

    使用@Temporal注解映射日期时间类型

    对于Java来说,表示时间的两个类库,Java.util.Date和java.util.Calendar。而对于数据库而言,表示时间的类型就有很多,例如:date,time,datetime,timestamp等。如何准确的指定最终的映射情况就是我们的@Temporal注解的作用。@Temporal有一个value属性,可以取以下的一些值:

    TemporalType.DATE:对应于数据库中的date类型

    TemporalType.TIME:对应于数据库中的time类型

    TemporalType.TIMESTAMP:对应于数据库中的timestamp类型

    例如:

    @Temporal(TemporalType.DATE)

    private Date date;

    上述代码指定了Java.util.Date类型属性映射到数据库中的date类型字段。

    三、使用注解映射主键属性

    最简单的情况下,我们使用注解@Id标识实体类中的某个属性,那么该属性将会被hibernate映射到数据库主键字段,并且无需指定任何属性值。使用使用@GeneratedValue指定主键的生成策略,通过它的strategy属性来指定具体的主键生成方案,该属性可以取如下几个值:

    GenerationType.AUTO:hibernate默认为该值,它指明了hibernate自动根据底层数据库选择适当的生成策略

    GenerationType.IDENTITY:适用于MySQL,SQLserver的主键自增长策略

    GenerationType.SEQUENCE:适用于Oracle的子串策略

    GenerationType.TABLE:基于辅助表的生成主键策略

    如果不是使用Oracle做数据库的话,一般我们会使用IDENTITY作为默认的主键生成策略。

    联合主键的映射可以通过多个@Id进行修饰即可,但要求该实体类必须继承 java.io.Serializable并尽可能的重写Object的两个方法,hashCode和equals,因为多个属性唯一确定一条记录,自然需要比较属性的值。例如:

    @Entity

    @Table(name = "userInfo")

    public class UserInfo implements Serializable {

    @Id

    private int id;

    @Id

    private String name;

    //省略getter,setter方法

    }

    看看hibernate为我们创建的表结构:

    33afac1ecbfe

    这里写图片描述

    四、特殊属性的映射

    这里的特殊属性指的是实体类中属性类型非常规的基本类型、包装类型、引用类型,而是类似于集合类型、自定义类型等。我们首先看对于集合类型的属性映射情况。

    1、映射集合类型的属性

    在hibernate中,所有的集合类型属性都会被单独映射到一张表中,无论是List,Set或者Map都会对应于一张新表。首先我们看List的映射,在详细介绍之前,我们先完整的看看list的映射情况。

    @Entity

    @Table(name = "userInfo")

    public class UserInfo implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    @ElementCollection(targetClass = String.class)

    @CollectionTable(name = "address",joinColumns = @JoinColumn(name = "user_id"))

    @OrderColumn(name = "list_id")

    @Column(name = "address")

    private List address;

    //省略getter,setter方法

    }

    //通过实体类实例向数据表中插入数据

    UserInfo userInfo = new UserInfo();

    userInfo.setName("single");

    List list = new ArrayList();

    list.add("NanJin");

    list.add("XinJiang");

    list.add("SiChuan");

    list.add("ZheJiang");

    list.add("NanTong");

    userInfo.setAddress(list);

    session.save(userInfo);

    看看两张表:

    33afac1ecbfe

    这里写图片描述

    现在,我们再来看看所用到的几个注解。@ElementCollection注解用于修饰一个集合类型的属性,targetClass 指定了该集合类型的对应的泛型类型,我们这里指定了String类型,那么hibernate底层会默认构建一个ArrayList来存放所有的集合元素并且每个元素都限定为String类型。

    @CollectionTable注解用于配置为集合属性生成的那张新表的基本信息,name 指定新表的表名,joinColumns的值是一个注解@JoinColumn,该注解专门用于配置外键列,这里我们给他命名为user_id,该字段是address表的值依赖于userinfo表的id主键列的值。

    @OrderColumn注解用于配置有序集合的序号,由于list是有序的集合,通过该注解将会在address表中增加一个字段保存各个元素在集合中的序号。

    @Column注解则指向我们集合元素所在的列,可以配置他们列名等。

    总的来说,一旦hibernate发现实体类中有集合类型的属性需要映射,那么就会为集合属性单独映射出一张表,该表至少有两个字段,一个字段依赖于主表的id字段值,在新表中相同该字段值的记录共同组合成为实体类中的集合属性的值,一个字段保存具体的集合元素的值信息。而对于有序集合来说,还应该包含一个字段用于保存每个集合元素在集合中的序号,该序号字段和第一个外键依赖字段组合成新表的联合主键,唯一标识一条记录。

    在hibernate的管理下,当有数据添加进userinfo表的时候,hibernate将拿到该实体类实例的集合属性的值,并连带该实例的id一起插入到新表中。当然,当我们想要获取一个userinfo实例的时候,hibernate也会为我们查询address表,并注入到userinfo实例的集合属性中,默认的注入模式是懒加载。

    接着,我们看Set集合的映射情况。Set是一种无序并不重复的集合。具体的配置如下:

    @Entity

    @Table(name = "userInfo")

    public class UserInfo implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    @ElementCollection(targetClass = String.class)

    @CollectionTable(name = "address",joinColumns = @JoinColumn(name = "user_id",nullable = false))

    @Column(name = "value",nullable = false)

    private Set address;

    //省略getter,setter方法

    }

    相比List,Set由于是无序的,那么自然是没有索引序列,所以无需配置@OrderColumn,但是它要求所有元素必须不可重复,那么通过制定nullable为false即可。

    看看表的生成情况:

    33afac1ecbfe

    这里写图片描述

    对于像set一样的无序集合,新表的主键有user_id和value列联合作为主键,可以保证唯一确定一条数据记录。

    最后,我们看看一下Map的映射情况,先看代码:

    @Entity

    @Table(name = "userInfo")

    public class UserInfo implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    @ElementCollection(targetClass = String.class)

    @MapKeyClass(Integer.class)

    @CollectionTable(name = "address",joinColumns = @JoinColumn(name = "user_id"))

    @Column(name = "value")

    private Map map;

    //省略getter,setter方法

    }

    具体的表生成情况:

    33afac1ecbfe

    这里写图片描述

    对于map这种键值对集合,targetClass 用于指定value值的类型,而@MapKeyClass则用于指定key值的类型,其他的几乎没什么变化,对于map集合映射出来的表,user_id和map的key字段将联合组成此表的主键,唯一确定一条记录。

    对于性能的要求,hibernate不推荐实体类属性使用数组类型,建议优先使用集合类型。

    2、组件属性映射

    所谓的组件类型就是指我们自定义的类类型,在某些情况下,实体类中包含自定类型也是很常见的,那么对于我们自定义的类型该如何来映射到数据表呢?Hibernate的映射策略很简单,对于组件中的每个属性都映射出一个列,也就是相当于把组件给拆解了。例如:

    //首先定义一个组件类

    @Embeddable

    public class Disposition {

    private String mood;

    private String hobby;

    //省略getter,setter方法

    }

    我们定义了一个类,Disposition并使用@Embeddable注解修改该类。当Hibernate对整个类路径进行扫描的时候,就会注册该类为一个组件类型,那么当我们在实体类中引用该类型的时候,hibernate就能找到相应的组件类型。

    @Entity

    @Table(name = "userInfo")

    public class UserInfo implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    private Disposition disposition;

    //省略getter,setter方法

    }

    最后生成的数据表结构如下:

    33afac1ecbfe

    这里写图片描述

    组件类的每个属性都被映射到userinfo表中了。当我们通过实体类实例向数据表中插入数据的时候,hibernate会将组件类实例拆分出来的各个属性插入到对应的表字段。当我们通过数据表获取userinfo实例的时候,hibernate判断userinfo中有一个组件类属性,于是创建组件类实例并装载相应的数据表中的数值赋值给userinfo的组件类型属性。

    3、集合属性为组件类型的表级映射

    集合中的元素除了可以是基本类型,包装类型以外,还可以是组件类型,也就是复合类型。那么对于他们的映射却稍显不同,例如:

    //定义一个复合类型

    @Embeddable

    public class Person {

    private String name;

    private int age;

    private String address;

    //省略getter,setter方法

    }

    @Entity

    @Table(name = "userInfo")

    public class UserInfo implements Serializable {

    @Id

    @GeneratedValue(strategy = GenerationType.IDENTITY)

    private int id;

    private String name;

    @ElementCollection(targetClass = Person.class)

    @CollectionTable(name = "persons",joinColumns = @JoinColumn(name = "user_id"))

    @OrderColumn(name = "list_index")

    private List list;

    //省略getter,setter方法

    }

    显然,在实体类中的集合类型属性的映射,大体上是一样的。首先我们通过targetClass 属性指定集合中的元素类型,通过CollectionTable配置为集合生成的新表的基本信息,通过OrderColumn指定索引列。当然,这里我们不需要使用Column注解配置集合元素本身在数据表中的字段名,因为数据库中没有相对应的类型存储。Hibernate选择将集合中的复合类型拆分成多个字段,其他的和普通的集合属性映射并没有太大变化。

    33afac1ecbfe

    这里写图片描述

    只不过对于普通的集合类型映射来说,图中红色框中内容仅仅是一个字段,而对于复合类型,由于数据库中并没有相对应的类型来存储,所以就需要拆分成基本的字段类型。

    至此,使用注解方法来配置实体类的基本内容已经简单介绍完了,还有很多相对而言并不常用的基于Hibernate自身的注解并没有做介绍,待作者深入使用后再做相关补充,总结不到之处,望指出!

    展开全文
  • 原标题:Java 自定义注解实现ORM对象关系映射一,ORM概念ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系。...

    原标题:Java 自定义注解实现ORM对象关系映射

    一,ORM概念

    ORM即Object Relation Mapping,Object就是对象,Relation就是关系数据库,Mapping映射,就是说Java中的对象和关系数据库中的表存在一种对应关系。

    现在常见的ORM框架比如Hibernate和mybatis,都是采用了ORM的方式,基本原则就是类-表(Table)、属性-列(Column)这样的对应,所以一个对象就能表示数据表中的一行数据啦。

    二,XML实现简单的ORM映射

    使用XML实现简单的ORM映射还是非常直观的,加入有一张用户表结构如下:

    201ed5f104384fff880f591b11b88454.png

    对应的Java类如下:

    package demo;public class User { private String userId; private String userName;}

    那么我们可以使用下面的xml描述对象-关系映射(具体的节点名、属性名都是随意设计的,只是为了说明意思):

    ?xml version=1.0 encoding=UTF-8?!-- orm是所有映射的根节点 --orm !-- 每对映射使用一个mapping节点 -- mapping class=orm.User table=User property name=userId column=user_id/ property name=userName column=user_name/ /mapping/orm

    实际上,有了上面的xml文件,orm.User对象和User表的映射就建立明白了。当ORM框架运作的时候,只需要从xml加载这一个映射关系,就能知道对User对象进行操作时,该对那张表那些列进行操作了。从xml文件中读取数据的方法也有很多,此处不再介绍。

    三,自定义注解

    之前的xml配置文件是描述映射的,这些描述完全可以使用注解来实现,笔者感觉会更加简洁、直接。

    既然是自定义注解,我们首先需要了解哪些是方面是可以自定义的:

    1,可以自定义注解应用的元素。Java注解可以应用于包、类(接口)、方法、属性、构造器等,一般常用的也就类(接口)、方法、属性。

    2,可以自定义注解使用的时机。比如是否编译的时候就把注解的信息丢掉,比如JVM运行时还是保留注解信息。如果运行时保留的话,就可以通过反射读取注解的内容了,所以自定义注解里面保存的ORM映射信息是可以在程序运行时使用的。

    3,是否将注解包含在Javadoc帮助文档里面。

    OK,口说太空洞我们来定义一个最简单注解,该注解的作用非常简单,就是说明类与数据库表的映射关系。自定义类使用的关

    ·

    洱海网 www.erhainews.com 2019-02-20 15:48:46

    本文地址: https://www.erhainews.com/n9436509.html

    注解 映射 ORM 自定义 xml

    展开全文
  • 一.情况开发中某个数据表查询出来的数据中有多个字段为字典码,需要从字典表中取出对应的字典值返回到前端。比如省份ID为01,产品品牌为C000,展示到前端希望是...核心:通过实体类的字典码和注解类型找到对应的字典...

    一.情况

    开发中某个数据表查询出来的数据中有多个字段为字典码,需要从字典表中取出对应的字典值返回到前端。比如省份ID为01,产品品牌为C000,展示到前端希望是对应的省份名称,产品品牌名称。

    数据表如下:

    e0149b94c571?from=singlemessage

    字典表数据样例如下:

    e0149b94c571?from=singlemessage

    二.思考与实现

    字典表记录数据不多,可以考虑使用自定义注解+反射。在实体需要获取值的字段上加自定义注解,通过反射把值注入到对应的字段。

    核心:通过实体类的字典码和注解类型找到对应的字典值,然后注入到对应要注入的字段。

    具体实现:

    1.自定义注解

    e0149b94c571?from=singlemessage

    2.实体类

    public class CustInfo {

    @BaseDataAnnotation(fieldType ="SALES_BRAND", fieldName ="custTypeName")

    private StringcustType;

    @BaseDataAnnotation(fieldType ="PROV_ID", fieldName ="provinceName")

    private StringprovinceCode;

    }

    3.转换工具类

    e0149b94c571?from=singlemessage

    三.总结

    数据表实现了转义功能,但是有可以优化的空间。

    1.可以把字典表数据load到redis,设置失效时间,读取字典数据从redis取,取不到则从数据库load字典数据到redis,避免每次查询从数据库把字典数据放到内存,也可以在准确性要求不是特别高情况下使用。

    2.可以在mybatis拦截器中把数据转换,需要转换的加上拦截器即可,方便调用。

    3.在不考虑系统分库分表情况下,可以使用函数解决。

    展开全文
  • Hibernate框架学习之注解映射实体类  前面的相关文章中,我们已经介绍了使用XML配置文件映射实体类及其各种类型的属性的相关知识。然而不论是时代的潮流还是臃肿繁杂的配置代码告诉我们,注解配置才是更人性化的...
  • 实体间字段映射的优雅写法背景自定义注解与切面自定义注解工具方法实现使用lombok提供的mapping注解 背景 实体之间进行covert操作时,如果使用函数将会出现大量的set、get方法,代码很丑陋。 查阅到两种优化方案。...
  • 将数据库表映射成和表名相同的实体类
  • 以下注解主要功能是用来将实体类和数据库进行映射。这样在建表的时候就不需要写建表语句,直接从实体类注解标注好,表结构就会自动生成在数据库中。 @Entity :可以标注在类上,主要表明该类为实体类。 @Table :...
  • *自定义注解:1.使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口 * 2.格式:public @interface 注解名{定义体} * 3.其中的每一个方法实际上是声明了一个配置参数: * a.方法的名称...
  • java自定义注解背景目标1.Java注解简介1.1 Java注解(Annotation)1.2 Java注解分类1.3 JDK基本注解2.Java元注解2.1 @Retention:定义注解的保留策略2.2 @Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)...
  • 自定义配置文件如下图所示: 要读取配置文件信息有两种方式: 方式一: 通过属性映射,如下图,将配置文件...通过创建实体类获取值,实体类中代码如下: 注意注解的使用 控制类代码如下: 在Postman中进行验证: ...
  • 在SpringBoot环境支持中,通过反射机制获取到实体类的属性列表,判断属性是否是主键,是否该属性不能为空,是否该属性是唯一索引。这需要自己创建自定义注解,IDField、FieldUnique、NotNull等注解。 自定义注解 ...
  • java 自定义注解验证 原理基于java的反射和映射 可自己添加所需要的注解,本案例中只写了三个自定义注解类 本案例只花了半天时间,如有不好之处请多提提意见。谢谢!
  • AOP+自定义注解实现日志管理

    千次阅读 2021-03-17 21:21:17
    需求 : 在Controller获得Service层的方法上加上自定义日志注解,实现日志管理。 一.对应的数据库(日志) : CREATE TABLE `log` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键', `ope_method` varchar(255)...
  • 实体类:entity /domain/model1)使用lombuk插件:pligins->安装lombok插件加了@Data注解的类,编译后会自动给我们加上下列方法:所有属性的get和set方法,注解在类上,为类提供读写属性toString 方法,注解在类...
  • Java 自定义注解 反射 完成数据填充以及入库
  • Java自定义注解Annotation详解

    万次阅读 多人点赞 2017-12-17 17:57:17
    简介开发中经常使用到注解,在项目中也偶尔会见到过自定义注解,今天就来探讨一下这个注解是什么鬼,以及注解的作用和自定义注解。列举开发中常见的注解 @Override:当重写父类的方法时一般都会在方法上标注上此注解...
  • 记录使用JPA入坑之 关于JPA查询返回结果映射自定义实体类报ERROR:argument type mismatch 当你都走到argument type mismatch这一步,说明你离真相已经不远了。 (以下步骤为记录我使用JPA的要点,你可直接跳过看到...
  • springboot读取所有自定义注解

    千次阅读 2020-12-28 16:34:07
    自定义注解 Permission package org.com.rsmall.wx.ann; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang....
  • jackson 其实也可以调用自定义类,但是由于项目中返回值String 统一使用的是fastjson; 一开始并没有注意到,导致使用jackson 一直没有调用成功后面才发现是两个不对应的问题,所以一定要注意 //用户地址实体, 省略了...
  • 通过继承PluginAdapter类,开发自定义插件,生成自定义的中文注解的java实体类,dao接口和mapper映射文件
  • JPA原生sql返回值转自定义实体类

    千次阅读 2019-10-30 17:52:56
    有两个月没更新过CSDN了,裸辞了,半个月前刚入职了新下家,这里适应下新公司的项目技术。...这里就先记录第一个坑,用jpa注解查询完之后发现无法用以往的实体类直接映射接收,百度谷歌无果... 这里实...
  • 使用IDEA项目添加Hibernate扩展,生成实体类并配置实体类中的注解 一、使用Hibernate自动生成实体类 1.在项目上右键,选择Add Framework Support找到 Hibernate勾选 OK 2.Ctrl+Alt+Shift+S 快捷键呼出Project ...
  • 比如 这句话中CapitalFlow是数据库表capital_flow对应的实体类 subAccount也是对应的实体类CapitalFlow中的属性对应的表字段名 自定义sql映射接口实体 实体接口 package com.xx.xx.xx.dto; import java.util.Date; ...
  • 自定义注解映射生成sql

    千次阅读 2016-12-08 22:06:15
    注解是项目中经常用到的技术,常见的有java原生注解,像@overwrite等,还有像spring 中的@RequestMapping()这样的第三方注解,下面说一下自定义注解。理论的我也知之甚少,就不啰嗦,直接贴代码吧。 需求:想实现项...
  • 本文将介绍使用springboot+mybatis拦截器+自定义注解的形式对敏感数据进行存储前拦截加密的详细过程。 一、什么是Mybatis Plugin 在mybatis官方文档中,对于Mybatis plugin的的介绍是这样的: MyBatis 允许你在已...
  • 2. 实体类配置文件(使用配置实体类) 1. 创建配置 application.properties 文件中添加一下内容 # 测试实体类注入 test.name = shadowolf test.domain = www.shadowolf.cn 2. 创建一个实体类 Service...
  • @Transient import javax.persistence.*; … @Transient private List auths;
  • 在Springboot开发过程中我们经常会用到将配置文件中的值映射到属性和实体类,下面我们简单介绍一下基于注解实现。 1、配置文件的值映射到属性 我们以将配置文件的中的值映射到controller的属性为例进行说明,先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,040
精华内容 13,216
关键字:

自定义注解映射实体类