弱弱的模仿Hibernate的session功能

   刚刚接触J2EE的时候 最初学的几个框架觉得最难懂就属Hibernate了
   Hibernate的核心思想-ormapping, javaeye上高手如云不由我在此说教了
   最近看老马讲的hibernate3.2 跟着他的思路写了一个模仿hibernate中session功能的小程序,刚刚跑起来的 代码还没来的及整理....
   首先建一个类封装好数据库连接---可鉴那篇 JDBC连接数据库 在里面加一个方法:
  

	/**
	 * insert
	 * @param value
	 * @param sql
	 * mv map里面的key 对应你要插入的值
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public int constructionSql(Map<Object, String> value, String sql)
			throws UnsupportedEncodingException {
		try {
			pstmt = conn.prepareStatement(sql);
			int i = 0;
			for (Object s : value.keySet()) {
				String mv = (String) value.get(s);
				System.out.println(s);
				if (mv.equals("string")) {
					pstmt.setString(i + 1, (String) s);
				}
				if (mv.equals("int")) {
					pstmt.setInt(i + 1, (Integer) s);
				}
				i++;
			}
			count = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println("constructionSql error");
		}
		return count;
	}
   


   然后创建类 这个类的主要是模仿实现session的一小部分功能
  
package com.test.db;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class SessionImitateHibernate<K> {
	/**数据库表名 在Hibernate里面是放在配置文件中 这里我们假设已经读到配置文件的信息*/
	private String tableName="lyvee";     
	/**动态构造出来的列名 */
	private String columnStr=""; 
	/**动态构造出来的value*/
	private String valuesStr="";  
	 /**key 对应存放column   value对应存放property*/	
	/**Map里面分别存放数据库中的字段名字、实体类的属性名字)*/
	private Map<String,String> cmp = new HashMap<String,String>();
	/**用于插入数据的sql语句*/
	private String insertSql="insert into"; 
	/**方法名*/
	public String[] methodName;                      	
	private Map value = new HashMap();
	private DataBase db;
	/** 构造方法  初始化*/
	public SessionImitateHibernate(){ 	               
		cmp.put("lname", "name");
		cmp.put("lpwd", "pwd");
		cmp.put("lsex", "sex");
		methodName = new String[cmp.size()];
	}
	/**
	 * 构造sql语句
	 * @param tableName
	 * @return
	 * @throws Exception
	 */
	//这里的tableName是个变量  完善点做的话方便我们利用反射得到类名=tableName
	public String createInsertSql(String tableName,Bean1 bean)throws Exception{
	/**循环变量*/
	int index=0;						
	for(String s :cmp.keySet()){
		String v = cmp.get(s);
		v ="get"+Character.toUpperCase(v.charAt(0))+v.substring(1);
		methodName[index]=v;
		/**SQL语句中的列名*/
		columnStr=s+","+columnStr;
		/**SQL语句中的values */
		valuesStr+="?,";				
		index++;
	}
	/**构造value的string*/
	valuesStr=valuesStr.substring(0,valuesStr.length()-1);
	/**构造key的string*/
	columnStr=columnStr.substring(0,columnStr.length()-1);  
	/**完整的isnert sql语句*/
	insertSql=insertSql+" "+tableName+"("+columnStr+")"+"values("+valuesStr+")"; 	
		System.out.println("methodName的长度是"+methodName.length);
		System.out.println("sql语句中key这一段的字符串"+columnStr);
		System.out.println("sql语句中value这一段的字符串"+methodName.length);
		System.out.println("整条sql语句是");
	for(int i=0;i<methodName.length;i++){
		 /**利用反射得到类 然后得到方法名*/
		Method method = bean.getClass().getMethod(methodName[i]);      
		// 为什么要得到方法名:因为我们在调用pstmt.setXXXX的时候 
		//需要知道是setInt 还是setString 这里只实现了String 和Int
		/**得到方法的返回类型 */
		Class c = method.getReturnType();								
		if(c.getName()==("java.lang.String")){
			/**利用反射得到这个方法具体的返回值*/
			String returnStringValue=(String) method.invoke(bean);
			/**把具体的返回值和返回类型放到一个map里面*/
			//这里只是用string来标识返回的是String
			value.put(returnStringValue,"string");						
		}if(c.getName()=="int"){				
			Integer returnIntValue =  (Integer) method.invoke(bean);	
			value.put(returnIntValue, "int");
		}
	}
	System.out.println(insertSql);
	System.out.println(value);
	return insertSql;	
	}
	public void save() throws Exception{
		Bean1 bean = new Bean1();
		bean.setSex("男");
		bean.setPwd("lyvee");
		bean.setName("谭亮");
		
		createInsertSql("lyvee",bean);
		db = new DataBase();
		db.constructionSql(value, insertSql);
	}
	public static void main(String[] args) throws Exception {
		SessionImitateHibernate h = new SessionImitateHibernate();
		h.save();
	}

}


   

你可能感兴趣的:(sql,C++,c,Hibernate,bean)