java注解和反射制作dao基类的练习

首先是三个注解

主键注解

package comments;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 主键
 * @author  Administrator
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface  Key {
}
package comments;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 如果不和数据关联则设置此注解
 * @author  Administrator
 *
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface  notRecord {
}
package comments;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 设置表名
 * @author  Administrator
 *
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface  Table {
    public String name();
}

然后是自定义异常类

package org;

/**
 * 设置自定义异常
 * @author  Administrator
 *
 */
public class NumException extends Exception {
    private String name;
    public NumException(String name){
        this.name=name;
    }
    public String toString(){
          return name;
    }
}

实体类

package org;

import comments.Key;
import comments.Table;
import comments.notRecord;

@Table(name = "student")
public class Student {
    @Key
    private String id;
    private String name;
    @notRecord
    private String sex;
    private int age;

    public String getId() {
        return id;
    }

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

    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 getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

处理实体类生成sql的类。

package org;

import java.lang.reflect.Field;

import comments.Key;
import comments.Table;
import comments.notRecord;

public class Processing {

    /**
     * 通过实体类生成 insert into sql语句
     * @param cl
     * @return
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws NumException
     */
    public String save(Object cl) throws IllegalArgumentException, IllegalAccessException, NumException{
        String sql="insert into ";
        if(cl!=null){
            Field[] fiels=cl.getClass().getDeclaredFields();//获得反射对象集合
            boolean t=cl.getClass().isAnnotationPresent(Table.class);//获得类是否有注解
            if(t){
                Table tab=cl.getClass().getAnnotation(Table.class);
                sql+=tab.name();//获得表名
                String name ="";//记录字段名
                String value ="";//记录值名称
                boolean bl=false;//记录主键是否为空
                for(Field fl:fiels){//循环组装
                    fl.setAccessible(true);//开启支私有变量的访问权限
                    Object tobj=fl.get(cl);
                    if(tobj!=null){
                        if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
                            bl=true;
                        }
                        if(!fl.isAnnotationPresent(notRecord.class)){
                            name+=fl.getName()+",";
                            value+="‘"+tobj.toString()+"‘,";
                        }
                    }
                }
                if(bl){
                    if(name.length()>0)
                        name=name.substring(0,name.length()-1);
                    if(value.length()>0)
                        value=value.substring(0,value.length()-1);
                    sql+="("+name+") values("+value+")";
                }else
                    throw new NumException("未找到类主键 主键不能为空");
            }else
                throw new NumException("传入对象不是实体类");
        }else
             throw new NumException("传入对象不能为空");//抛出异常
        return sql;
    }
    /**
     * 传入对象更新
     * @param obj
     * @return
     * @throws IllegalArgumentException
     * @throws IllegalAccessException
     * @throws NumException
     */
    public String update(Object obj) throws IllegalArgumentException, IllegalAccessException, NumException{
        String sql="update ";
        if(obj!=null){
            Field[] fiels=obj.getClass().getDeclaredFields();//获得反射对象集合
            boolean t=obj.getClass().isAnnotationPresent(Table.class);//获得类是否有注解
            if(t){
                Table tab=obj.getClass().getAnnotation(Table.class);
                sql+=tab.name()+" set ";//获得表名
                String wh ="";//记录字段名
                String k="";
                boolean bl=false;//记录主键是否为空
                for(Field fl:fiels){//循环组装
                    fl.setAccessible(true);//开启支私有变量的访问权限
                    Object tobj=fl.get(obj);
                    if(tobj!=null){
                        if(fl.isAnnotationPresent(Key.class)){//判断是否存在主键
                            bl=true;
                            k=fl.getName()+"=‘"+tobj.toString()+"‘ where  ";
                        }else{
                            if(!fl.isAnnotationPresent(notRecord.class)){
                                wh+=fl.getName()+"=‘"+tobj.toString()+"‘,";
                            }
                        }
                    }
                }
                if(bl){
                    if(wh.length()>0)
                        wh=wh.substring(0,wh.length()-1);
                    if(k.length()>0)
                        k=k.substring(0,k.length()-1);
                    sql+=k+wh;
                }else
                    throw new NumException("未找到类主键 主键不能为空");
            }else
                throw new NumException("传入对象不是实体类");
        }else
             throw new NumException("传入对象不能为空");//抛出异常
        return sql;
    }
}

最后是测试类

package org;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import comments.Table;
import comments.Key;

public class temp {
    public static void main(String[] aa) throws IllegalArgumentException, IllegalAccessException, NumException{
        Student stu=new Student();
        stu.setId("ccc");
        stu.setName("姓名");
        stu.setAge(18);
        stu.setSex("男");
        //stu=null;
        System.out.println(new Processing().save(stu));
        System.out.println(new Processing().update(stu));
    }
}
时间: 2024-10-13 03:16:09

java注解和反射制作dao基类的练习的相关文章

JAVA中的反射中加载类的方法

反射:加载类的方法有三种, 1.用Class.forName("类名")方法来调用; 2.类名.class得到 3.用对象.getClass()得到 package com.ma.reflection; import org.junit.Test; import com.ma.bean.UserBean; public class Demo1 { /** * 反射:加载类的方法 */ @Test public void test1(){ //1.用Class.forName("

java注解和反射的结合使用

首先反射注解,那么保留策略必须是Runtime,也就是@Retention(RetentionPolicy.RUNTIME) ①定义一个注解类 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) public @interface MyAnnotation { int value(); } ②在定义一个类使用注解类 public class MyBean { @MyAnnotation(20) private int

随笔-java注解,反射,枚举

package aresoft.controller.test; import java.lang.annotation.Annotation;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.List; public class Demo3 {    @Sup

Java注解及反射得到注解

Class类的方法 f package com.part1; /** * * @author pc * */ public class Student { public int sid; public char sex; private String sname; private String password; private String cardno; private double money; public Student() { } public Student(int sid, St

JAVA 注解和反射

通过反射来获取类 Class MyTest{ private String name; public String showName{ System.out.println(this.name); } } Class myClass = Class.forName("MyTest"); //代替JVM引入MyTest类 Method myMethod = myClass.getDeclaredMethod("showName", String.class); //获

java自定义注解与反射

java注解与反射一.Java中提供了四种元注解,专门负责注解其他的注解,分别如下 1.@Retention元注解,表示需要在什么级别保存该注释信息(生命周期).可选的RetentionPoicy参数包括: RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉 RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认) RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注

Java类加载器( CLassLoader ) 死磕 3: 揭秘 ClassLoader抽象基类

[正文]Java类加载器(  CLassLoader ) 死磕3:  揭秘 ClassLoader抽象基类 3.1. 揭秘ClassLoader抽象基类 3.1.1. 类的加载分类:隐式加载和显示加载 java中类是动态加载的,jvm启动的时候,并不会一次性加载所有的class文件,而是根据需要去动态加载.一是加快启动的速度,二是节约内存.如果一次性加载全部jar包的所有class,速度会很慢. 动态载入一个class类,有两种方式: (1) implicit隐式加载 即通过实例化才载入的特性来

winform中利用反射实现泛型数据访问对象基类

考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <summary> /// DAO基类 实体名必须要与数据表字段名一致 /// </summary> /// <typeparam name="T"></typeparam> public class BaseDao<T> where T :

java中使用反射获取pojo(实体)类的全部字段值

说起反射.不得不说它实在是太强大了,通过反射就能够轻轻松松拿到各种东东,假设你想在项目中解除对某个类的依赖,能够考虑用反射. 今天跟大家分享的是通过java中的反射,获取pojo类的全部字段值. 为什么要做这个操作的呢?主要是为了重写实体类的toString方法.有人会说.直接重写toString方法.返回字段.toString()的字符串不就可以了. 这么做的确能够.可是假设你的pojo类有上百个,上千个,你还要一个一个改吗?所以我们须要从新的方向去解决. 由于我们全部的pojo类.都继承一个