Java注解【五、注解实战】
需求:
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注解【五、注解实战】的更多相关文章
- JAVA提高五:注解Annotation
今天我们学习JDK5.0中一个非常重要的特性,叫做注解.是现在非常流行的一种方式,可以说因为配置XML 比较麻烦或者比容易查找出错误,现在越来越多的框架开始支持注解方式,比如注明的Spring 框架, ...
- JavaSE学习总结(十五)—— Java反射与注解
一.静态语言与动态语言 静态类型语言:是指在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型,某些具有类型推导能力的现代语言可能能够部分减轻这个要求.强类型 动态 ...
- Java编程思想学习(十五) 注解
注解Annotation又叫元数据,是JDK5中引入的一种以通用格式为程序提供配置信息的方式.使用注解Annotation可以使元数据写在程序源码中,使得代码看起来简洁,同时编译器也提供了对注解Ann ...
- Java的自定义注解使用实例
概念 Java有五个元注解,自动继承java.lang.annotation.Annotation. 什么是元注解,可以理解为其他普通注解进行解释说明 @Target 该注解的使用范围,限定应用场景 ...
- Java语法之注解
注解其实在其他语言也有,只是叫法不一样,在C#中叫特性,其实都是一个意思.今天就是了解下Java的注解. 一.什么是注解 我们先看官方解释:它提供了一种安全的类似注释的机制,用来将任何的信息或元数据( ...
- Java中的注解基础
一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...
- Scala学习十五——注解
一.本章要点 可以为类.方法.字段.局部变量.参数.表达式.类型参数以及各种类型定义添加注解 对于表达式和类型,注解跟在被注解的条目之后 注解的形式有@Annotation.@Annotation(v ...
- [转帖]Java高级系列——注解(Annotations)
Java高级系列——注解(Annotations) 2018年01月13日 :: RonTech 阅读数 3405更多 所属专栏: Java高级系列文章 版权声明:转载请注明出处,谢谢配合. http ...
- Java学习之==>注解
一.概述 关于注解,首先引入官方文档的一句话:Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.接下我将从注解的定义. ...
- 【java】细说 JAVA中 标注 注解(annotation)
Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用 下面我们来详细说说这个注解,到底是怎么一 ...
随机推荐
- 京东商城跨域设置Cookie实现SSO单点登陆过程
可以先看下这边文章:http://blog.chinaunix.net/uid-25508399-id-3431705.html 1.点击首页的登陆按钮跳转到京东的登陆中心https://pass ...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-04 自定义Zuul过滤器实现登录
笔记 4.自定义Zuul过滤器实现登录鉴权实战 简介:自定义Zuul过滤器实现登录鉴权实战 1.新建一个filter包 2.新建一个类,实现ZuulFilter,重写里面的方法 3.在类顶部加 ...
- js图片预览带进度条
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- CPU-内存-IO-网络调优
一.关于CPU 中央处理器调优 1. CPU处理方式: 批处理,顺序处理请求.(切换次数少,吞吐量大) 分时处理.(如同"独占",吞吐量小)(时间片,把请求分为一个一个的时间片,一 ...
- Scala中的列表可以添加元素吗?
列表或许是Scala程序中最常用到的数据结构了,其与数组非常相似,最重要的两点差别为: 1.列表是不可变的: 2.列表具有递归结构,而数组是连续的. 在实际使用中非常容易这样用: val a = Li ...
- Realm学习总结
参考博客: http://www.jianshu.com/p/096bec929f2a http://www.cnblogs.com/ilyy/p/5648051.html 参考的博客介绍很详细,我就 ...
- AES 加密算法的原理详解
AES 加密算法的原理详解 本教程摘选自 https://blog.csdn.net/qq_28205153/article/details/55798628 的原理部分. AES简介 高级加密标准( ...
- 虚树+【BZOJ2286】【SDOI2011】消耗战(虚树)(DP)
先看一道题: [BZOJ2286][SDOI2011]消耗战 Description 在一场战争中,战场由n个岛屿和n−1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总 ...
- vue项目自动构建工具1.0,支持多页面构建
该工具适用于超多项目开发,每个项目不用都安装依赖,所有依赖都安装在ffk命令项目中,对于多分支拉到本地进行开发,亦有益处.对于多页面开发,也是相当便利,不用手动撸entry和plugin. git: ...
- Redis(1.8)Redis与mysql的数据库同步(缓存穿透与缓存雪崩)
[1]缓存穿透与缓存雪崩 [1.1]缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的 ...