最近在研究数据库,想自己写一个orm框架:
第一步:写一个函数,实现把java对象写入到数据库中:
情景引入:
数据库中有一个表,是用来保存用户信息的,有四个字段
用户名name
用户id
用户性别sex
用户年龄age,如下图所示:
这四个字段有可能是用户注册的时候,经过网页提交表单获得的,需要在后台处理一下,一般这种情况,都是先封装成一个user对象,然后再写jdbc代码来写入到数据库里面的。
也就是说,需要有一个user对象,来保存网页表单提交上来的信息
一个数据库表格,对应一个对象,现在要做的是,随便给一个对象,能够把这个对象保存的信息,写入到数据库中:
//插入数据
//我们想实现的是,任意一个对象,都可以用这个函数进行插入数据库的操作
//所以,这里函数的形参采用object类型
public static boolean insertObj(Object obj){
Connection cnn=DBUtils.getConnection();//获取数据库的链接
Class cls=obj.getClass();
//类名就是表名,所以在建表和建类的时候,要注意,类名和表名一致,类的属性和表的字段一致
String TableNmae=cls.getSimpleName();//获取类名
//拼接sql
StringBuffer sql=new StringBuffer();
sql.append("insert into ");
sql.append(TableNmae);
sql.append("(");
String FieldName=null;
Field[] objFields=cls.getDeclaredFields();
//===========通过反射获取属性名============
//为什么要通过反射来获取类名?
**//因为我们希望这个 insertObj()是一个通用的函数,你不论传user对象,还是person对象,我都可以用这个函数来实现数据插入的操作**
所以这里传入的对象不能写死,如果形参写成user类,那么这个函数就只能插入user类的对象了,
//既然形参不能写死,那么就不能用user.name或者user.getName()的方式获取对象的属性
//所以,要想在程序执行的过程中,传入任意一个对象,都能获取他的属性,只有反射能做到
for (int i = 0; i < objFields.length; i++) {
FieldName=objFields[i].getName();//获取属性名
sql.append(FieldName);//把属性名加入到sql语句中
if(i<objFields.length-1)
sql.append(",");
}
sql.append(")values(");
//============通过反射获取属性值=================
for (int i = 0; i < objFields.length; i++) {
try {
objFields[i].setAccessible(true);
Object FieldValue=objFields[i].get(obj);//获取属性值
objFields[i].setAccessible(false);
//因为如果是字符串的话,要在左右加上单引号,所以要判断FieldValue的类型
if(objFields[i].getType().getSimpleName().equals("String")) {
FieldValue="'"+FieldValue+"'";
}
sql.append(FieldValue);//把属性值加入到sql语句中
if(i<objFields.length-1)
sql.append(",");
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
sql.append(");");//加上最后的括号和分号,sql语句拼接成功
//====================创建数据库操作对象=============
Statement stat=null;
try {
stat=cnn.createStatement();
stat.execute(sql.toString());//因为sql目前还是一个StringBuilder对象,所以要转换成字符串
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtils.close(stat);//关闭链接释放资源
DBUtils.close(cnn);
}
return true;
}
测试一下能不能用:
public class demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
User user=new User();
user.setName("jack");
user.setAge(12);user.setSex("boy");
user.setId(12345);
boolean flag= DBUtils.insertObj(user);
System.out.println(flag);
}
}