java 注解生成实例_Java注解项目实战即模拟Hibenernate生成sql语句

整理了近期学习java注解的部分代码 ,借助java注解模拟Hibenernate ORM模型建立对象与sql语句的映射

Table 注解的创建package com.imooc.test;

import java.lang.annotation.ElementType;

import java.lang.annotation.Retention;

import java.lang.annotation.RetentionPolicy;

import java.lang.annotation.Target;

import javax.lang.model.element.Element;

//用作类的注解,生命周期为运行时 一个值

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

public @interface Table {

String value();

}

字段 注解的创建package com.imooc.test;

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();

}

用户表(类)package com.imooc.test;

@Table("user")

public class Filter {

@Column("id")

private int id;

@Column("user_name")

private String userName;

@Column("user_name")

private String nickName;

@Column("age")

private int age;

@Column("city")

private String city;

@Column("email")

private String email;

@Column("mobile")

private String mobile;

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 String getNickName() {

return nickName;

}

public void setNickName(String nickName) {

this.nickName = nickName;

}

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;

}

public String getMobile() {

return mobile;

}

public void setMobile(String mobile) {

this.mobile = mobile;

}

}

测试类的创建package com.imooc.test;

@Table("Coder ")

public class Coder  {

@Column("id")

private int id;

@Column("name")

private String userName;

@Column("age")

private int age;

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;

}

}

sql语句的生成过程package com.imooc.test;

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.setId(10);

Filter f2 = new Filter();

f2.setUserName("lucy");

Filter f3 = new Filter();

f3.setEmail("su@outlook.com,li@qq.com,hehe@163.com");

Coder c1 = new Coder();

c1.setUserName("ruanjianlin");

String sql1 = query(f1);

String sql2 = query(f2);

String sql3 = query(f3);

String sql4 = query(c1);

System.out.println(sql1);

System.out.println(sql2);

System.out.println(sql3);

System.out.println(sql4);

}

private static String query(Object f) {

// TODO Auto-generated method stub

StringBuilder sb = new StringBuilder();

// 1.获取Class通过类的类类型得到类的详细信息

Class c = f.getClass();

// Java Package.isAnnotationPresent()方法用法实例教程。方法返回true,如果指定类型的注释存在于此元素上,

// 否则返回false

// 2.获取Table的名字

boolean exists = c.isAnnotationPresent(Table.class);

if (!exists) {

return null;

}

Table t = (Table) c.getAnnotation(Table.class);

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 fExists = field.isAnnotationPresent(Column.class);// 是否存在

// 判断是否存在字段

if (!fExists) {

continue;

}

Column column = field.getAnnotation(Column.class);

String columnName = column.value();

Object fieldValue = null;

String filedName = field.getName();

// 4.2拿到字段值(先获取字段的get方法)

String getMethodName = "get"

+ filedName.substring(0, 1).toUpperCase()

+ filedName.substring(1);

try {

Method getMethod = c.getMethod(getMethodName);// 取得该值

// 反射渠道得到字段值

fieldValue = getMethod.invoke(f);

} catch (SecurityException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchMethodException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalArgumentException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IllegalAccessException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InvocationTargetException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

if (fieldValue == null

|| (fieldValue instanceof Integer && (Integer) fieldValue == 0)) {

continue;

}

//4.3拼装sql

sb.append("and ").append(columnName);

if (fieldValue instanceof String) {

if (((String) fieldValue).contains(",")) {

String[] values = ((String) fieldValue).split(",");

sb.append(" in(");

for (String v : values) {

sb.append("'").append(v).append("',");

}

sb.deleteCharAt(sb.length() - 1);

sb.append(")");

} else {

sb.append("= '").append(fieldValue).append("'");

}

} else {

sb.append("=").append(fieldValue.toString());

}

}

return sb.toString();

}

}

7bb1a81c9f3eff9743a7f67c50d264e6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值