在砺锋暑假班做电信计费系统的时候,由于要写一大堆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{ protected String keyname=""; DataSource ds; private Class entityClass; public BaseDAO(){ Type genType = getClass().getGenericSuperclass(); Type[] params = ((ParameterizedType)genType).getActualTypeArguments(); entityClass = (Class) params[0]; System.out.println(entityClass.getName()); } }
这是第3种方法,可以获取到泛型类的Class类和类名。这也是我接下来也会用到的一种方法。