需求:

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. RDD的cache 与 checkpoint 的区别

    问题:cache 与 checkpoint 的区别? 关于这个问题,Tathagata Das 有一段回答: There is a significant difference between cac ...

  2. Swift 3.0 Date的简单使用

    // // ViewController.swift // Date的使用 // // Created by 思 彭 on 16/9/20. // Copyright © 2016年 思 彭. All ...

  3. 重置node节点

    删除node节点 删除通过csr请求后产生的所有文件和证书 [root@lab1 ~]# rm -rf /etc/kubernetes/kubelet.conf [root@lab1 ~]# rm - ...

  4. hadoop第一个程序WordCount

    hadoop第一个程序WordCount package test; import org.apache.hadoop.mapreduce.Job; import java.io.IOExceptio ...

  5. 【AMAD】django-social-auth -- 让django使用社交网络oauth鉴权变得极为轻松!

    简介 个人评分 简介 django-social-auth1集成的Oauth API包括: Google OpenID Google Oauth Google Oauth2 Yahoo OpenID ...

  6. Ingreslock后门漏洞

    一.简介 1524端口 ingreslock Ingres 数据库管理系统(DBMS)锁定服务 利用telnet命令连接目标主机的1524端口,直接获取root权限. Ingreslock后门程序监听 ...

  7. ubuntu下不能访问docker中的rabbitmq服务端口

    主要原因是防火墙屏蔽了15672端口,宿主机就不能直接通过 ip:port的形式访问rabbitmq的管理界面了. 解决方法很简单: 设置防火墙规则,使外部主机能够访问虚拟机的15672端口. 启动i ...

  8. js-转换方式示例

    var person1 = { toLocaleString : function () { return "Baraka"; }, toString : function() { ...

  9. linux文本处理三剑客命令及用法

    grep:文本过滤工具 功能说明: sed :字符流编辑器 功能说明: awk :

  10. [转帖]差之毫厘谬之千里!带你认识CPU后缀含义

    差之毫厘谬之千里!带你认识CPU后缀含义 https://diy.pconline.com.cn/718/7189243_all.html 2015-11-16 00:15 出处:PConline原创 ...