简易模拟Hibernate实现

下面程序主要实现的功能就是,主函数实例化一个对象,Session类仅仅调用其save(Student s)方法,即可将此数据插入到数据库中。

首先数据库database名称:jspdemo

数据库建表语句:

create table _student
( id int primary key,
  name varchar(20),
  age int 
);

用户实体类student.java

package com.lenovo.test;

public class Student {
	private int id;
	private String name;
	private int age;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
主测试函数:

package com.lenovo.test;

public class StudentTest {
	public static void main(String args [])throws Exception{
		Student stu = new Student();
		stu.setId(95001);
		stu.setName("易");
		stu.setAge(21);
		
		Session session = new Session();
		session.save(stu);
	}
}

其中重点的就是Session.java,代码如下:

package com.lenovo.test;

import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.util.HashMap;
import java.util.Map;

public class Session {
	private String tableName = "_student";
	private Map <String,String> cfs = new HashMap<String,String>();
	private String dbDriver = "org.gjt.mm.mysql.Driver";
	private String dbUrl = "jdbc:mysql://localhost:3306/jspdemo";
	private String dbUser = "root";
	private String dbPwd = "123456";
	private Connection conn = null;
	private PreparedStatement pstmt = null;
	private String []  methodNames; 

	public void save(Student stu) throws Exception{
		String sql = creteSQL();
		Class.forName(dbDriver);
		conn = DriverManager.getConnection(dbUrl, dbUser, dbPwd);
		pstmt = conn.prepareStatement(sql);
		for(int i=0;i<methodNames.length;i++){
			Method m = stu.getClass().getMethod(methodNames[i]);
			Class c = m.getReturnType();
			if(c.getName().equals("int")){
				Integer returnValue = (Integer)m.invoke(stu);
				pstmt.setInt(i+1,returnValue);
			}else if(c.getName().equals("java.lang.String")){
				String returnValue = (String)m.invoke(stu);
				pstmt.setString(i+1, returnValue);
			}
		}
		int i = pstmt.executeUpdate();
		System.out.println(i);
		pstmt.close();
		conn.close();
		
	}

	private String creteSQL() {
		String str1 = "";
		String str2 = "";
		int index = 0;
		//取得str1字符串和student类属性的get方法
		for(String s:cfs.keySet()){
			str1 = str1 + s + ",";
			String temp = cfs.get(s);
			methodNames [index++] = "get"+ Character.toUpperCase(temp.charAt(0))+temp.substring(1);
		}
		str1 = str1.substring(0,str1.length()-1);
			
		//取得str2字符串和所有的get方法
		for(int i=0;i<cfs.size();i++){
			str2 = str2 + "?,";
		}
		str2 = str2.substring(0,str2.length()-1);
		
		String sql = "insert into "+tableName+"("+str1+") values("+str2+")";
		return sql;
	}
	
	public Session(){
		cfs.put("_id","id");
		cfs.put("_name","name");
		cfs.put("_age","age");
		methodNames = new String [cfs.size()];
	}

}

这里需要说明的问题就是

1.createSQL()函数,这里主要实现的就是一个字符串的拼接。拼成如下所示:“insert into _student(_id,_name,_age) values(?,?,?)”要想达到这样的效果,就必须对相应的字符串进行相应的处理。字符串的拼接,大小写字符的装换,截取字符串等等。 当然这里还需要实现的一个功能就是,取得所有的get***()方法。

2.save(Student s)方法,这里主要实现的功能就是,第一数据库的连接,这里不再重复说明。第二就是取得PreparedStatement对象后,就有之后处理的语句,pstmt.set***(i,value)所以如何处理这样的代码?在这里用到了相应的反射控制。诸如,通过方法名,取得相应的方法,从而得到相应的返回值类型,以及执行此方法后所得到的返回结果等等。在这个函数中,我觉得这里才是最重要的一点吧。对于个中细节,也是值得好好揣摩的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值