使用反射写个通用型的数据库增删改查

在砺锋暑假班做电信计费系统的时候,由于要写一大堆Dao,感觉很无趣,因为我宁愿做更复杂一点的工作,也不想做重复的工作,结合前几天学的反射。我顿时有了个大胆的想法。。。

我们知道,数据库中的表对应着Java中的pojo类,表中的列名对应着pojo类中的字段,例如:Student表的结构如下:

create table student(

  stud_no varchar(50)  not null  primary key,

  stud_name  varchar(50) not null,

  password  varchar(50) not null,

  create_date datetime not null

);

可以对应成以下的Java Pojo类:

public class Student{

  private String stud_no;

  private String stud_name;

  private String password;

  private java.util.Date create_date;

}

其中,数据库表中的varchar类型对应着Java中的String类型,datetime类型对应着Java中的java.util.Date类型。当然你也可以在数据库中用timestamp,这又是题外话了。

好了,也许这以上都是废话,那么接下来我要做个小小的改动,我给Student这个Pojo加个字段,用来指定Student表的主键是谁,字段名就叫它keyname吧,那么有:

public class Student{

  private String stud_no;

  private String stud_name;

  private String password;

  private java.util.Date create_date;

  private String keyname="stud_no";

}

这里我们指定stud_no为主键。所以要让keyname="stud_no";什么,你说要以多个字段作为主键?那就是另一回事了,这里我们只研究单主键的情况。

好的,接下来我们来讲一下反射,反射是大部分框架的基础,像什么Spring啊,Hibernate啊,都是基于反射原理来完成,当然还有一些其他的工作。

我们想知道这个类的名字(这里是取简单的名字,非限定名),可以有几种方式。

1.

Student.class.getSimpleName(); 

//这里是通过Student.class来获取Student的Class类,然后获取它的名字;

2.

Student student = new Student(); 
student.getClass().getSimpleName(); 

//这里是通过Student类的实例.getClass方法获取它的Class类,然后获取它的名字,这种用的比较多一点。

3.

public class BaseDAO<T> {
    protected String keyname="";
    DataSource ds;
    private Class<T> entityClass;
        public BaseDAO(){
        Type genType = getClass().getGenericSuperclass();  
            Type[] params = ((ParameterizedType)genType).getActualTypeArguments();  
            entityClass = (Class) params[0];
            System.out.println(entityClass.getName());
        }
}

这是第3种方法,可以获取到泛型类的Class类和类名。这也是我接下来也会用到的一种方法。

原文地址:https://www.cnblogs.com/xhfcoding/p/7441798.html