hibernate的原理及模拟

来源:互联网 发布:数据挖掘分析技术 编辑:程序博客网 时间:2024/04/30 07:00

 

//Session.java

package com.xie.hibernate.main;

 

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;

 

import com.xie.hibernate.modal.Student;

/**

 * 自己的session类,表名与modal与数据库表的字段对应可以配置在*.hbm.xml,通过xml解析得到,

 * 这儿直接给他们赋值。

 * 数据库连接驱动名,连接字符串,用户名,密码直接给出,在hibernate中,这些配置在hibernate.

 * cfg.xml

 * @author Administrator

 *

 */

public class Session {

   

    String tableName="student";//存放映射的表名,

    Map<String, String> cfs=new HashMap<String, String>();//存储modal和数据库表的映射字段

    String [] methodNames;//存放方法名,用于反射

    public Session(){

           cfs.put("id", "id");

           cfs.put("name", "name");

           cfs.put("age", "age");

           methodNames=new String[cfs.size()];

    }

 

    public void save(Student s) throws Exception{

 

       String sql=createSql();

       Class.forName("com.mysql.jdbc.Driver");

       Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/hibernate", "root", "centre");

       PreparedStatement ps=conn.prepareStatement(sql);

       /*

        * 设置ps中?的值

        */

       for (int i=0;i<methodNames.length;i++) {

           Method mName=s.getClass().getMethod(methodNames[i]);

           Class className=mName.getReturnType();

           if (className.getName().equals("java.lang.String")) {

              String returnValue=(String) mName.invoke(s);

              ps.setString(i+1, returnValue);

           }else if (className.getName().equals("int")) {

              Integer returnValue= (Integer) mName.invoke(s);

              ps.setInt(i+1, returnValue);

           }

       }

       System.out.println();

       ps.executeUpdate();

       ps.close();

       conn.close();

      

    }

    /**

     * @author centre

     * @return String 返回拼接好的sql语句

     */

    private String createSql() {

       String str1="";

       String str2="";

       int index=0;

       for (String s:cfs.keySet()) {

           String value=cfs.get(s);

           //得到映射所需的方法名字

           value=Character.toUpperCase(value.charAt(0))+value.substring(1);

           methodNames[index]="get"+value;

           str1+=s+",";

           index++;

       }

       str1=str1.substring(0, str1.length()-1);

       for (int i = 0; i <cfs.size(); i++) {

           str2+="?,";

       }

       str2=str2.substring(0, str2.length()-1);

       String sql="insert into "+tableName+" ("+str1+")"+" values ("+str2+")";

       return sql;

    }

 

}

 

//Student.java

package com.xie.hibernate.modal;

 

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;

           }

      

}

//TestHibernate.java

package com.xie.hibernate.main;

 

import com.xie.hibernate.modal.Student;

 

public class TestHibernate {

    public static void main(String[] args) throws Exception{

        Student s=new Student();

    s.setId(7);

    s.setName("admin");

    s.setAge(26);

    Session session=new Session();

    session.save(s);

    }

 

}