annotation使用示例
annotation使用示例
学习了:https://www.imooc.com/learn/456
Annotation编写规则:@Target,@Retention,设置一些String、int属性;@Inherited只能继承类的;只有一个属性只能叫value;
使用的时候使用反射机制,annotation中的方法就是在反射的时候取值的方法;
代码:
Annotation Column:
package com.imooc.test; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Column {
String value();
}
Annotation Table:
package com.imooc.test; import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Table {
String value();
}
Filter:
package com.imooc.test; @Table("user")
public class Filter { @Column("id")
private int id;
@Column("user_name")
private String userName;
@Column("nick_name")
private String nickName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUserName() {
return userName;
} public void setUserName(String userName) {
this.userName = userName;
} public String getNickName() {
return nickName;
} public void setNickName(String nickName) {
this.nickName = nickName;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public String getMobile() {
return mobile;
} public void setMobile(String mobile) {
this.mobile = mobile;
} }
Filter2:
package com.imooc.test; @Table("department")
public class Filter2 { @Column("id")
private int id;
@Column("name")
private String name;
@Column("leader")
private String leader;
@Column("amount")
private int amount;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLeader() {
return leader;
}
public void setLeader(String leader) {
this.leader = leader;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
} }
Test:
package com.imooc.test; import java.lang.reflect.Field;
import java.lang.reflect.Method; public class Test { public static void main(String[] args) {
Filter f1 = new Filter();
f1.setId(10); // 表示查询id为10的用户 Filter f2 = new Filter();
f2.setUserName("lucy"); // 表示查询用户名为lucy的用户
f2.setAge(18); Filter f3 = new Filter();
f3.setEmail("liu@sina.com.cn"); // 查询邮箱为其中任意一个的用户 ,zh@163.com,77777@qq.com String sql1 = query(f1);
String sql2 = query(f2);
String sql3 = query(f3); System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3); Filter2 filter2 = new Filter2();
filter2.setAmount(10);
filter2.setName("技术部");
System.out.println(query(filter2)); } private static String query(Object f) {
StringBuilder builder = new StringBuilder();
// 1, 获取到class
Class c = f.getClass();
// 2, 获取到table的名字
boolean exists = c.isAnnotationPresent(Table.class);
if(!exists) {
return null;
}
Table t = (Table) c.getAnnotation(Table.class);
String tableName = t.value();
builder.append("select * from ").append(tableName).append(" where 1=1");
// 3, 遍历所有的字段
Field[] fArray = c.getDeclaredFields();
for (Field field : fArray) {
// 4. 处理每个字段对应的sql
// 4.1 拿到字段名
boolean fExists = field.isAnnotationPresent(Column.class);
if(!fExists) {
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
// 4.2 拿到字段的值
String fieldName = field.getName();
String getMethodName = "get"+ fieldName.substring(0, 1).toUpperCase()+fieldName.substring(1);
Method getMethod;
Object fieldValue=null;
try {
getMethod = c.getMethod(getMethodName);
fieldValue = getMethod.invoke(f);
} catch (Exception e) {
e.printStackTrace();
}
// 4.3 拼装sql
if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)) {
continue;
}
builder.append(" add ").append(fieldName);
if(fieldValue instanceof String) {
if(((String)fieldValue).contains(",")) {
String[] values = ((String)fieldValue).split(",");
builder.append("in(");
for (String v : values) {
builder.append("'").append(v).append("',");
}
builder.deleteCharAt(builder.length()-1);
builder.append(")");
}else {
builder.append("=").append("'").append(fieldValue).append("'");
}
} else if (fieldValue instanceof Integer) {
builder.append("=").append(fieldValue);
}
}
return builder.toString();
}
}
annotation使用示例的更多相关文章
- Java 基础之认识 Annotation
Java 基础之认识 Annotation 从 JDK 1.5 版本开始,Java 语言提供了通用的 Annotation 功能,允许开发者定义和使用自己的 Annotation 类型.Annotat ...
- Java注解(Annotation)详解
转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...
- 合理使用Android提供的Annotation来提高代码的质量
概述 Java语言提供了Annotation的机制,让描述性的元数据能够和代码共存.通常我们可以利用Annotation,来做一些标志性的说明.然而Annotation必须和相应的解析工具一起才能工作 ...
- java注解(转并做修改)
本文由 ImportNew - 人晓 翻译自 idlebrains.欢迎加入翻译小组.转载请见文末要求. 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也 ...
- Java注解的原理
自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Override,@Deprecated这样的注解.这篇文章中,我将向大家讲述 ...
- java ee7 配置文件
java ee7 配置文件 1. 项目目录 # ee pom.xml Maven构建文件 /src/main/java Java源文件 /src/main/resource ...
- org.Hs.eg.db包简介(转换NCBI、ensemble等数据库中基因ID,symbol等之间的转换)
1)安装载入 ------------------------------------------- if("org.Hs.eg.db" %in% rownames(install ...
- java websocket @ServerEndpoint注解说明
http://www.blogjava.net/qbna350816/archive/2016/07/24/431302.html https://segmentfault.com/q/1010000 ...
- javax.persistence.EntityNotFoundException: Unable to find报错
这类错id 可能是10,可能是27,也可能是其他数字 错误描述: javax.persistence.EntityNotFoundException: Unable to find 某个类 with ...
随机推荐
- 继上次编译openwrt之后,添加web界面
上编博客写了关于openwrt编译环境和编译一个默认配置的openwrt系统. 现在我正在做如何添加web界面.(hiwooya自带的luci web) 方法如下: 首先在编译环境中配置 make m ...
- 在已编译安装nginx上动态添加模块
一.添加nginx模块 找到安装nginx的源码根目录,如果没有的话下载新的源码 wget http://nginx.org/download/nginx-1.8.1.tar.gz 查看ngixn版本 ...
- [译]The Python Tutorial#9. Classes
写在前面 本篇文章是<The Python Tutorial>(3.6.1),第九章,类的译文. 9. Classes 与其他编程语言相比,Python的类机制定义类时,最小化了新的语法和 ...
- (转)去除背景色的方法,适合iOS5/6/7/8.0beta
通常使用UISearchbar都需要去除其背景色来与自己的界面风格保持协调,但是UISearchbar的设计随着iOS版本的升级不断地在发生着变化,下面我们通过分析UISearchbar在各个iOS版 ...
- (转)自定义UITabBar
push页面时,可调用hidesBottomBarWhenPushed进行隐藏. 第一步,我们需要一些图片: 各个选项的图标和tabbar的背景图片,最后还要一个透明的1x1像素的图片. 第二步,新建 ...
- Spring中线程池的使用
<bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent ...
- cf950f Curfew
神贪心--写了一个晚上加一个早上. 先考虑只有一个宿管的情况. 首先,如果这个宿舍人多了,多余的人就跑到下一个宿舍.(如果这是最后一个宿舍的话,多的就躺床底下) 如果这个宿舍人少了,但是能从别的宿舍调 ...
- angular-websocket.js 使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Webstrom卡顿问题解决
1.设置node_modules 打开项目,新建node_modules空文件夹,然后右击选择Mark Directory as,选择Excluded. 2.设置ingore文件 files-> ...
- NYOJ 293 Sticks
Sticks 时间限制:3000 ms | 内存限制:65535 KB 难度:5 描述 George took sticks of the same length and cut them r ...