仿 hibernate 保存JAVABEAN (dbutils)

最近正好在看一下apache dbutils的源码,做了点多表查询返回JAVABEAN,与类似hibernate 保存JAVABEAN的封装。

插入部分代码如下:

//定义了几个静态常量

 private final static String insertSql = " insert into ";
 private final static String insertSql_Value = "values( ";
 private final static List arrayList = Collections
   .synchronizedList(new ArrayList());

 

//实现方法

 

/**
  * 这个方法主要将拼接出来的SQL执行
  * @param javabean
  */
 
 public static  void insertJavaBean(Object javaBean) {
       int count=0;
  StringBuilder bf = new StringBuilder();
  if (null == javaBean) {
   throw new RuntimeException("Bean 对像不能为空");
  }
  Connection conn=getConnection();
 
  try {
   conn.setAutoCommit(false);
  } catch (SQLException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  List l = iterator_BeanUtil(javaBean);

  for (Object object : l) {
   count++;
   Object[] sqlVal = ((Object[]) object);
   Stack sta = (Stack) sqlVal[0];
   Object[] sqlv = ((List) sqlVal[1]).toArray();

   for (int i = 0; i < sta.size(); i++) {
    Object sql = sta.get(i);
    bf.append(sql);
   }
    System.out.println(bf.toString());
    System.out.println(sqlv[0]);
    System.out.println(sqlv[1]);
  
   try {
    _g_runner.update(conn, bf.toString(), sqlv);
   } catch (Exception e) {
    try {
     conn.rollback();
    } catch (SQLException e1) {
     // TODO Auto-generated catch block
     e1.printStackTrace();
    }
    e.printStackTrace();
   }
   finally
   {
    bf.delete(0, bf.length());
    try {
     if(count==l.size())
    {
     conn.commit();
    }
    
    } catch (SQLException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  try {
   if(conn!=null)
   conn.close();
  
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  bf=null;
  l=null;
  arrayList.clear();
  
 }

 

 /**
 * 利用反射遍历JAVABEAN,回调嵌套bean
 * @param javaBean
 * @return  list
 */

 public static List iterator_BeanUtil(Object javaBean) {

  Field fields[] = javaBean.getClass().getDeclaredFields();
  List parm = new ArrayList();
  Object[] sqlValue = new Object[2];
  Stack list = get_SqlList(javaBean.getClass().getSimpleName());

  for (int i = 0; i < fields.length; i++) {
   Field field = fields[i];
   field.setAccessible(true);

   try {
    if (!"serialVersionUID".equals((field.getName()))) {

     parm.add((field.getAnnotation(JavaBean.class) != null ? field
       .get(javaBean) : BeanUtils.getProperty(javaBean,
       field.getName()))+"".trim());
     list.addElement("?");
     list.addElement(",");

    }

//JavaBean 是个注解类,标志field字段

    if (field.getAnnotation(JavaBean.class) != null) {
     try {
      iterator_BeanUtil(isValue_Bean(field, javaBean));      //回调,bean中嵌套了bean
     } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (InvocationTargetException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (NoSuchMethodException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   // }

  }
  if (",".equals(list.lastElement()))
   list.remove(list.lastIndexOf(","));
  list.addElement(")");
  sqlValue[0] = list;
  sqlValue[1] = parm;

  arrayList.add(sqlValue);
  return arrayList;
 }

 private static Object isValue_Bean(Field field, Object javaBean) {
  Object childJavaBean = null;
  try {
   childJavaBean = field.get(javaBean);
  } catch (IllegalArgumentException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IllegalAccessException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  if (childJavaBean == null) {
   throw new RuntimeException("发现JavaBean中有空对象值");
  }
  return childJavaBean;

 }

 private static Stack get_SqlList(Object javaBean) {
  Stack stk = new Stack();
  stk.addElement(insertSql);
  stk.addElement(" " + javaBean + " ");
  stk.addElement(insertSql_Value);
  return stk;

 }

//------------调用 设置如下两个JAVABEAN,对应的是两张表-------------------------------- 

 Tu_MobileNum mu=new  Tu_MobileNum();
  mu.setMOBILENUM("77777");
   Tu_M2 m2=new Tu_M2();
  m2.setID("111");
  m2.setNAME("小红");
        mu.setM2(m2);
  try {
  
   QueryHelper.insertJavaBean(mu);
   
  } catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }

 }

----------------------------输出日志-----------------------

 

 insert into  tu_m2 values( ?,?)
[111,小红]

 insert into  Tu_mobilenum values( ?,?)
[77777,111]


--------------------单表的话比较简单------------------------------------------

  Tu_M2 m2=new Tu_M2();
        m2.setID("222");
        m2.setNAME("小明");

QueryHelper.insertJavaBean(m2);

思路应该是正确的,就是反射与动态代理!


 




你可能感兴趣的:(Hibernate,仿,(dbutils),保存JAVABEAN)