疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

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);    
    }
}