一、什么是注解
注解是jdk5.0引入的新技术!
注解(Annotation):java中对某一程序片段注释说明、这个注释说明能被其它程序读到并执行相应操作!
二、注解的作用
1、能对于程序做出解释,并且能被其它相应程序读取并且执行相应操作!
三、注解格式
@注释名 可以添加一些参数值、例如:@SuppressWarnings(value="unchecked")
四、注解的应用范围
package、class、method、field等上面。通过反射机制来访问。
五、常用的内置注解
1、@Override:标记的方法是重写了父类的方法
2、@Deprecated:标记的方法是表示遗弃、废弃,不建议人们以后去使用,但是能使用
3、@SuppressWarnings:用来抑制编译时的警告信息
3.1@SuppressWarnings(value={"unchecked","deprecation"})
六、自定义注解
使用@interface自定义注解时,自动继承了java.lang.annotation.Annotation接口
@interface用来声明一哥注解 格式: public @interface 注解名{定义体}
自定义注解时,我们一般在在自定义注解前面加元注解(作用:负责注解其它注解)java定义了4个标准的meta_annotation类型,他们被用来提供对其它annotation类型说明,详见java.lang.annotation包(@Target、@Retention、@Document、@Inherited)
@Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)
@Retention
七、综合所学写一个小测试
该测试可以帮助大家理解ORM框架映射,因为这个是用注解写的一个关于实体类到数据库表的简单映射
7.1 我们写两个注解、一个注解用来指定实体类映射到数据库中的表的名称,另一个用来指定该实体类中所有字段映射到数据库表的详细信息(包括字段名、字段类型、字段长度)
1 package edu.aeon.annotation; 2 3 import static java.lang.annotation.ElementType.TYPE; 4 import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 6 import java.lang.annotation.Retention; 7 import java.lang.annotation.Target; 8 9 @Retention(RUNTIME) 10 @Target(TYPE) 11 /** 12 * @author lzj 13 * @create 2017年11月23日 下午1:13:53 14 * @describe 用来指定注解所对应类映射到数据库中的表名称 15 */ 16 public @interface CreateTable { 17 String tableName(); 18 }
1 package edu.aeon.annotation; 2 3 import static java.lang.annotation.ElementType.FIELD; 4 import static java.lang.annotation.RetentionPolicy.RUNTIME; 5 6 import java.lang.annotation.Retention; 7 import java.lang.annotation.Target; 8 9 @Retention(RUNTIME) 10 @Target(FIELD) 11 /** 12 * @author lzj 13 * @create 2017年11月23日 下午1:17:58 14 * @describe 用于注解实体类中属性到数据库的映射关系 15 */ 16 public @interface AeonField { 17 //指定列名 18 String ColumnName(); 19 //指定列类型 20 String ColumnType(); 21 //指定该列大小长度 22 int ColumnLength(); 23 }
7.2接下来我们简单定义一个实体类、该实体类采用我们刚才定义的两个注解
1 package edu.aeon.entity; 2 3 import edu.aeon.annotation.CreateTable; 4 import edu.aeon.annotation.AeonField; 5 6 /** 7 * @author lzj 8 * @create 2017年11月23日 下午1:14:51 9 * @describe 简单定义一个实体类 10 */ 11 @CreateTable(tableName="t_user") 12 public class T_User { 13 @AeonField(ColumnName="UserId",ColumnType="int", ColumnLength = 10) 14 private int uId; 15 @AeonField(ColumnName="UserName",ColumnType="varchar", ColumnLength = 16) 16 private String uName; 17 @AeonField(ColumnName="UserAge",ColumnType="int", ColumnLength = 3) 18 private int uAge; 19 public int getuId() { 20 return uId; 21 } 22 public void setuId(int uId) { 23 this.uId = uId; 24 } 25 public String getuName() { 26 return uName; 27 } 28 public void setuName(String uName) { 29 this.uName = uName; 30 } 31 public int getuAge() { 32 return uAge; 33 } 34 public void setuAge(int uAge) { 35 this.uAge = uAge; 36 } 37 }
7.3写一个注解的解析小程序
1 package edu.aeon.annotation.test; 2 3 import java.lang.annotation.Annotation; 4 import java.lang.reflect.Field; 5 6 import edu.aeon.annotation.AeonField; 7 import edu.aeon.annotation.CreateTable; 8 import edu.aeon.entity.T_User; 9 10 /** 11 * @author lzj 12 * @create 2017年11月23日 下午1:21:38 13 * @describe 解析注解类信息 14 */ 15 public class AnnotationTest { 16 17 /** 18 * at 2017年11月23日 下午1:21:38 by lzj 19 * @throws SecurityException 20 * @throws NoSuchFieldException 21 * @Parameters1 22 * @Returns void 23 */ 24 public static void main(String[] args) throws NoSuchFieldException, SecurityException{ 25 Class clazz = null; 26 try { 27 clazz = Class.forName("edu.aeon.entity.T_User"); 28 } catch (ClassNotFoundException e) { 29 e.printStackTrace(); 30 } 31 /** 32 * 获得edu.aeon.entity.T_User类的所有注解信息 33 */ 34 Annotation an1[]=clazz.getAnnotations(); 35 for(Annotation a:an1) { 36 System.out.println(a); 37 } 38 /** 39 * 获得指定(注解)类的指定注解信息 40 */ 41 CreateTable an2=(CreateTable) clazz.getAnnotation(CreateTable.class); 42 System.out.println("表名:"+an2.tableName()); 43 /** 44 * 获得指定属性的注解信息 45 */ 46 StringBuffer sb=new StringBuffer("create table "); 47 sb.append(an2.tableName()).append(" ( "); 48 /*//获得uName这个属性 49 Field field=clazz.getDeclaredField("uName");*/ 50 Field [] field1=clazz.getDeclaredFields(); 51 for (Field f : field1) { 52 AeonField af=f.getAnnotation(AeonField.class); 53 sb.append(af.ColumnName()).append(" ").append(af.ColumnType()).append("(").append(af.ColumnLength()).append("),"); 54 //System.out.println(af.ColumnName()+" "+af.ColumnType()+" "+af.ColumnLength()); 55 } 56 //这里拼接sql方式很多,可以采取截取、也可以采取将最后一个逗号替换成右括号 57 String sql=sb.substring(0, sb.lastIndexOf(","))+")"; 58 System.out.println(sql); 59 /*//获得uName这个属性所对应的注解(所有信息数据) 60 AeonField aField=field.getAnnotation(AeonField.class); 61 //打印uName属性所对应的注解的详细信息 62 System.out.println("uName属性信息:"+aField.ColumnName()+"---"+aField.ColumnType()+"---"+aField.ColumnLength()); 63 */ 64 /** 65 * 那么这样我们可以通过获得的表名、表字段及属性来拼接出sql、然后用JDBC执行该sql,去创建表 66 * JDBC执行sql比较简单,格式也比较固定,所以此处省略! 67 */ 68 69 } 70 71 }
7.4控制台输出截图附上:
将生成的sql拿到数据库执行:
到这里我们简单解析出了这个实体类映射到数据库中的对应信息,那么接下来用JDBC去执行这条解析出来的sql语句即可,因为JDBC执行sql的格式比较固定,且比较简单且由于时间原因此处不一一写出来了!