需求:

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. spring boot系列(七)spring boot 使用mongodb

    1 pom.xml配置 增加包依赖:spring-boot-starter-data-mongodb <dependency> <groupId>org.springframe ...

  2. COALESCE关键字的使用

    COALESCE是sql标准里面的一个关键字,我们可以和聚合函数sum,count,max等一起使用完成一些特殊的功能. 以下sql语句基于mysql 1.查询某一个列总和,如果没有数据或者NULL返 ...

  3. 【笔记】7天玩转容器&CKA管理员实训

    第一部分 day1,容器基础知识介绍 安装 apt-get install docker-engine [root@cce-7day-fudonghai-24106 01CNL]# docker -v ...

  4. idea设置背景色和字体大小

    修改背景色  点击[File],选择[Settings]. 点击[Editor],选择[color Scheme]. 默认Scheme只有两种.Default是白色,Darcula是黑色   修改字体 ...

  5. Linux三种SSH协议登陆方式

    在实际工作中遇到了三种不同SSH协议登陆Linux服务器的方式,由简单到复杂分别阐述:一.最简单也是最不安全的root账号密码登陆通过root账号+root密码登陆Linux服务器. 二.普通用户登陆 ...

  6. Jquery的深浅拷贝涉及到的知识点

    1.安全的类型检测 Object.prototype.toString.call(obj) => "[object NativeConstructorName]" /** * ...

  7. android简易跑马灯

    重点:焦点的选择(返回true使得焦点不被选择) MarqueeText.java package com.example.demo02; import android.content.Context ...

  8. 快速排序的js实现

    该方法的基本思想是: 1.先从数列中取出一个数作为基准数. 2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边. 3.再对左右区间重复第二步,直到各区间只有一个数. var ...

  9. 2019年 Java 课程总结

    Java学习个人感悟: 1.我感觉学习java应该是循环渐进,有始有终,勤奋细心,脚踏实地. java是一门有着阶梯性的一们语言,如果要学习它.我觉得最好还是按照java的学习体系,先学习什么,在学习 ...

  10. autossh

    LDAP:用old HK login SSH转发:/root/.nat_rules/opay-new root@ldap opay-new]# cat maria1-dw-60000 #!/bin/b ...