Hibernate方法模拟

来源:互联网 发布:微软程序员年薪 编辑:程序博客网 时间:2024/06/05 08:46

package cn.itcast.hibernate;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class PoolUtils {
    
   private static DataSource source = new ComboPooledDataSource();

  

//返回连接池

   public static DataSource getSource(){
       return source;
   }

}




package cn.itcast.hibernate;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

public class Hibernate {

    public static <T> void save(T t) throws Exception{

       //获取class对象

        Class clazz = t.getClass();

      //获取类的不含包的名称

        String className = clazz.getSimpleName();

       

       //生成sql语句

        StringBuffer sb = new StringBuffer("insert into "+className+" values(");

        //获取类上的字段

          Field[] fs = clazz.getDeclaredFields();

         //获取字段的个数

          int len = fs.length;

         

        //根据字段的个数来确定问号的个数

          for(int i=0;i<len;i++){
              if(i!=len-1)
                  sb.append(" ?,");
              else
                  sb.append(" ?)");
          }

       

         //把StringBuffer类型变为String类型

          String sql = sb.toString();

         

          //获取参数个数来生成相同长度的数组

          Object[] params = new Object[len];

         

         //把参数加入到数组中

          for(int i=0;i<len;i++){

           //使用暴力访问

              fs[i].setAccessible(true);

          //获取参数的值根据字段其中返回的值为Object类型

              params[i]=fs[i].get(t);
          }
          
         /* Method[] ms = clazz.getDeclaredMethods();
          int i=0;
          for(Method m:ms){
              if(m.getReturnType()==void.class)
                  continue;
              params[i++]=m.invoke(t, null);
              System.out.println(params[i-1]);
          }*/
          
        //获取QueryRunner
        QueryRunner runner = new QueryRunner(PoolUtils.getSource());

       

       //执行语句

        runner.update(sql, params);
    }

   

  //此方法是动态的生成数据库中的表结构(此类只有int和string类型)

    public static void createTable(Class clazz) throws Exception{


     //拼接sql语句

        StringBuffer sb = new StringBuffer("create table "+clazz.getSimpleName() +"( ");
        Field[] fs = clazz.getDeclaredFields();
        
        for(int i=0;i<fs.length;i++){
            String fn = fs[i].getName();
            String type =fs[i].getType().getSimpleName();
            if(type.equals("int")||("Integer").equals(type)){
                if(i==0)
                sb.append(fn +" int primary key , ");
                else if(i==fs.length-1)
                sb.append(fn +" int );");
                else
                 sb.append(fn + " int , ");
            }
            if(type.equals("String"))
                if(i==fs.length-1)
                sb.append(fn +" varchar(225) );");
                else
                sb.append(fn +" varchar(225) , ");
        }
        System.out.println(sb);
        
        QueryRunner runner = new QueryRunner(PoolUtils.getSource());
        
        runner.update(sb.toString());
    }
}


0 0
原创粉丝点击