zoukankan      html  css  js  c++  java
  • java

    反射操作注解

    模拟ORM( 对象关系映射 ), 利用注解和反射完成类和表结构的映射关系

    类名 表名
    属性 表字段
    一个类对象 表中的一条记录

    完整示例代码:

    package com.hz;
    
    import com.sun.deploy.util.StringUtils;
    import java.lang.annotation.*;
    import java.lang.reflect.Field;
    import java.util.Arrays;
    
    
    @TableName("user")  // 数据库中有一张名为User的表
    public class User {
        @DBField(name = "name", type = "NVARCHAR2", len = 50, nullable = false)//库中name字段
        private String userName;  
    
        @DBField(name = "pwd", type = "NVARCHAR2", len = 100, nullable = false)//库中pwd字段
        private String passWord;
    }
    
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @interface TableName{
        String value();
    }
    
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface DBField{
        String name();
        String type();
        int len();
        boolean nullable();
    }
    
    class MyOrm{
        public static void main(String[] args) throws Exception {
            // sql有了就可以通过 jdbc来获取数据了
            String sql = new MyOrm().getSelectSql();
            System.out.println(sql);
        }
    
        private String getSelectSql() throws ClassNotFoundException {
            Class clz = Class.forName("com.hz.User");
    
    //        // 获取所有注解
    //        Annotation[] annotations = clz.getAnnotations();
    //        for (Annotation annotation : annotations) {
    //            System.out.println(annotation);
    //        }
    
            // 获取表名的注解
            TableName annTable = (TableName) clz.getAnnotation(TableName.class);
    //        System.out.println(annTable.value());
    
            // 获取字段的注解
            Field[] declaredFields = clz.getDeclaredFields();
            String[] fields = new String[declaredFields.length];
            for (int i = 0; i < declaredFields.length; i++) {
                Field declaredField = declaredFields[i];
    //            System.out.printf(" ===== %s ====
    ", declaredField.getName());
                DBField annField = declaredField.getAnnotation(DBField.class);
    //            System.out.println(annField.name());
    //            System.out.println(annField.type());
    //            System.out.println(annField.len());
    //            System.out.println(annField.nullable());
                fields[i] = annField.name();
            }
    
            return String.format("select %s from %s",
                    StringUtils.join(Arrays.asList(fields), ","),
                    annTable.value());
        }
    }
    
    结果:
    select name,pwd from user
    
    让火焰净化一切
  • 相关阅读:
    《有限元分析基础教程》(曾攀)笔记二-梁单元方程推导(二):简支梁挠曲线近似解
    《有限元分析基础教程》(曾攀)笔记二-梁单元方程推导(一):简支梁挠曲线解析解
    接入TDMQ
    python 字典键值对练习
    python字典中键值对的值为中文,打印成转义字符,怎么解决
    python 字典的增删改
    C++ File 类学习总结
    The way of learning ,I am coming
    C++ Primer第四版 15.9 再谈文本查询 程序实现
    自己实现strtok函数
  • 原文地址:https://www.cnblogs.com/icefoxhz/p/13680446.html
Copyright © 2011-2022 走看看