使用注解生成sql语句

注解介绍:
java SE5内置了三种,定义在java.lang中的注解:
@Override,表示当前的方法定义将覆盖超类中的方法。
@Deprecated,如果程序员使用了注解为它的元素,那么编译器会发出警告信息。
@SuppressWarnings,关闭不当的编译器警告信息。

元注解
@Target 用来定义你的注解应用于什么地方,例如是一个方法或者一个域。
		CONSTRUCTOR :构造器的声明
		FIELD : 域声明
		METHOD :方法声明
		PACKAGE : 包生明
		TYPE : 类、接口或enmu声明
@Retention 用来定义该注解在哪一个级别可用,在源代码中(SOURCE),类文件中(CLASS)或者运行时(RUNTIME)
@Documented 将此注解包含在javadoc中
@Inherited 允许子类继承父类中的注解

注解元素可用的类型,所有的基本类型:int,float,boolean等、String、Class、enum、Annotation

定义一个注解Test:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Test(){
  String value();
}
// 下面使用注解来生成sql语句
1、先定义2个注解类,Table,Column
2、定义一个JavaBean类
3、编写注解实现类

注解类:Table
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
    String value();
}

注解类:Column
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    String value();
}

javaBean类
@Table(value = "USER")
public class UserBean {

    @Column(value = "id")
    private int id;

    @Column(value = "userId")
    private String userId;

    @Column(value = "userName")
    private String userName;

    @Column(value = "email")
    private String email;

    @Column(value = "mobile")
    private String mobile;

    @Column(value = "phone")
    private String phone;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    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;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

4、注解测试类
public class MainTest {

    public static void main(String[] args) {
        UserBean userBean = new UserBean();
        userBean.setId(10);
        userBean.setEmail("[email protected]");
        beanSql(userBean);

    }

    public static String beanSql(Object user){
        StringBuffer sql = new StringBuffer();

        Class c = user.getClass();
        boolean flag = c.isAnnotationPresent(Table.class);  // 判断该类是否包含Table的注解,返回true/false
        if(!flag){
            return null;
        }
        Table table = (Table) c.getAnnotation(Table.class); // 获取到注解对象
        String tableName = table.value(); // 获取到注解对象的值
        sql.append("select * from ").append(tableName).append(" where 1=1");
        // 获取该类中字段的注解
        //Field[] fields = c.getFields();
        Field[] fields = c.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            boolean fieldFalg = fields[i].isAnnotationPresent(Column.class);
            if(!fieldFalg){
                continue;
            }
            Column column = fields[i].getAnnotation(Column.class);
            String fieldName = column.value();  // 字段的名称
            Object fieldValue = null ;  // 字段的值
            // 字段的值获取,使用反射
            try {
                // 获取方法名如:getId()
                String methodName = "get"+fieldName.substring(0,1).toUpperCase()+fieldName.substring(1).toString();
                // 通过反射invoke获取到值
                Method method = c.getMethod(methodName);
                fieldValue = method.invoke(user,null);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }

            if(fieldValue == null || (fieldValue instanceof Integer && (Integer)fieldValue == 0)){
                continue;
            }
            if(fieldValue instanceof String){
                sql.append(" and ").append(fields[i].getName()).append("=‘").append(fieldValue).append("‘");
            }else if(fieldValue instanceof Integer){
                sql.append(" and ").append(fields[i].getName()).append("=").append(fieldValue);
            }
        }
        System.out.println(sql.toString());

        return sql.toString();
    }

}

生成sql如下:select * from USER where 1=1 and id=10 and email=‘[email protected]‘;

  

方法说明:
getAnnotation(Table.class):检查对象是否带有@Table注解
getFields() : 获得某个类的所有的公共(public)的字段,包括父类。
getDeclaredFields() :获得某个类的所有申明的字段,即包括public、private和proteced,但是不包括父类的申明字段isAnnotationPresent(Table.class): 指定注释类型的注释存在于此元素上

  

原文地址:https://www.cnblogs.com/zhangcece/p/8997769.html

时间: 2024-10-15 05:05:43

使用注解生成sql语句的相关文章

利用反射生成SQL语句

// 修改学员信息的方法 public bool ModifyStudent(MODEL.Students model) { // 利用反映获取类对所有属性,用来动态生成SQL语句 StringBuilder sbSql = new StringBuilder("update Students set "); // 先获得model 的Type类型 Type modeType = model.GetType(); // 通过Type类型得到它所有的公开属性 PropertyInfo[]

NO2:自动生成sql语句

SQL语句自动生成工具 大哉乾元 2016/2/26   作者原创转载请注明出处 前言 这个程序是几年前做成的,现在整理成文档和大家分享,当时参与的项目中大量使用的sql语句,所以SqL语句的代码输入占了较大的比例,为了提高sql语句的书写正确性和输入效率,做成了这个自动生成工具. 一:ADO.NET中执行sql文,对应的sql语句嵌入到vb.net的代码内,分析sql的语法格式个特点: 已检索语句为例分析: A:必须是已select开头 B:检索的字段名(一些系统函数:可选,例如max,sum

模拟Hibernate动态生成SQL语句

这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 3 "http://www.hibernate.org/dtd/hibernate-

动态产生和删除相关组件并生成SQL语句

(********************************************************************************************************** * * * 窗体描述:产生SQL条件语句,系统模块 [计划管理-打卡] 打印大/小卡 *           能够根据维护进去的条件,生成过软类型: 缸内过软.缸外过软.连续皂洗.空白 * * 关键功能点:1.动态产生和删除子/父等相关组件按钮(注意移动组件位置) *        

python读取excel表格生成sql语句 第一版

由于单位设计数据库表·,都用sql.不知道什么原因不用 powerdesign或者ermaster工具,建表很痛苦  作为程序猿当然要想办法解决,用Python写一个程序解决 需要用到 xlrd linux下 sudo pip install xlrd 主要是适用于db2数据库 excel 表结构 其中 number是不正确的字段类型 不知道同事为啥这么设置.这里程序里有纠错,这个程序就是将sql语句拼好. __author__ = 'c3t' # coding:utf-8 import xlr

excel生成sql语句

很多时候,我们想把excel中数据导入到数据库中. 方法有很多种,比如直接拷贝然后黏贴进编辑状态的框中,这种情况有个弊端,就是excel中每列的数据必须和数据库中一一对应,这个很难,基本上不太可能,数据库中有很多的自动增长或者有默认值得数据,如果要调整成一一对应,调整excel的时间可谓花费不少时间. 下面推荐一种可以在excel中直接生成sql语句,复制进去执行就好了.思路是很清晰的,就是有个sql模板,excel中数据套进模板就可以了,下面看看excel中已经有这种强大的功能函数,直接调用就

自定义ORMapping—动态生成SQL语句

概述 之前在自定义ORMapping--关系表转换为实体或实体集合对象中提到过ORMapping的东西,在那片博客中也有ORMapping实现的一个简单思路,当时只实现了关系表转换为实体或实体集合这个功能,没有实现动态生成SQL这个部分,本片博客就是完善之前的那片博客,实现动态生成SQL语句这么一个功能. 实现思路 1.创建两个自定义特性,分别为表特性和字段特性,目的就是给相应的实体类的类名和属性名,打上相应的特性,从而创建类名和表名,属性和表字段名之间的对应关系 2.创建一个特性解析类,用来解

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.

手把手教你-----巧用Excel批量生成SQL语句,处理大量数据

在做系统或者做项目的时候,经常会遇到这样的要求:用户给我们发过来一些数据,要求我们把这些数据导入到数 据库中,对于少量的数据来说,用最原始的方法就可以解决,直接在SQL里面用语句来实现,但是如果有成千上万条的 数据呢?如果你还继续单独写SQL语句,估计写个几十条你就会有跳楼的冲动,其实有两种简单的方法: 1.将Excel的数据整理好,通过SQL的导入功能直接导入到数据库中,但是要保证数据库的字段和Excel的字段一致. 2.通过Excel生成相应的SQL语句,然后,放到SQL的新建查询中,执行.