java_lyvee 发表于 2013-2-5 02:42:00

弱弱的模仿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;}/** * 构造sql语句 * @param tableName * @return * @throws Exception *///这里的tableName是个变量完善点做的话方便我们利用反射得到类名=tableNamepublic 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=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);      // 为什么要得到方法名:因为我们在调用pstmt.setXXXX的时候 //需要知道是setInt 还是setString 这里只实现了String 和Int/**得到方法的返回类型 */Class c = method.getReturnType();if(c.getName()==("java.lang.String")){/**利用反射得到这个方法具体的返回值*/String returnStringValue=(String) method.invoke(bean);/**把具体的返回值和返回类型放到一个map里面*///这里只是用string来标识返回的是Stringvalue.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();}}
页: [1]
查看完整版本: 弱弱的模仿Hibernate的session功能