自己动手写ORM框架-java

来源:互联网 发布:excel数据素材下载 编辑:程序博客网 时间:2024/04/28 08:46

利用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.             }  
  183.         } catch (SecurityException e) {  
  184.             e.printStackTrace();  
  185.         } catch (NoSuchMethodException e) {  
  186.             e.printStackTrace();  
  187.         }  
  188.         return o;  
  189.     }  
  190.       
  191.     //根据id和class生成删除sql  
  192.     public String getDeleteSql(Class c,String id){  
  193.         String path = this.getXmlFileName(c);  
  194.         Map map = this.readXmlForsql(path);  
  195.         String sql = "delete from "+map.get("table_name")+" where fd_id='"+id+"'";  
  196.         return sql;  
  197.     }  
  198.       
  199.     //根据对象生成更新sql  
  200.     public String getUpdateSql(Object o){  
  201.         StringBuilder sb = new StringBuilder();  
  202.         String path = this.getXmlFileName(o.getClass());  
  203.         Map map = this.readXmlForsql(path);  
  204.         sb.append("update "+map.get("table_name"));  
  205.         //把主键和表名移除,全剩属性  
  206.         map.remove("fdId");  
  207.         map.remove("table_name");  
  208.         Set set = map.entrySet();  
  209.         Iterator it = set.iterator();  
  210.         StringBuilder values = new StringBuilder();  
  211.         values.append(" set ");  
  212.         while(it.hasNext()){  
  213.             Map.Entry e = (Map.Entry)it.next();  
  214.             Object ob = this.getValueOfObject(o, e.getKey().toString());  
  215.             if(null == ob){  
  216.                 values.append(e.getValue()+"=null");  
  217.             }else{  
  218.                 values.append(e.getValue()+"='"+ob+"',");  
  219.             }  
  220.         }     
  221.         String vStr = values.toString().substring(0,values.toString().length()-1);  
  222.         sb.append(vStr);  
  223.         //主键地方需要改进  
  224.         sb.append(" where fd_id= '"+getValueOfObject(o,"fdId")+"'");  
  225.         return sb.toString();  
  226.     }  
  227.       
  228.     //把一个List<Object[]> 转为List<Bean>  
  229.     public List<?> getBeanListFromObjectArrList(List<Object[]> list, Class c ){  
  230.         List newList = new ArrayList ();  
  231.         for(Object[] o:list){  
  232.             try{  
  233.                 Object ob = this.fromObject2Bean(c, o);  
  234.                 newList.add(ob);  
  235.             }catch(Exception e){  
  236.                 e.printStackTrace();  
  237.             }  
  238.         }  
  239.         return newList;  
  240.     }  
  241.       
  242.     //根据对象生成查询sql  
  243.     public String getQuerySqlFromBean(Object o){  
  244.         StringBuilder sb = new StringBuilder();  
  245.         String path = this.getXmlFileName(c.class);  
  246.         Map map = this.readXmlForsql(path);  
  247.         sb.append("select * from "+map.get("table_name")+"  where 1 = 1");  
  248.         map.remove("table_name");  
  249.         map.remove("fdId");  
  250.         Set set = map.entrySet();  
  251.         sb.append(this.getFilterSql(set, o));  
  252.         return sb.toString();  
  253.     }  
  254.       
  255.     //生成过滤条件语句  
  256.     public String getFilterSql(Set set,Object o){  
  257.         StringBuilder sb = new StringBuilder();  
  258.         Iterator it = set.iterator();  
  259.         while(it.hasNext()){  
  260.             Map.Entry e = (Map.Entry)it.next();  
  261.             Object ob = this.getValueOfObject(o, e.getKey().toString());  
  262.             if(null != ob && !ob.toString().equals("")){  
  263.                 sb.append(" and "+e.getValue()+"='"+ob+"'");  
  264.             }  
  265.         }     
  266.         return sb.toString();  
  267.     }  
  268.       
  269.     //查询数目语句  
  270.     public String getCountSqlFromBean(Object o){  
  271.         StringBuilder sb = new StringBuilder();  
  272.         String path = this.getXmlFileName(c.class);  
  273.         Map map = this.readXmlForsql(path);  
  274.         sb.append("select count(0) from "+map.get("table_name")+"  where 1 = 1");  
  275.         map.remove("table_name");  
  276.         map.remove("fdId");  
  277.         Set set = map.entrySet();  
  278.         sb.append(this.getFilterSql(set, o));  
  279.         return sb.toString();  
  280.     }  
  281.       
  282.     //生成查询分页语句  
  283.     public String getQuerySqlFromBean(Object o,int pageNo,int pageSize){  
  284.         String sql = this.getQuerySqlFromBean(o);  
  285.         sql += " limit "+(pageNo-1)*pageSize+","+pageSize;  
  286.         return sql;  
  287.     }  
  288.       
  289.     //根据id和class返回对象  
  290.     public Object getBeanById(Class c,String id){  
  291.         String path = this.getXmlFileName(c);  
  292.         Map map = this.readXmlForsql(path);  
  293.         String table = map.get("table_name").toString();  
  294.         //此处主键需要改进  
  295.         String sql = "select * from "+table+" where fd_id='"+id+"'";  
  296.         List<Object[]> list = JdbcTemplateUtil.getObjectList(jdbcTemplateAssist, sql);  
  297.         Object[] o = list.get(0);  
  298.         Object ob = new Object();  
  299.         try{  
  300.             ob = this.fromObject2Bean(c, o);      
  301.         }catch(Exception e){  
  302.             e.printStackTrace();  
  303.         }  
  304.         return ob;  
  305.     }  
  306.       
  307.     //根据过滤条件生成查询sql  
  308.     public String getQuerySqlFromFilters(Class c,Map equilFilter,Map likeFilter){  
  309.         StringBuilder sb = new StringBuilder();  
  310.         String path = this.getXmlFileName(c);  
  311.         Map map = this.readXmlForsql(path);  
  312.         sb.append("select * from "+map.get("table_name")+"  where 1 = 1");  
  313.         sb.append(this.createrSqlByFilters(equilFilter, likeFilter));  
  314.         return sb.toString();  
  315.     }  
  316.       
  317.     //生成过滤条件的sql  
  318.     public String createrSqlByFilters(Map equilFilter,Map likeFilter){  
  319.         StringBuilder sb = new StringBuilder();  
  320.         Set eSet = equilFilter.entrySet();  
  321.         Iterator eIt = eSet.iterator();  
  322.         while(eIt.hasNext()){  
  323.             Map.Entry e = (Map.Entry)eIt.next();  
  324.             if(null != e.getValue() && !"".equals(e.getValue().toString())){  
  325.                 sb.append(" and "+e.getKey()+"='"+e.getValue()+"'");  
  326.             }  
  327.         }  
  328.         Set lSet = likeFilter.entrySet();  
  329.         Iterator lIt = lSet.iterator();  
  330.         while(lIt.hasNext()){  
  331.             Map.Entry e = (Map.Entry)lIt.next();  
  332.             if(null != e.getValue() && !"".equals(e.getValue().toString())){  
  333.                 sb.append(" and "+e.getKey()+" like '%"+e.getValue()+"%'");  
  334.             }  
  335.         }  
  336.         return sb.toString();  
  337.     }  
  338.       
  339.     //根据过滤条件生成分页  
  340.     public String getQuerySqlFromFilters(Class c,Map equilFilter,Map likeFilter,int pageNo,int pageSize){  
  341.         String sql = this.getQuerySqlFromFilters(c, equilFilter, likeFilter);  
  342.         sql += " limit "+(pageNo-1)*pageSize+","+pageSize;  
  343.         return sql;  
  344.     }  
  345.       
  346.     //根据过滤条件查询数目  
  347.     public String getCountSqlFromFilters(Class c,Map equilFilter,Map likeFilter){  
  348.         String path = this.getXmlFileName(c);  
  349.         Map map = this.readXmlForsql(path);  
  350.         StringBuilder sb = new StringBuilder();  
  351.         sb.append("select count(0) from "+map.get("table_name")+" where 1 = 1");  
  352.         sb.append(this.createrSqlByFilters(equilFilter, likeFilter));  
  353.         return sb.toString();  
  354.     }  
  355.       
  356.     /** 
  357.      * @param args 
  358.      * @throws IllegalAccessException  
  359.      * @throws InstantiationException  
  360.      * @throws InvocationTargetException  
  361.      * @throws IllegalArgumentException  
  362.      */  
  363.     public static void main(String[] args) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {  
  364.         MappingUtil u = new MappingUtil();  
  365.         Class c = Exam.class;  
  366.         Object[] o = new Object[4];  
  367.         o[0]="1";  
  368.         o[1]="2";  
  369.         o[2]="3";  
  370.         o[3]="4";  
  371.         u.fromObject2Bean(c, o);  
  372.         Exam e = new Exam();  
  373.         e.setFdAddress("地址");  
  374.         e.setFdId("1");  
  375.         e.setFdContent("备注");  
  376.         e.setFdTime("2012-06-14");  
  377.         System.out.println(u.fromBean2InsertSql(e));  
  378.         System.out.println(u.getUpdateSql(e));  
  379.         System.out.println(u.getDeleteSql(c, e.getFdId()));  
  380.     }  
  381.   
  382. }  

 Exam.xml

Java代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <root>  
  3. <table name="exam_info">  
  4. <property name="fdId" column="fd_id" order="1"/>  
  5. <property name="fdAddress" column="fd_address" order="2"/>  
  6. <property name="fdTime" column="fd_time" order ="3"/>  
  7. <property name="fdContent" column="fd_content" order="4"/>  
  8. <property name="fdOperatorId" column="fd_operator_id" order="5"/>  
  9. <property name="fdOparatorName" column="fd_operator_name" order="6"/>  
  10. <property name="fdCreateTime" column="fd_create_time" order="7"/>  
  11. <property name="fdAlterTime" column="fd_alter_time" order="8"/>  
  12. <property name="fdIsAbandon" column="fd_is_abandon" order="9"/>  
  13. <property name="fdName" column="fd_name" order="10"/>  
  14. </table>  
  15. </root>  

 

Exam.java

Java代码  收藏代码
  1. package com.landray.kmss.sys.transport.model;  
  2.   
  3.   
  4. public class Exam {  
  5.     private String fdId;  
  6.     private String fdAddress;  
  7.     private String fdTime;  
  8.     private String fdContent;  
  9.     private String fdOperatorId;  
  10.     private String fdOparatorName;  
  11.     private String fdCreateTime;  
  12.     private String fdAlterTime;  
  13.     private String fdIsAbandon;  
  14.     private String fdName;  
  15.     public String getFdName() {  
  16.         return fdName;  
  17.     }  
  18.     public void setFdName(String fdName) {  
  19.         this.fdName = fdName;  
  20.     }  
  21.     public String getFdId() {  
  22.         return fdId;  
  23.     }  
  24.     public void setFdId(String fdId) {  
  25.         this.fdId = fdId;  
  26.     }  
  27.     public String getFdAddress() {  
  28.         return fdAddress;  
  29.     }  
  30.     public void setFdAddress(String fdAddress) {  
  31.         this.fdAddress = fdAddress;  
  32.     }  
  33.     public String getFdTime() {  
  34.         return fdTime;  
  35.     }  
  36.     public void setFdTime(String fdTime) {  
  37.         this.fdTime = fdTime;  
  38.     }  
  39.     public String getFdContent() {  
  40.         return fdContent;  
  41.     }  
  42.     public void setFdContent(String fdContent) {  
  43.         this.fdContent = fdContent;  
  44.     }  
  45.     public String getFdOperatorId() {  
  46.         return fdOperatorId;  
  47.     }  
  48.     public void setFdOperatorId(String fdOperatorId) {  
  49.         this.fdOperatorId = fdOperatorId;  
  50.     }  
  51.     public String getFdOparatorName() {  
  52.         return fdOparatorName;  
  53.     }  
  54.     public void setFdOparatorName(String fdOparatorName) {  
  55.         this.fdOparatorName = fdOparatorName;  
  56.     }  
  57.     public String getFdCreateTime() {  
  58.         return fdCreateTime;  
  59.     }  
  60.     public void setFdCreateTime(String fdCreateTime) {  
  61.         this.fdCreateTime = fdCreateTime;  
  62.     }  
  63.     public String getFdIsAbandon() {  
  64.         return fdIsAbandon;  
  65.     }  
  66.     public void setFdIsAbandon(String fdIsAbandon) {  
  67.         this.fdIsAbandon = fdIsAbandon;  
  68.     }  
  69.     public String getFdAlterTime() {  
  70.         return fdAlterTime;  
  71.     }  
  72.     public void setFdAlterTime(String fdAlterTime) {  
  73.         this.fdAlterTime = fdAlterTime;  
  74.     }  
  75.       
  76.       
  77. }  

 该表的sql

Java代码  收藏代码
  1. /* 
  2. Navicat MySQL Data Transfer 
  3.  
  4. Source Server         :  
  5. Source Server Version : 50145 
  6. Source Host           :  
  7. Source Database       : china 
  8. Target Server Type    : MYSQL 
  9. Target Server Version : 50145 
  10. File Encoding         : 65001 
  11.  
  12. Date: 2012-06-16 16:48:20 
  13. */  
  14.   
  15. SET FOREIGN_KEY_CHECKS=0;  
  16. -- ----------------------------  
  17. -- Table structure for `exam_info`  
  18. -- ----------------------------  
  19. DROP TABLE IF EXISTS `exam_info`;  
  20. CREATE TABLE `exam_info` (  
  21.   `fd_id` varchar(36) NOT NULL DEFAULT '',  
  22.   `fd_address` varchar(100) DEFAULT NULL,  
  23.   `fd_time` varchar(100) DEFAULT NULL,  
  24.   `fd_content` varchar(500) DEFAULT NULL,  
  25.   `fd_operator_id` varchar(36) DEFAULT NULL,  
  26.   `fd_operator_name` varchar(50) DEFAULT NULL,  
  27.   `fd_create_time` varchar(20) DEFAULT NULL,  
  28.   `fd_alter_time` varchar(20) DEFAULT NULL,  
  29.   `fd_is_abandon` varchar(5) DEFAULT NULL,  
  30.   `fd_name` varchar(50) DEFAULT NULL,  
  31.   PRIMARY KEY (`fd_id`)  
  32. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  
  33.   
  34. -- ----------------------------  
  35. -- Records of exam_info  
  36. -- ----------------------------  
  37. INSERT INTO `exam_info` VALUES ('137ef3d1a4d9b4c5d88591a43a78ccc7''天津第一高级中学''2012-03-30 09:00:00''考试说明''12f67c5cfba228b501b8f464308b5cd5''培训主管''2012-06-15 04:23:22''2012-06-15 04:46:22''0''2012第一季度考试');  
  38. INSERT INTO `exam_info` VALUES ('137ef531c4680441617a0dd4741ba97c''第一实验小学''2012-06-30 16:46:00''22''12f67c5cfba228b501b8f464308b5cd5''培训主管''2012-06-15 04:47:10''2012-06-15 04:47:14''0''天津第二季度考试');  
  39. INSERT INTO `exam_info` VALUES ('137f3f66306e18d3d79ba7f46c69efa8''天津第一高级中学''2012-09-29 14:23:00''''12f67c5cfba228b501b8f464308b5cd5''培训主管''2012-06-16 02:23:59''2012-06-16 02:23:59''0''2012第三季度考试');  
  40. INSERT INTO `exam_info` VALUES ('137f3f7df45447143f7130148fba42ad''天津实验小学''2012-12-16 14:25:00''''12f67c5cfba228b501b8f464308b5cd5''培训主管''2012-06-16 02:25:37''2012-06-16 02:25:37''0''2012天津第四季度');  

 目前只支持String类型的.......

0 0
原创粉丝点击