常用注解:

自定义注解,标准格式:

1,target:注解作用域

2,Retention:声明周期

运行子类继承,但是子类继承只能作用到类注解,字段注解,是继承不了的。

使用注解:通过下面这种方式,为注解的成员赋值,使用的时候会通过成员名,找到这些值,去使用这些值。

如果注解只有一共成员,该成员必须命名为value,这样使用注解的时候方便:如:@注解(“值1”),相当于@注解(value=“值1”);

解析注解:

解析注解主要用到反射的方式,在下面的例子中可以看到。

主要代码如下:

        //1,获取到class
Class c=f.getClass();
//2,获取到table的名字
boolean exists=c.isAnnotationPresent(Table.class);//判断该类Filete是否是包含注解Table
if(!exists)
{
return null;
}
Table t=(Table) c.getAnnotation(Table.class);//取出Filete这个类的Table注解
String tableName=t.value();//获取该注解的值

使用注解模仿hibernate获取sql的方法。

1,定义两个注解,Table和column

package com.Annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.TYPE}) //作用域为在类上
@Retention(RetentionPolicy.RUNTIME) //生命周期为运行时 public @interface Table {
String value();
}

package com.Annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; @Target({ElementType.FIELD}) //作用域为在字段上
@Retention(RetentionPolicy.RUNTIME) //生命周期为运行时 public @interface Column {
String value();
}

2,定义一个数据库模型类:并分别在类名和字段名上加上注解,分别跟表名和字段名关联

package com.Annotation;

@Table("user")
public class Filter {
@Column("id")
private int id;
@Column("user_Name")
private String userName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getEmail() {
return email;
}
public void setemail(String email) {
this.email = email;
}
}

3,通过set字段值,来定义查询条件,定义一共querey方法,同注解,反射获取sql。

package com.Annotation;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; public class Test { public static void main(String[] args) { Filter f1=new Filter();
f1.setAge(10);//查询id为10的用户 Filter f2=new Filter();
f2.setCity("大连");//查询城市为大连的用户 Filter f3=new Filter();
f3.setCity("liu@sina.com,zh@sina.com,8888@163.com");
//查询邮箱为上面的用户 String sql1=query(f1);
String sql2=query(f2);
String sql3=query(f3);
System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}
private static String query(Filter f)
{
StringBuffer sb=new StringBuffer();
//1,获取到class
Class c=f.getClass();
//2,获取到table的名字
boolean exists=c.isAnnotationPresent(Table.class);//判断该类Filete是否是包含注解Table
if(!exists)
{
return null;
}
Table t=(Table) c.getAnnotation(Table.class);//取出Filete这个类的Table注解
String tableName=t.value();//获取该注解的值
sb.append(" select * from ").append(tableName).append("where 1=1");
//3,遍历所有字段
Field[] fArray=c.getDeclaredFields();
for(Field field:fArray)
{
//4,处理每个字段对应的sql
//4,1,拿到字段名
boolean fExis=field.isAnnotationPresent(Column.class);
if(!exists)
{
continue;
}
Column column=field.getAnnotation(Column.class);//获取该字段上的column注解
String columnName=column.value(); //4,2,拿到字段的值
String filedName=field.getName();
String getMethoudName="get"+filedName.substring(0,1).toUpperCase()+
filedName.substring(1);
Object fieldValue = null;//为了让各种类型的返回值都能接收,定义Object类型
try {
Method getMethod=c.getMethod(getMethoudName);
fieldValue=getMethod.invoke(f);//调用f的对应字段的get方法
} catch (Exception e) {
e.printStackTrace();
} //4,3,拼装sql
if(fieldValue==null||
(fieldValue instanceof Integer && (Integer)fieldValue==0))
{
continue;
}
sb.append(" and ").append(filedName);
if(fieldValue instanceof String) //如果字符串是Int类型,加上单引号
{
if(((String) fieldValue).contains(",")) //包含,,表示是子查询
{
String []values=((String) fieldValue).split(",");
sb.append("in("); for(String v:values)
{
sb.append("'").append(v).append("'").append(",");
}
sb.deleteCharAt(sb.length()-1);//去掉最后一个逗号
sb.append(")");
}
else //否则是普通查询
{
sb.append("=").append("'").append(fieldValue).append("'");
}
}
else if(fieldValue instanceof Integer)
{
sb.append("=").append(fieldValue);
}
}
return sb.toString();
}
}

运行结果:

java注解,通过反射解析注解,模仿hibernate,获取sql语句。的更多相关文章

  1. 【java--反射】注解(反射解析注解+注解应用)

    创建实体类 package cn.com.codingce.iocannotation; /** * @Author: Jiangjun * @Date: 2019/10/7 9:54 */ publ ...

  2. java微信开发API解析(二)-获取消息和回复消息

    java微信开发API解析(二)-获取消息和回复消息 说明 * 本演示样例依据微信开发文档:http://mp.weixin.qq.com/wiki/home/index.html最新版(4/3/20 ...

  3. Hibernate执行sql语句

    Hibernate执行sql语句:BasicServiceImpl basicServiceImpl = new BasicServiceImpl();String hql = "selec ...

  4. 在hibernate中用sql语句

    在hibernate中用sql语句,语句是createSQLquery 查出来的是,一列或者多列的数据,要将其转化为对象,有两种方式, 对于已经被hibernate所管理的实体类,在后面加.adden ...

  5. Java基础之反射、注解、代理

    反射 笔者对反射的理解就是解剖class文件,来进行一系列操作. Class类 获取Class类实例的三种方式: 类名.class 对象.getClass() static Class forName ...

  6. Java中的反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  7. 【Java基础】反射和注解

    前言 在Java中,反射机制和注解机制一直是一个很重要的概念,那么他们其中的原理是怎么样呢,我们不仅仅需要会使用,更要知其然而之所以然. 目录 反射机制 反射如何使用 注解定义 注解机制原理 注解如何 ...

  8. JAVA高级特性反射和注解

    反射: 枚举反射泛型注解.html34.3 KB 反射, 主要是指通过类加载, 动态的访问, 检测和修改类本身状态或行为的一种能力, 并能根据自身行为的状态和结果, 调整或修改应用所描述行为的状态和相 ...

  9. Java高级篇反射和注解

    反射是什么? 反射的作用?能带来什么好处? 反射的使用? 注解的使用? 注解和反射配合实战...

随机推荐

  1. MySql - GROUP BY 和 HAVING关键字

    本文主要针对GROUP BY 和 HAVING两个关键字进行分析 使用测试表如下: 测试前,只知道GROUP BY 这个关键字的作用是根据一个字段进行分组,去重.HAVING对分组设置条件. 具体分组 ...

  2. Educational Codeforces Round 11 B. Seating On Bus 水题

    B. Seating On Bus 题目连接: http://www.codeforces.com/contest/660/problem/B Description Consider 2n rows ...

  3. CROC 2016 - Elimination Round (Rated Unofficial Edition) A. Amity Assessment 水题

    A. Amity Assessment 题目连接: http://www.codeforces.com/contest/655/problem/A Description Bessie the cow ...

  4. 解决Sony Z2上卸载 "授权管理" 带来的发热问题

    由于原来的手机已经使用两年了,有点跟不上时代了,最近发现Sony Z2的价格还不错,便冲动买了下来.新手机用起来还是很不错的,但觉得自带的权限管理太弱了点,便Root后上了LBE.上了LBE后,发现权 ...

  5. g++ 链接*.a静态库 方法

    g++在链接*.a静态库时,直接作为object使用,不需要使用-l ,但是需要注意调整顺序,被依赖的文件放在后面. 如: g++  -g  -o0 -Wno-deprecated  -I$(INCL ...

  6. POJ2352【树状数组】

    个人NO.1 一开始题意理解有错. 一星星左下边有N颗星星,那它的等级就是N. 一开始理解必须X,Y两个坐标都小于,后来根据样例看了一下只要左下方即可,X,Y坐标都小于等于即可,但不包括星星本身. # ...

  7. Socket INADDR_ANY详解

    转载:http://hi.baidu.com/zorro_knight/item/37af9e8c9dc71253e73d1924 linux下的socket INADDR_ANY表示的是一个服务器上 ...

  8. (windows)一台电脑上安装两个Mysql服务

    原文:https://my.oschina.net/u/1472917/blog/410732 最近需要在一台电脑上安装两个Mysql服务,需求稍微有些奇怪,但确实很必要.本人原本为了本机测试Word ...

  9. 解决kylin报错:java.lang.ArrayIndexOutOfBoundsException: -1

    报错信息: -- ::, INFO [pool--thread-] cli.DictionaryGeneratorCLI: : Building snapshot of ENERGON_DM.DM_D ...

  10. 使用WebView出现web page not available

    很有可能是没有设置权限,所以不能浏览相应的URL,设置如下: 在AndroidManifest.xml中添加 <uses-permission android:name="androi ...