自己动手写ORM框架-java

Posted 狼王不乖s

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自己动手写ORM框架-java相关的知识,希望对你有一定的参考价值。

利用xml做配置文件,可以动态生成sql:

Java代码  
  1. package com.landray.kmss.util;  
  2.   
  3. import java.io.IOException;  
  4. import java.lang.reflect.InvocationTargetException;  
  5. import java.lang.reflect.Method;  
  6. import java.util.ArrayList;  
  7. import java.util.HashMap;  
  8. import java.util.Iterator;  
  9. import java.util.List;  
  10. import java.util.Map;  
  11. import java.util.Set;  
  12. import org.jdom.Document;  
  13. import org.jdom.Element;  
  14. import org.jdom.JDOMException;  
  15. import org.jdom.input.SAXBuilder;  
  16. import org.mira.lucene.analysis.c;  
  17. import org.springframework.jdbc.core.JdbcTemplate;  
  18. import com.landray.kmss.sys.transport.model.Exam;  
  19.   
  20. /** 
  21.  * createBy Zhang Yanan 
  22.  * 
  23.  * createTime 2012-6-14 下午03:53:19 
  24.  * 
  25.  * desc 类和表的映射工具 
  26.  * 
  27.  */  
  28. public class MappingUtil   
  29.     private JdbcTemplate jdbcTemplate;  
  30.     private JdbcTemplate jdbcTemplateAssist;  
  31.       
  32.     public MappingUtil(JdbcTemplate jdbcTemplate,JdbcTemplate Assist)  
  33.         this.jdbcTemplate = jdbcTemplate;  
  34.         this.jdbcTemplateAssist = jdbcTemplateAssist;  
  35.       
  36.       
  37.     public MappingUtil()  
  38.           
  39.       
  40.   
  41.     public JdbcTemplate getJdbcTemplate()   
  42.         return jdbcTemplate;  
  43.       
  44.   
  45.     public void setJdbcTemplate(JdbcTemplate jdbcTemplate)   
  46.         this.jdbcTemplate = jdbcTemplate;  
  47.       
  48.   
  49.     public JdbcTemplate getJdbcTemplateAssist()   
  50.         return jdbcTemplateAssist;  
  51.       
  52.   
  53.     public void setJdbcTemplateAssist(JdbcTemplate jdbcTemplateAssist)   
  54.         this.jdbcTemplateAssist = jdbcTemplateAssist;  
  55.       
  56.   
  57.     //从Object[] 转为Bean  
  58.     public Object fromObject2Bean(Class c ,Object[] o) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException  
  59.         Object ob = c.newInstance();  
  60.         Method[] f = c.getMethods();  
  61.         String path = this.getXmlFileName(c);  
  62.         Map map = this.readXml(path);  
  63.         for(int i=0;i<f.length;i++)  
  64.             Method method = f[i];  
  65.             String methodName = method.getName();  
  66.             if(methodName.startsWith("set"))  
  67.                 String fieldName = methodName.replace("set""");  
  68.                 String upChar = fieldName.charAt(0)+"";  
  69.                 fieldName=fieldName.replace(upChar,upChar.toLowerCase());  
  70.                 String order = (String)map.get(fieldName);  
  71.                 method.invoke(ob, o[Integer.valueOf(order)-1]);  
  72.               
  73.           
  74.         return ob;  
  75.       
  76.       
  77.     //获取class获取映射文件位置  
  78.     private String getXmlFileName(Class c)  
  79.         String path = "";  
  80.         String xml = c.getName().substring((c.getName().lastIndexOf("."))+1)+".xml";  
  81.         path = c.getResource(xml).toString();  
  82.         return path;  
  83.       
  84.       
  85.     //读取xml,把属性,顺序放入map  
  86.     private Map readXml(String path)  
  87.         Map map = new HashMap();  
  88.         SAXBuilder sb = new SAXBuilder();  
  89.         try   
  90.             Document myDocument = sb.build(path);  
  91.             Element root = myDocument.getRootElement();  
  92.             Element table = root.getChild("table");  
  93.             List<Element> list = table.getChildren("property");  
  94.             for(Element e:list)  
  95.                 String order = e.getAttributeValue("order");  
  96.                 String name = e.getAttributeValue("name");  
  97.                 map.put(name, order);  
  98.               
  99.          catch (JDOMException e)   
  100.             e.printStackTrace();  
  101.          catch (IOException e)   
  102.             e.printStackTrace();  
  103.           
  104.         return map;  
  105.       
  106.       
  107.     //读取xml,把属性名,表字段放入map  
  108.     private Map readXmlForsql(String path)  
  109.         Map map = new HashMap();  
  110.         SAXBuilder sb = new SAXBuilder();  
  111.         try   
  112.             Document myDocument = sb.build(path);  
  113.             if(myDocument==null)  
  114.                 throw new RuntimeException("请检查xml的路径");  
  115.               
  116.             Element root = myDocument.getRootElement();  
  117.             Element table = root.getChild("table");  
  118.             List<Element> list = table.getChildren("property");  
  119.             String tableName = table.getAttributeValue("name");  
  120.             map.put("table_name", tableName);  
  121.             for(Element e:list)  
  122.                 String column = e.getAttributeValue("column");  
  123.                 String name = e.getAttributeValue("name");  
  124.                 map.put(name, column);  
  125.               
  126.          catch (JDOMException e)   
  127.             e.printStackTrace();  
  128.          catch (IOException e)   
  129.             e.printStackTrace();  
  130.           
  131.         return map;  
  132.       
  133.       
  134.     //根据对象转换插入sql语句  
  135.     public String fromBean2InsertSql(Object o)  
  136.         StringBuilder sb = new StringBuilder();  
  137. //      System.out.println(o.getClass());  
  138.         String path = this.getXmlFileName(o.getClass());  
  139.         Map map = this.readXmlForsql(path);  
  140.         sb.append("insert into "+map.get("table_name"));  
  141.         map.remove("table_name");  
  142.         Set set = map.entrySet();  
  143.         Iterator it = set.iterator();  
  144.         StringBuilder columns = new StringBuilder();  
  145.         StringBuilder values = new StringBuilder();  
  146.         columns.append("(");  
  147.         values.append("(");  
  148.         while(it.hasNext())  
  149.             Map.Entry e = (Map.Entry)it.next();  
  150.             columns.append(e.getValue()+",");  
  151.             Object ob = this.getValueOfObject(o, e.getKey().toString());  
  152.             if(null == ob)  
  153.                 values.append("null,");  
  154.             else  
  155.                 values.append("'"+ob+"',");  
  156.               
  157.              
  158.         String cStr = columns.toString().substring(0, columns.toString().length()-1);  
  159.         String vStr = values.toString().substring(0,values.toString().length()-1);  
  160.         sb.append(cStr+")");  
  161.         sb.append(" values ");  
  162.         sb.append(vStr+")");  
  163.         return sb.toString();  
  164.       
  165.       
  166.     //根据属性名称获取对象该属性的值  
  167.     public Object getValueOfObject(Object ob,String field)  
  168.         Object o = new Object();  
  169.         String s = field.substring(0,1);  
  170.         String fieldNew = s.toUpperCase()+field.substring(1,field.length());  
  171.         String method = "get"+fieldNew;  
  172.         try   
  173.             try   
  174.                 Method m = ob.getClass().getMethod(method);  
  175.                 o = m.invoke(ob);  
  176.              catch (IllegalArgumentException e)   
  177.                 e.printStackTrace();  
  178.              catch (IllegalAccessException e)   
  179.                 e.printStackTrace();  
  180.              catch (InvocationTargetException e)   
  181.                 e.printStackTrace();  
  182. 自己动手写ORM的感受

    自己动手写ORM(02):Sql生成器实现

    自己写ORM框架 DBUtils_DG Java(C#的写在链接里)

    手把手教你写一个java的orm

    自己动手写一个简单的MVC框架(第二版)

    自己动手写Android数据库框架