手写orm框架(1)

最近在研究数据库,想自己写一个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);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值