java注解的开发_使用Java注解开发自动生成SQL

使用注解开发的好处就是减少配置文件的使用。在实际过程中,随着项目越来越复杂,功能越来越多,会产生非常多的配置文件。但是,当配置文件过多,实际维护过程中产生的问题就不容易定位,这样就会徒劳的增加工作量。而使用注解开发,可以减少配置文件的使用,方便代码的维护,同时,在开发速度上也有大幅提升,因此,学会使用注解开发,是有必要掌握的一项技能。

下面为各位展示下使用注解开发自动生成SQL语句的过程。

首先先定义一个实体类,用于和数据库字段进行映射,为了方便,数据库字段名称和实体类变量名称保持一致。

package com.huawei.andrid.net.annotation;

@Table("person")

public class Person

{

@Column("name")

private String name;

@Column("sex")

private String sex;

@Column("id")

private int id;

@Column("age")

private int age;

public String getName()

{

return name;

}

public void setName(String name)

{

this.name = name;

}

public String getSex()

{

return sex;

}

public void setSex(String sex)

{

this.sex = sex;

}

public int getId()

{

return id;

}

public void setId(int id)

{

this.id = id;

}

public int getAge()

{

return age;

}

public void setAge(int age)

{

this.age = age;

}

}

下面我们要为这个实体类定义注解,包含@Table和@Column两个注解。

package com.huawei.andrid.net.annotation;

import static java.lang.annotation.ElementType.TYPE;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;

import java.lang.annotation.Retention;

import java.lang.annotation.Target;

@Documented

@Retention(RUNTIME)

@Target(TYPE)

public @interface Table

{

public String value();

}

元注解:

@Documented  生成javadoc时,支持注解

@Retention(RUNTIME)  注解的生命周期

@Target(TYPE)  注解的在类上

package com.huawei.andrid.net.annotation;

import static java.lang.annotation.ElementType.FIELD;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;

import java.lang.annotation.Retention;

import java.lang.annotation.Target;

@Documented

@Retention(RUNTIME)

@Target(FIELD)

public @interface Column

{

public String value();

}

最后,我们需要解析注解,使用java的反射机制。

private static String query(Object p) throws NoSuchMethodException, SecurityException, IllegalAccessException,

IllegalArgumentException, InvocationTargetException

{

StringBuilder str = new StringBuilder();

//通过反射获取Class对象,以便获取注解的值

Class extends Object> obj = p.getClass();

//判断该对象的类上有没有注解@Table

boolean isExistsTable = obj.isAnnotationPresent(Table.class);

if (!isExistsTable)

{

return null;

}

//获取Table注解,并获取注解的值,即表名

Table table = (Table) obj.getAnnotation(Table.class);

String tableName = table.value();

//拼装sql

str.append("select * from ").append(tableName).append(" where 1=1 ");

//获取所有的成员变量,并遍历出来成员变量上的注解值

Field[] fields = obj.getDeclaredFields();

for (Field field : fields)

{

Boolean isExistColumn = field.isAnnotationPresent(Column.class);

if (!isExistColumn)

{

continue;

}

//获取成员变量上的注解值

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

String columnName = column.value();

//获取成员变量的get方法名

String methodName = "get" + columnName.substring(0, 1).toUpperCase() + columnName.substring(1);

//获取成员变量的get方法

Method method = obj.getMethod(methodName);

//执行成员变量的get方法,参数为该对象

Object value = method.invoke(p);

//过滤掉成员变量中的null值,以及0

if (null == value || (value instanceof Integer && (Integer) value == 0))

{

continue;

}

str.append(" and ").append(columnName).append("=").append(value);

}

return str.toString();

}

测试:

public static void main(String[] args)

{

Person p = new Person();

p.setName("wanglu");

p.setAge(25);

String querySQL = null;

try

{

querySQL = query(p);

}

catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException

| InvocationTargetException e)

{

e.printStackTrace();

}

System.out.println(querySQL);

}

java注解实例-反射生成sql

定义描述用户表的注解: package dao; import java.lang.annotation.ElementType; import java.lang.annotation.Retent ...

Java注解开发与应用案例

Java注解开发与应用案例 Annotation(注解)是JDK5.0及以后版本引入的,可以对包.类.属性.方法的描述,给被述对象打上标签,被打上标签后的类.属性.方法将被赋予特殊的“功能”:打个比喻 ...

使用Excel自动生成sql语句

在近一段日子里,进入了新的项目组,由于项目需要,经常要将一些Excel表中的数据导入数据库中,以前并没有过多的接触过数据导入与数据处理,对于我来说比较痛苦,今天下午花了几个小时处理数据,但是同事给我提 ...

R.java文件无法自动生成的问题

如果出现R.java文件无法自动生成的问题,同时Console窗口提示下列信息: Android requires compiler compliance level 5.0 or 6.0. Foun ...

基于注解处理器开发自动生成getter和setter方法的插件

昨天无意中,逛到了lombok的网站,并看到了首页的5分钟视频,视频中的作者只是在实体类中写了几个字段,就可以自动编译为含setter.getter.toString()等方法的class文件.看着挺 ...

Android开发——自动生成Android屏幕适配的dimens.xml文件

使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...

hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

利用反射自动生成SQL语句(仿Linq)

转:http://www.cnblogs.com/the7stroke/archive/2012/04/22/2465597.html using System; using System.Colle ...

使用sqlmetal工具自动生成SQL数据库的Linq类文件

第一部:找到sqlmetal.exe. 运行cmd. 执行命令 cd C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5 ...

随机推荐

listen()

创建一个套接口并监听申请的连接. #include int PASCAL FAR listen( SOCKET s, int backlog); S:用于标识一个已 ...

linq多表join与group

var query =from a in this.ObjectContext.siteInfo join b in this.ObjectContext.shopInfo on a.siteID e ...

Winform TreeView 查找下一个节点

转载:http://www.cnblogs.com/Ruiky/archive/2013/02/01/2888674.html public static class TreeViewHelper { ...

使用sql语句查询日期在一定时间内的数据

使用sql语句查询日期在一周内的数据 select * from ShopOrder where datediff(week,ordTime,getdate()-1)=0   //查询当天日期在一周年 ...

[翻译]你真的知道你看到的UTF-8字符是什么吗?

翻译自http://www.pixelstech.net/article/1397877200-You-know-what-UTF-8-is-when-you-see-it- Source : son ...

生成树的计数(基尔霍夫矩阵):BZOJ 1002 [FJOI2007]轮状病毒

1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3928  Solved: 2154[Submit][Statu ...

Java实现串口通信的小样例

用Java实现串口通信(windows系统下),须要用到sun提供的串口包 javacomm20-win32.zip.当中要用到三个文件,配置例如以下: 1.comm.jar放置到 JAVA_HOME ...

Oracle的表被锁后的恢复

运行下列SQL,找出数据库的serial#,执行结果如下图所示 SELECT T2.USERNAME, T2.SID, T2.SERIAL#, T2.LOGON_TIME   FROM V$LOCKE ...

div+css+position实现简单的纵向导航栏

完成效果: 这应该是很简单的纵向导航栏了. OK,进入正题 首先,我们看上面的效果图可以分析得出,要实现这个效果需要用到的技术点 1.hover 2.position 3.布局 我认为在这个效果的实现 ...

[Leetcode]895.最大频率栈

Problem 实现 FreqStack,模拟类似栈的数据结构的操作的一个类. FreqStack 有两个函数: push(int x),将整数 x 推入栈中. pop(),它移除并返回栈中出现最频繁 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值