Hibernate是對JDBC的輕量級對象封裝,讀取配置文件得到實體類與數據表之間的對應關係,然後使用Java反射機制得到相應的類和屬性值,並拼接成SQL語句,進行數據庫的操作。下面就簡單模擬Hibernate的實現。
1. Student實體類
public class Student {
private String id;
private String name;
private int age;
public String getId() {
return id;
}
public void setId(String 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;
}
}
2.模擬Hibernate的Session
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 {
String tableName="Student";
Map<String,String> cfs=new HashMap<String,String>();
String[] methodNames;
public Session(){
//簡單假設從配置文件中讀取的實體類與數據表的對應信息
cfs.put("_id", "id");
cfs.put("_name", "name");
cfs.put("_age", "age");
methodNames=new String[cfs.size()];
}
//利用反射機制,用get方法獲取相應數據值,再使用ps的set方法進行?的設置
public void save(Student s) throws Exception{
String sql=createSQL();
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","user","pwd");
PreparedStatement ps=conn.prepareStatement(sql);
for(int i=0;i<methodNames.length;i++){
//反射機制,獲取get方法
Method m=s.getClass().getMethod(methodNames[i]);
Class r=m.getReturnType();
//根據get方法的返回值類型,判斷是setString還是setInt或是其他
if(r.getName().equals("java.lang.String")){
//調用get方法,獲得屬性值
String returnValue=(String)m.invoke(s);
//設置sql語句中的?
ps.setString(i+1, returnValue);
}
if(r.getName().equals("int")){
Integer returnValue=(Integer)m.invoke(s);
ps.setInt(i+1, returnValue);
}
}
ps.executeUpdate();
ps.close();
conn.close();
}
//根據配置文件拼出一條sql語句
private String createSQL() {
String str1="";
String str2="";
int index=0;
for(String s:cfs.keySet()){
str1+=cfs.get(s)+",";
String keyValue=cfs.get(s);
String v=Character.toUpperCase(keyValue.charAt(0))+keyValue.substring(1);
methodNames[index]="get"+v;//將方法名稱存入數組
index++;
}
str1=str1.substring(0,str1.length()-1);
for(int i=0;i<cfs.size();i++){
str2+="?,";
}
str2=str2.substring(0,str2.length()-1);
System.out.println(str2);
//拼接SQL語句
String sql="insert into "+tableName+ " ("+str1+") values ("+str2+")";
System.out.println(sql);
return sql;
}
}
3.測試
public class StudentTest {
public static void main(String[] args) throws Exception {
Student s=new Student();
s.setId("6");
s.setName("Bonn");
s.setAge(23);
Session session=new Session();
session.save(s);
}
}