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

下面为各位展示下使用注解开发自动生成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的更多相关文章

  1. java注解实例-反射生成sql

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

  2. Java注解开发与应用案例

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

  3. 使用Excel自动生成sql语句

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

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

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

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

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

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

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

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

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

  8. springboot+mybatis+mysql 利用mybatis自动生成sql语句

    工具和环境 idea,mysql,JDK1.8 效果图如下 结构图如下 java resources sql文件 /* Navicat MySQL Data Transfer Source Serve ...

  9. java 文档自动生成的神器 idoc

    写文档 作为一名开发者,每个人都要写代码. 工作中,几乎每一位开发者都要写文档. 因为工作是人和人的协作,产品要写需求文档,开发要写详细设计文档,接口文档. 可是,作为一个懒人,平时最讨厌的一件事情就 ...

随机推荐

  1. Direct2D

    Direct2D Direct2D教程III——几何(Geometry)对象 摘要: 目前博客园中成系列的Direct2D的教程有1.万一的 Direct2D 系列,用的是Delphi 20092.z ...

  2. U盘读不出+卷标丢失+像读卡器+大小0+无媒体

    U盘读不出+卷标丢失+像读卡器+大小0+无媒体 标题有点怪,原因是我不都不知道该怎样概括这个鸟问题,所以尽可能列出一些主要现象,希望有需要的童鞋搜到.但比标题更怪的是问题本身,且听我道来: 陪伴我若干 ...

  3. python 中文字数统计/分词

    因为想把一段文字分词,所以,需要明确一定的词语关系. 在网上随便下载了一篇中文小说.随便的txt小说,就1mb多.要数数这1mb多的中文到底有多少字,多少分词,这些分词的词性是什么样的. 这里是思路 ...

  4. Scrapy 通过登录的方式爬取豆瓣影评数据

    Scrapy 通过登录的方式爬取豆瓣影评数据 爬虫 Scrapy 豆瓣 Fly 由于需要爬取影评数据在来做分析,就选择了豆瓣影评来抓取数据,工具使用的是Scrapy工具来实现.scrapy工具使用起来 ...

  5. .Net多线程编程—同步机制

    1.简介 新的轻量级同步原语:Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait.轻量级同步原语只能 ...

  6. 【摘录】使用实体框架、Dapper和Chain的仓储模式实现策略

    以下文章摘录来自InfoQ,是一篇不错的软问,大家细细的品味 关键要点: Dapper这类微ORM(Micro-ORM)虽然提供了最好的性能,但也需要去做最多的工作. 在无需复杂对象图时,Chain这 ...

  7. 《CLR Via C#》读书笔记,持续更新...

    写了快5年代码了,一直都是使用别人发明的语言,别人发明的框架做快速开发,还从来没有真正深刻的学习过底层的一些东西,于是今年我打算读<CLR Via C#>这本书,认识一下C#的底层,我觉得 ...

  8. 仿qq的侧拉菜单效果

    自定义控件 import android.animation.ArgbEvaluator; import android.animation.FloatEvaluator; import androi ...

  9. 【锋利的Jquery】读书笔记七

    第七章  jquery插件 管理cookie的插件--cookie jquery插件太多没什么好讲的,百度太多 说以下 cookie插件 <!DOCTYPE html> <html& ...

  10. 如何关闭tomcat的localhost_access_log?

    Tomcat每处理一个请求就会在{tomcat_home}/logs/下面生成localhost_access_log,日复一日,服务器上面就产生了很多这样的文件,虽然单个文件不大,但是积少成多,一定 ...