需求:

1、表:用户ID,用户名,年龄,邮箱。

2、实现方法,传入实体,打印sql。

实现:

1、表:

package Annotation;
@Table("user")
public class User {
@Column("id")
public int UserId;
@Column("user_name")
public String Username;
@Column("age")
public int Age;
@Column("e_mail")
public String Email; public int getUserId() {
return UserId;
}
public void setUserId(int userId) {
UserId = userId;
}
public String getUsername() {
return Username;
}
public void setUsername(String username) {
Username = username;
}
public int getAge() {
return Age;
}
public void setAge(int age) {
Age = age;
}
public String getEmail() {
return Email;
}
public void setEmail(String email) {
Email = email;
}
}

2、注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
public String value();
} @Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
public String value();
}

3、调用

    public class QueryUser {

public static void main(String[] args) {
User u = new User();
u.setAge(18);
u.setEmail("123@123.com,234@132.com");
u.setUsername("amy"); String sql = getQuerySql(u);
System.out.println(sql);
} private static String getQuerySql(Object o) {
StringBuilder sb = new StringBuilder();
// 1、获取类
Class<? extends Object> c = o.getClass(); // 2、获取表名
String tableName = "";
if (c.isAnnotationPresent(Table.class)) {
Table t = (Table) c.getAnnotation(Table.class);
tableName = t.value();
}
if (tableName == "") {
return "no table name";
}
sb.append("select * from ").append(tableName).append(" where 1=1 "); // 3、获取字段名、字段值、拼装where条件
Field[] fs = c.getFields();
for (Field field : fs) { // 3.1获取字段名称
String fieldName = field.getName(); // 3.2用字段名称获取get方法
String getMethodName = "get" + fieldName;
Method getMethod = null;
try {
getMethod = c.getMethod(getMethodName);
} catch (Exception e) {
System.out.println(e.toString());
}
if (getMethod == null) {
return "no method";
} // 3.3用get方法获取字段值,当有值时才拼装
Object fieldValue = null;
try {
fieldValue = getMethod.invoke(o);
} catch (Exception e) {
System.out.println(e.toString());
}
//无值跳过
if(fieldValue==null ||
(fieldValue instanceof Integer && (Integer)fieldValue==0)){
continue;
} //3.4 有值时获取表字段名
String columnName = "";
if(field.isAnnotationPresent(Column.class)){
Column co = field.getAnnotation(Column.class);
columnName=co.value();
}
if(columnName==""){
return "no column name";
} // 3.5获取字段类型根据类型进行语句处理
Class<?> fieldType = field.getType();
// string类型,有,分割,需要in
if (fieldType.toString().toLowerCase().contains("string")
&& fieldValue.toString().contains(",")) {
String[] values = fieldValue.toString().split(",");
sb.append("and ").append(columnName).append(" in (");
for (String v : values) {
sb.append("'").append(v).append("' ,");
}
// 删掉最后一个逗号
sb.deleteCharAt(sb.length() - 1);
sb.append(") \n");
} else if (fieldType.toString().toLowerCase().contains("string")) {
sb.append("and ").append(columnName).append(" = '")
.append(fieldValue).append("' \n");
} else {
sb.append("and ").append(columnName).append(" = ")
.append(fieldValue.toString()).append("\n");
}
} return sb.toString();
}
}

Java注解【五、注解实战】的更多相关文章

  1. JAVA提高五:注解Annotation

    今天我们学习JDK5.0中一个非常重要的特性,叫做注解.是现在非常流行的一种方式,可以说因为配置XML 比较麻烦或者比容易查找出错误,现在越来越多的框架开始支持注解方式,比如注明的Spring 框架, ...

  2. JavaSE学习总结(十五)—— Java反射与注解

    一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...

  3. Java编程思想学习(十五) 注解

    注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式.使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Ann ...

  4. Java的自定义注解使用实例

    概念 Java有五个元注解,自动继承java.lang.annotation.Annotation. 什么是元注解,可以理解为其他普通注解进行解释说明 @Target  该注解的使用范围,限定应用场景 ...

  5. Java语法之注解

    注解其实在其他语言也有,只是叫法不一样,在C#中叫特性,其实都是一个意思.今天就是了解下Java的注解. 一.什么是注解 我们先看官方解释:它提供了一种安全的类似注释的机制,用来将任何的信息或元数据( ...

  6. Java中的注解基础

    一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...

  7. Scala学习十五——注解

    一.本章要点 可以为类.方法.字段.局部变量.参数.表达式.类型参数以及各种类型定义添加注解 对于表达式和类型,注解跟在被注解的条目之后 注解的形式有@Annotation.@Annotation(v ...

  8. [转帖]Java高级系列——注解(Annotations)

    Java高级系列——注解(Annotations) 2018年01月13日 :: RonTech 阅读数 3405更多 所属专栏: Java高级系列文章 版权声明:转载请注明出处,谢谢配合. http ...

  9. Java学习之==>注解

    一.概述 关于注解,首先引入官方文档的一句话:Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.接下我将从注解的定义. ...

  10. 【java】细说 JAVA中 标注 注解(annotation)

    Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...

随机推荐

  1. FreeMarker学习2

    为了处理缺失变量,FreeMarker提供了两个运算符: 用于防止对象不存在而导致的异常 !:指定缺失变量的默认值 ??:判断某个变量是否存在,返回boolean值 ${item.createtime ...

  2. oc 执行shell 脚本

    -(id) InvokingShellScriptAtPath :(NSString*) shellScriptPath { NSTask *shellTask = [[NSTask alloc]in ...

  3. Pycharm 编辑器快捷键

    必备技能:IDEA一定要懂的32条快捷键 这些IntelliJ IDEA键盘快捷键可以让你专注于编写代码,让你的双手在键盘上起舞. 1,搜索文件名: ↑   Shift 快速连续按两下 2,显示便捷提 ...

  4. 【转】ffluos编译

    FluffOS是在MUDOS基础上更新完成的.进行了许多新功能和bug修复. 针对LPC有很好的兼容性,如果你的MUD运行MUDOS V22+版本,可以很容易运行在fluffos上. 系统环境: Cn ...

  5. 使用 DrMemory 详细教程

    Dr Memory 简介 Dr. Memory 是一个开源免费的内存检测工具,它能够及时发现内存相关的编程错误,比如未初始化访问.内存非法访问以及内存泄露等.它不仅能够在 Linux 下面工作,也能在 ...

  6. Postman的安装和升级

    安装postman Postman本地应用程序 Postman可以作为Mac,Windows和Linux操作系统的本地应用程序. 要安装Postman,请转到应用界面,并根据你的平台点击Mac/Win ...

  7. Cowpatty 破解WPA-PSK加密

    一:使用wireshark 嗅探类工具打开之前抓的cpp中包含WPA握手的cap 文件,使用语法  eapol 进行过滤,可以看到抓取的Key数据 将其另存为保存到一个目录下. 二:而后就使用Cowp ...

  8. Java 基础篇之泛型

    背景 在没有泛型前,一旦把一个对象丢进集合中,集合就会忘记对象的类型,把所有的对象都当成 Object 类型处理.当程序从集合中取出对象后,就需要进行强制类型转换,这种转换很容易引起 ClassCas ...

  9. 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口

    JNI的替代者-使用JNA访问Java外部功能接口 1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言( ...

  10. ES6中Set和Map

    1.Set 实例的创建 Set实例它类似于数组,但是成员的值都是唯一的,没有重复的值. Set本身是一个构造函数用来生成Set数据结构. Set 函数可以接受一个数组(或者具有 iterable 接口 ...