</pre><pre class="html" name="code">1. 什么是注解
语法:@注解名称
注解的作用:替代xml配置文件!
servlet3.0中,就可以不再使用web.xml文件,而是所有配置都使用注解!
注解是由框架来读取使用的!
2. 注解的使用
* 定义注解类:框架的工作
* 使用注解:我们的工作
* 读取注解(反射):框架的工作
3. 定义注解类
class A {}
interface A{}
enum A{}
@interface A{}//天下所有的注解都是Annotation的子类!
4. 使用注解
注解的作用目标:
* 类
* 方法
* 构造器
* 参数
* 局部变量
* 包
5. 注解的属性
* 定义属性:
> 格式:
@interface MyAnno1 {
int age();
String name();
}
* 使用注解时给属性赋值
> @MyAnno1(age=100, name="zhangSan")
* 注解属性的默认值:在定义注解时,可以给注解指定默认值!
> int age() default 100;
> 在使用注解时,可以不给带有默认值的属性赋值!
* 名为value的属性的特权
> 当使用注解时,如果只给名为value的属性赋值时,可以省略“value=”,例如: @MyAnno1(value="hello"),可以书写成 @MyAnno1("hello")
* 注解属性的类型
> 8种基本类型
> String
> Enum
> Class
> 注解类型
> 以上类型的一维数组类型
当给数组类型的属性赋值时,若数组元素的个数为1时,可以省略大括号
@MyAnno1(
a=100,
b="hello",
c=MyEnum1.A,
d=String.class,
e=@MyAnno2(aa=200, bb="world"),
f=100
)
public class Demo3 {
}
@interface MyAnno1 {
int a();
String b();
MyEnum1 c();
Class d();
MyAnno2 e();
int[] f();
}
6. 注解的作用目标限定以及保存策略限定
6.1 让一个注解,它的作用目标只能在类上,不能在方法上,这就叫作用目标的限定!
* 在定义注解时,给注解添加注解,这个注解是@Target
@Target(value={ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@interface MyAnno1 {
}
6.2 保留策略
* 源代码文件(SOURCE):注解只在源代码中存在,当编译时就被忽略了
* 字节码文件(CLASS):注解在源代码中存在,然后编译时会把注解信息放到了class文件,但JVM在加载类时,会忽略注解!
* JVM中(RUNTIME):注解在源代码、字节码文件中存在,并且在JVM加载类时,会把注解加载到JVM内存中(它是唯一可反射注解!)
限定注解的保留策略
@Retention(RetentionPolicy.RUNTIME)
@interface MyAnno1 {
}
7. 读取注解(反射)
========================
模拟注解的使用场景
利用注解配置一对多,多对多关系。
1.为各个实体写好注解关联关系。
Department.java
@Entity
@Table(name="department")
public class Department {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="did")
private int did;
@Column(name="dname")
private String dname;
@Column(name="loc")
private String loc;
@OneToMany(mappedBy="dep",cascade={CascadeType.ALL})
private Set<Employee> emps=new HashSet<Employee>();
}
Employee.java
@Entity
@Table(name="employee")
public class Employee {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="eid")
private int eid;
@Column(name="ename")
private String ename;
@Column(name="job")
private String job;
@ManyToOne -----一对多关联关系
@JoinColumn(name="did")
private Department dep;
-------多对多关联关系
@ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
@JoinTable(name="rational",
joinColumns={@JoinColumn(name="eid",referencedColumnName="eid")},
inverseJoinColumns={@JoinColumn(name="proid",referencedColumnName="proid")}
)
private Set<Project> pros=new HashSet<Project>();
Project.java
@Entity
@Table(name="project")
public class Project {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="proid")
private int proid;
@Column(name="proname")
private String pname;
@Column(name="start_time")
private Date strat_time;
/*
* @ManyToMany(cascade=CascadeType.PERSIST,fetch=FetchType.LAZY)
@JoinTable(name="rational",
joinColumns={@JoinColumn(name="proid",referencedColumnName="proid")},
inverseJoinColumns={@JoinColumn(name="eid",referencedColumnName="eid")}
)*/
@ManyToMany(mappedBy="pros")
private Set<Employee> emps=new HashSet<Employee>();
2.在核心配置文件中加入映射文件。
<mapping class="org.ecjtu.entity.Employee"/>
<mapping class="org.ecjtu.entity.Department"/>
<mapping class="org.ecjtu.entity.Project"/>
注解
最新推荐文章于 2023-09-07 14:01:01 发布