标签:
在使用Java快4年的时间了 是时候应该留下点东西了。今天又在写实体类 pojo 感觉一直在写 一直在使用mybatis的注解 spring的注解 今天就看看源码里面是怎么定义的。 可以关注我的新浪微博 : 疯狂的杨中仁
首先要研究注解 我只记得annotation 以及基本的用法 public @interface ****{}
在网上找了一些资料 看了再上面定义@Documented说明是这个是注解 然后在@Documented这个注解下面 我们看到了
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.ANNOTATION_TYPE) public @interface Documented { }
看基本的意思就是
@Retention(RetentionPolicy.RUNTIME) 就是在上面时候运行
@Target(ElementType.ANNOTATION_TYPE) 这个注解的意思就是 在上面类型上面运行。
那么我们就使用这个原注解上面的3个注解 模仿hibernate写一个
定义一个Table注解 自己的额
首先定义一个数据库类型的枚举
public enum DBEnum { // 定义数据库枚举 2015年5月17日22:41:47 MYSQL, ORACLE, MSSQL, DB2, SYBASE }
接着定义一个Table注解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Table { public String value() default ""; // 使用表的名称 // 定义数据库枚举 public DBEnum type() default DBEnum.MSSQL; // 默认使用mysql数据库 }
在下面定义Column注解
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Column { // 使用数据库的列的名称 public String value() default ""; // 默认使用‘’ }
一张表下面必须要有的还有id 在做保存的时候 必须的 呵呵 下面增加一个ID注解
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ID { // 在列上面使用id注解 说明这个列是id列 在做保存的时候 使用自己增加的策略 2015年5月17日22:44:43 public boolean unique() default false; // 使用唯一的约束 2015年5月17日22:46:43 }
注解定义好了 那么下面 我们是要写一个实体类 也就是pojo
public class User { @ID @Column private int userid; @Column private String username; @Column private String password; @Column private String createtime; @Column private String updatetime; @Column private String telephone; @Column private int status; @Column private String nickname; @Column private int integral; public int getUserid() { return userid; } public void setUserid(int userid) { this.userid = userid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public String getUpdatetime() { return updatetime; } public void setUpdatetime(String updatetime) { this.updatetime = updatetime; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public int getStatus() { return status; } public void setStatus(int status) { this.status = status; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public int getIntegral() { return integral; } public void setIntegral(int integral) { this.integral = integral; } }
记得在上面增加上我们之前定义好的注解
下面我们就可以在下面解析这个注解 直接上代码吧 有什么不懂的可以在下面评论额
public class AplasMain { // 测试方法 2015年5月17日22:32:23 public static void main(String[] args) throws Exception { // 定义一个user类型 反射这个类型下面所有的字段 Map<String, Object> map = new HashMap<String, Object>(); Class<? extends Object> clazz = User.class; map.put("className", clazz.getSimpleName()); map.put("tableName", clazz.getSimpleName()); // 判断 如果类型使用了Table注解 if (clazz.isAnnotationPresent(Table.class)) { Table table = clazz.getAnnotation(Table.class); if (table!=null && !table.value().equals("")) { // 默认值设置的是“” 所以直接判断是否是""就可以 map.put("tableName", table.value()); } } //拿出这个类型下面所有的字段 Field[] fields = clazz.getDeclaredFields(); // 判断下面的字段 List<Map<String, Object>> mapList = new ArrayList<Map<String,Object>>(); for (Field field : fields) { Map<String, Object> fieldMap = new HashMap<String, Object>(); fieldMap.put("property", field.getName()); fieldMap.put("column", field.getName()); fieldMap.put("unique", false); // 判断是否使用了column注解 if (field.isAnnotationPresent(Column.class)) { Column column = field.getAnnotation(Column.class); if (column!=null && !column.value().equals("")) { fieldMap.put("column", column.value()); } } // 判断是否使用id注解 if (field.isAnnotationPresent(ID.class)) { ID id = field.getAnnotation(ID.class); if (id!=null && !id.unique()) { fieldMap.put("unique", true); } } // 最后把这个放在list下面 mapList.add(fieldMap); } map.put("list", mapList); // 打印成json的 看下结果 System.out.println(JSONArray.fromObject(map)); } }
最后看一下输出的结果
[ { "tableName": "User", "list": [ { "unique": true, "column": "userid", "property": "userid" }, { "unique": false, "column": "username", "property": "username" }, { "unique": false, "column": "password", "property": "password" }, { "unique": false, "column": "createtime", "property": "createtime" }, { "unique": false, "column": "updatetime", "property": "updatetime" }, { "unique": false, "column": "telephone", "property": "telephone" }, { "unique": false, "column": "status", "property": "status" }, { "unique": false, "column": "nickname", "property": "nickname" }, { "unique": false, "column": "integral", "property": "integral" } ], "className": "User" } ]
是我们想要的结果 说明解析出来是对的。
下面一篇文章讲讲解annotation的原理。谢谢关注
标签:
原文地址:http://my.oschina.net/superman158/blog/416020