ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 注解Annotation 特别在系统框架的搭建过程中,往往需要很多的配置文件,比如数据源、IOC、AOP、框架本身的映射(如 Hibernate 表与字段),需要的配置文件会导致系统越来越复杂,而且维护很不方便,一旦配置文件出错,很容易导致系统无法运行。 在 JDK1.5 以后,引入了注解 Annotation 技术,极大的方便了配置化的编程,很多的技术和框架都使用了技术,如 Servlet/Filter/Spring/SpringMVC/Hibernate/Nutz。 ## 定义 ~~~ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD, ElementType.METHOD}) @Documented public @interface Column { String name() default ""; } @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented public @interface Table { String value(); } ~~~ ## 应用 ~~~ package com.dodoke.annotation; @Table("T_SYS_ACCOUNT") public class Account { @Column(name = "ID1") private Integer id; @Column private String name; @Column(name = "PASSWOR1") private String password; private String desc; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } } ~~~ ## 解析注解数据 ~~~ package com.dodoke.annotation; import java.lang.reflect.Field; import java.lang.reflect.Method; public class Client { public static void main(String[] args) throws Exception { Account account = new Account(); account.setName("Tom"); account.setPassword("123456"); System.out.println(gerInsertSql(account)); // INSERT INTO t_sys_account(NAME1,PASSWORD1) values("Tom", "123456"); } public static String gerInsertSql(Object account) throws Exception { String sql = "INSERT INTO "; // 账号account对应Class对象 Class<?> c = null; c = account.getClass(); // 获取表格名称 Table table = c.getAnnotation(Table.class); String tableName = table.value(); sql += tableName + "("; String fs = ""; String vs = ""; Field[] fields = c.getDeclaredFields(); for (Field field : fields) { // 获取表中字段名 Column column = field.getAnnotation(Column.class); // 获取类中属性名 String columnName = field.getName(); if (null != column) { String cn = column.name(); // 如果name属性值为空,则取字段名 if (null != cn && !cn.trim().equals("")) { columnName = cn; } String methodName = "get" + upperFirst(field.getName()); Method getMethod = c.getMethod(methodName); String v = (String) getMethod.invoke(account); if (null != v) { fs += columnName + ","; vs += "'" + v + "',"; } } } if (!fs.isEmpty()) { fs = fs.substring(0, fs.length() - 1); } if (!vs.isEmpty()) { vs = vs.substring(0, vs.length() - 1); } sql += fs + ") VALUES(" + vs + ");"; return sql; } private static String upperFirst(String str) { if (null != str && str.length() > 0) { return str.substring(0, 1).toUpperCase() + str.substring(1); } return ""; } } ~~~