如何调整wordpress页面的顺序,seo优化服务是什么,怎样申请做c c 网站,Wordpress页面添加小工具注解和反射写dao1. 注解的使用2. 使用注解体现映射关系针对上一篇文章#xff0c;使用xml映射文件和反射实现dao#xff0c;提出了扩展功能#xff0c;利用注解来体现实体类和表的映射关系本文是上一篇文章的扩展使用反射和xml实现dao
1. 注解的使用
什么是注解#xff1…
注解和反射写dao1. 注解的使用2. 使用注解体现映射关系针对上一篇文章使用xml映射文件和反射实现dao提出了扩展功能利用注解来体现实体类和表的映射关系本文是上一篇文章的扩展使用反射和xml实现dao
1. 注解的使用
什么是注解 Overridepublic String toString() {return super.toString();}Override 就是一个注解表示此方法是重写了父类的方法此外还有许多Java里面的内置注解元注解(Retention, ElementTypeDocumentedInherited)常用的两个元注解 (Retention, ElementType)
//定义注解在代码中的保留策略
Retention(RetentionPolicy.RUNTIME)
//RetentionPolicy.RUNTIME 当前注解存在于源代码和编译后的class文件中,并加载到jvm中,可以在运行时获取
//RetentionPolicy.CLASS 当前注解存在于源代码和编译后的class文件中,但不会加载到jvm虚拟机
//RetentionPolicy.SOURCE 当前注解只存在于源代码中,不会编译到class文件中,也不会加载到jvm虚拟机
Target(ElementType.TYPE) //指定当前注解能够用在什么地方
//ElementType.ANNOTATION_TYPE 当前注解可以使用在其他注解上
//ElementType.CONSTRUCTOR 当前注解可以用在构造函数上
//ElementType.FIELD 当前注解可以用在全局变量上
//ElementType.LOCAL_VARIABLE 当前注解可以用在局部变量上
//ElementType.METHOD 当前注解可以用在方法上
//ElementType.PACKAGE 当前注解可以用在包上
//ElementType.PARAMETER 当前注解可以用在参数上
//ElementType.TYPE 当前注解可以用在类型上自定义注解
package com.lovely.test;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Retention(RetentionPolicy.RUNTIME)
Target({ElementType.FIELD, ElementType.TYPE}) // 此注解只可用于属性 类型接口类...
public interface MyAnnotation {// 默认值// String name() default default value: 123;String name();
}
2. 使用注解体现映射关系
表注解实体主键属性注解实体类其它属性注解
package com.lovely.base;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;Retention(RetentionPolicy.RUNTIME) // 运行时jvm可取到值
Target(ElementType.TYPE) // 用来描述类
public interface Table {String name(); // 定义属性
}
package com.lovely.base;Retention(RetentionPolicy.RUNTIME)
Target(ElementType.FIELD) // 用来描述属性的注解
public interface Id {String idName();String idColumn();String seqName();
}
package com.lovely.base;Retention(RetentionPolicy.RUNTIME)
Target(ElementType.FIELD)
public interface Column {String columnName();
}
以实体类goods为例
package com.lovely.entity;import java.sql.Date;import com.lovely.base.Column;
import com.lovely.base.Id;
import com.lovely.base.Table;/*** * author echo lovely* * 注解的缺点 修改代码 要改变对应的列名**/
Table(namegoods_info) // 表的信息可以反射得到
public class Goods {Id(idNamegid, idColumngoods_id, seqNamegoods_seq)private Integer gid;Column(columnNamegoods_name)private String gname;Column(columnNamegoods_price)private Double gprice;Column(columnNamegoods_date)private Date gdate;Column(columnNamegoods_factory)private String gfactory;// 为减少代码/我去掉了set/get/构造BaseDao里面增加了 注解加载映射数据
public static HashMapString, MapperData map new HashMapString, MapperData();static {// 利用注解解析 实体类和表的映射关系try {// 通过BaseDao 类的信息 拿到entity里面的所有类Class? baseDaoClass Class.forName(com.lovely.dao.BaseDao);String filePath baseDaoClass.getResource(/com/lovely/entity/).getFile();// System.out.println(filePath);File dir new File(filePath);// 拿到所有类文件File[] files dir.listFiles();for (File file : files) {// 类的全路径String className com.lovely.entity. file.getName().substring(0, file.getName().indexOf(.));Class? entityClass Class.forName(className);// 注解类型Table table entityClass.getAnnotation(Table.class);// 实体类有注解 就可配置映射关系if (table ! null) {MapperData mapperData new MapperData();mapperData.setClassName(className);// 设置表名mapperData.setTableName(table.name());Field[] fields entityClass.getDeclaredFields();for (int i 0; i fields.length; i) {// id的注解Id id fields[i].getAnnotation(Id.class);// System.out.println(id);if (id ! null) {MapperId mapperId new MapperId();mapperId.setIdName(id.idName());mapperId.setIdColumn(id.idColumn());mapperId.setSeqName(id.seqName());// 设置 主键映射关系到映射类mapperData.setMapperId(mapperId);}// 得到每个列的注解Column column fields[i].getAnnotation(Column.class);if (column ! null) {mapperData.getProperties().put(fields[i].getName(), column.columnName());} }map.put(className, mapperData);}}} catch (Exception e) {e.printStackTrace();}}
// 有了注解加载映射数据就不要添加xml映射数据了。