hibernate的原理及模拟

本文介绍了一种自定义实现Hibernate Session的方式,通过手动创建Session类并实现保存对象到数据库的功能。该实现涉及反射机制和SQL语句的动态构建。

 

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

    }

 

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值