Hibernate:模擬Hibernate實現

       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);    
    }
}
發佈了40 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章